Chia nội dung và thư viện


22

Có cách nào để phân chia nội dung bài đăng và bộ sưu tập mã ngắn. Tôi muốn hiển thị thư viện bên ngoài nội dung thông thường của mình cho dù nó được đặt ở đâu và như thế nào. Tôi có thể sử dụng điều này để có được shortcode chính nó:

if(has_shortcode(get_the_content(), 'gallery')){
    $pattern = get_shortcode_regex(); 
    preg_match("/$pattern/s", get_the_content(), $matches);
    echo do_shortcode($matches[0]);
}

Nhưng điều này không hoạt động nếu mã ngắn của thư viện không phải là phiên bản đầu tiên. Có cách nào để phân chia hoàn toàn nội dung và bộ sưu tập của tôi không?


Chỉnh sửa: Tôi có một giải pháp bán nhưng có vẻ như là một cách dài để đi về nó. Đầu tiên, nó lấy mã ngắn đầu tiên trong bài đăng (cần phải sửa vì tôi chỉ muốn mã ngắn "Thư viện") sau đó xóa tất cả các mã ngắn khỏi nội dung (một lần nữa, không thực sự là điều tôi muốn làm.

<?php if(has_shortcode(get_the_content(), 'gallery')) : ?>
    <?php 
        $pattern = get_shortcode_regex(); 
        preg_match("/$pattern/s", get_the_content(), $matches);
    ?>
    <div id="content">
        <?php echo strip_shortcodes(get_the_content()); ?>
    </div>
    <div id="gallery">
        <?php echo do_shortcode($matches[0]); ?>
    </div>
<?php endif; ?>

Chỉnh sửa # 2 - Ok, tôi chỉ có thể nhận được các đoạn mã thư viện trong bài viết. Tôi cũng đã thêm một bộ lọc để xóa biểu mẫu shortcode của thư viện the_content()- vấn đề là nó không nhất thiết phải xóa shortcode vì nó đã đăng nó, nhưng nó không cho phép tôi chạy "do_shortcode ()"

Hàm.php

function remove_gallery($content) {
    global $post;

    if($post->post_type == 'artcpt')
        remove_shortcode('gallery', $content);

    return $content;
}
add_filter( 'the_content', 'remove_gallery', 6); 

Vòng lặp

<?php preg_match('/\[gallery ids=[^\]]+\]/', get_the_content(), $matches); ?>
<div id="content">
    <?php the_content(); ?>
</div>
<div id="gallery">
    <?php echo do_shortcode($matches[0]); ?>
</div>

trong Vòng lặp, nó sẽ trả về mã ngắn của tôi Twice (tôi đang ở trên một trang, nên được lặp hai lần - để nó không chạy do_shortcode ()). Không chắc chắn lý do tại sao.


1
Bạn đã xem xét việc thêm một hộp meta WYSYWIG riêng cho phòng trưng bày chưa? Sau đó bạn luôn có thể gọi cho điều đó sau the_content(). Trickier nếu đã có nhiều trang như thế này, tuy nhiên.
GhostToast

Tôi đồng ý rằng đó là một khả năng, nhưng tôi đã cố gắng tránh sự cần thiết của một biên tập viên lớn khác - cố gắng làm cho nó đơn giản và thẳng tiến nhất có thể. Tôi ước tôi có thể (không có plugin tất nhiên) chỉ cần có thêm một bộ sưu tập metabox hoặc một cái gì đó tương tự.
Howdy_McGee

Tại sao bạn không sử dụng giải pháp từ Sử dụng preg numplace để tách bộ sưu tập khỏi the_content?
fuxia

Câu trả lời:


24

Dành cho bất kỳ ai có thể đơn giản hóa việc này nhưng đây là những gì tôi nghĩ ra với nó.

Điều đầu tiên - hãy lấy thư viện, sử dụng get_post_gallery(), ngay khi vòng lặp bắt đầu:

<?php if( have_posts() ) : ?>

    <?php while( have_posts() ) :
            the_post();
            $gallery = get_post_gallery();
            $content = strip_shortcode_gallery( get_the_content() );
    ?>

        <div id="content">
            <?php echo $content; ?>
        </div> <!-- id="content" -->

        <div id="gallery">
            <?php echo $gallery; ?>
        </div> <!-- id="gallery" -->

    <?php endwhile; ?>

<?php endif; ?>

strip_shortcode_gallery() Hàm - Hàm.php

function strip_shortcode_gallery( $content ) {
    preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER );

    if ( ! empty( $matches ) ) {
        foreach ( $matches as $shortcode ) {
            if ( 'gallery' === $shortcode[2] ) {
                $pos = strpos( $content, $shortcode[0] );
                if( false !== $pos ) {
                    return substr_replace( $content, '', $pos, strlen( $shortcode[0] ) );
                }
            }
        }
    }

    return $content;
}

Tài nguyên:

Luồng xếp chồng:

Những gì tôi đã ban đầu đi ra, mà không làm việc như mong đợi:


4

Core shortcode Biểu thức chính quy

Về cơ bản chúng ta có thể làm điều đó với một Regex - thực sự ngay cả với Regex được cung cấp bởi lõi bởi get_shortcode_regex().

Đầu tiên chúng ta cần lấy các thẻ shortcode và xây dựng một regex. Đáng get_shortcode_regex()buồn là chức năng cốt lõi không có cơ hội đưa ra một cuộc tranh luận vì vậy chúng ta sẽ bị bỏ lại một biểu thức chính phù hợp với từng mã ngắn, điều không mong muốn vì chúng ta chỉ muốn nhắm mục tiêu vào [gallery]mã ngắn.

// Get all tags as Array
$tags = $GLOBALS['shortcode_tags'];
// remove the gallery-shortcode; 'gallery' is the key
unset( $tags['gallery'] );
// retrieve all shortcodes (but not 'gallery') separated by a vertical pipe char/the "or" Regex char
$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );

Bắt tất cả các phòng trưng bày

Tiếp theo chúng ta cần một Regex bắt tất cả các phòng trưng bày. Do đó, chúng tôi đang gọi preg_match_all()vì nó sẽ trả về tất cả các trận đấu cho shortcode bộ sưu tập dưới dạng mảng với một 0chỉ mục (phần còn lại sẽ là một phần khớp và có thể bỏ qua).

$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );

Bây giờ $galleries[0]giữ một loạt các thẻ shortcode bộ sưu tập.

Nội dung không có phòng trưng bày

Điều tiếp theo là chúng ta cần làm là loại bỏ tất cả các đoạn [gallery]mã ngắn khỏi nội dung. Chúng tôi sẽ sử dụng cùng một Regex một lần nữa và chạy nó get_the_content(). Tất nhiên, chúng tôi áp dụng the_contentbộ lọc vì shortcode có thể đã được thêm thông qua một cuộc gọi lại vào thời gian kết xuất.

$content = preg_replace_callback(
    "/$pattern/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

Các $contentbiến bây giờ giữ nội dung của chúng tôi.

Ví dụ gọi lại để thay đổi nội dung

hoặc: Làm thế nào bạn có thể chia nội dung thành các phòng trưng bày và phần còn lại của bài

Chúng tôi có thể dễ dàng thay thế nội dung bằng nội dung mới của chúng tôi trong cuộc gọi lại:

$tags = $GLOBALS['shortcode_tags'];
unset( $tags['gallery'] );

$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );
$pattern = get_shortcode_regex();

preg_match_all( "/{$pattern}/s", get_the_content(), $galleries );

echo $galleries;
echo "<hr>";
echo preg_replace_callback(
    "/{$pattern}/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

đầu tiên sẽ thêm tất cả các phòng trưng bày, sau đó thêm nội dung của chúng tôi mà không có phòng trưng bày, cả hai được phân tách bằng quy tắc ngang. Đây chỉ là một điểm khởi đầu.


sử dụng một cách tiếp cận khác như trong wordpress.stackexchange.com/questions/193511/ ,. Khi tôi thử mã của mình, tôi gặp lỗi php - bạn có thể xem qua được không?
Adeerlike 04/07/2015

Mã nào? Lỗi gì? Chi tiết, xin vui lòng. Đây là sự phát triển, không phải trò chơi đoán.
kaiser

mã chi tiết adn trong liên kết> wordpress.stackexchange.com/questions/193511/NH
Adeerlike

2

Nó không nên quá phức tạp. Mã dưới đây có thể được rút ngắn xuống một vài dòng theo ý muốn.

Cách tiếp cận 1. Nhận nội dung bài đăng sạch bằng cách xóa tất cả các mã ngắn, bao gồm cả thư viện từ nội dung bài đăng.

NB: tất cả các mã ngắn khác sẽ bị xóa khỏi bài viết. Nếu bạn không đặt mã ngắn tùy chỉnh ở đó, thì cách tiếp cận là dành cho bạn.

Giả sử bạn đang ở trong vòng lặp WP

$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // This is your cleaned content
$glry = get_post_gallery(); // and here is the gallery.

Giả sử bạn ra ngoài

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',strip_shortcodes($my_post->post_content));
$glry = get_post_gallery($my_postid);

Cách tiếp cận 2. Chỉ xóa [gallery]mã ngắn, giữ tất cả các mã ngắn khác.

Dựa vào việc thực hiện nội bộ về hình dạng của [gallery]shortcode, có thể được thay đổi bởi nhóm WP, vì vậy có thể không phải là bằng chứng trong tương lai như cách tiếp cận thứ nhất:

Trong vòng lặp WP

$ctt = preg_replace('/\[gallery.*\]/', '', get_the_content());
$ctt = apply_filters('the_content',$ctt); // This is your cleaned content
$glry = get_post_gallery();

Ra khỏi nó

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',preg_replace('/\[gallery.*\]/', '', $my_post->post_content));
$glry = get_post_gallery($my_postid);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.