แบ่งเนื้อหาและคลังภาพ


22

มีวิธีแยกเนื้อหาโพสต์และรหัสย่อของคลังภาพหรือไม่ ฉันต้องการแสดงแกลเลอรีนอกเนื้อหาปกติของฉันไม่ว่าจะวางไว้ที่ใดหรืออย่างไร ฉันสามารถใช้สิ่งนี้เพื่อรับรหัสย่อของตัวเอง:

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

แต่วิธีนี้ใช้ไม่ได้หากรหัสย่อของแกลเลอรีไม่ใช่อินสแตนซ์แรก มีวิธีแยกเนื้อหาและแกลเลอรีของฉันออกอย่างสมบูรณ์หรือไม่


แก้ไข:ฉันมีวิธีแก้ปัญหาแบบกึ่ง แต่ดูเหมือนว่าเป็นวิธีที่ยืดยาวเพื่อไปเกี่ยวกับมัน มันคว้ารหัสย่อตัวแรกในโพสต์ (ซึ่งจะต้องแก้ไขเนื่องจากฉันต้องการเพียงรหัสย่อ "คลังภาพ") จากนั้นลบรหัสย่อทั้งหมดออกจากเนื้อหา (อีกครั้งไม่ใช่สิ่งที่ฉันต้องการทำจริงๆ

<?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; ?>

แก้ไข # 2 - ตกลงฉันสามารถรับรหัสย่อของแกลเลอรีในโพสต์ได้เท่านั้น ฉันได้เพิ่มตัวกรองเพื่อลบแบบฟอร์มรหัสย่อของคลังภาพthe_content()- ปัญหาคือมันไม่จำเป็นต้องลบรหัสย่อเนื่องจากมันโพสต์ แต่ไม่อนุญาตให้ฉันเรียกใช้ "do_shortcode ()"

Functions.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); 

วง

<?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>

ใน The Loop มันจะส่งคืนรหัสสั้น ๆ ของฉันสองครั้ง (ฉันอยู่ในหน้าเดียวควรวนซ้ำสองครั้ง - ดังนั้นมันจะไม่ทำงาน do_shortcode ()) ไม่แน่ใจว่าทำไม


1
คุณได้พิจารณาเพิ่มกล่องเมตา WYSYWIG แยกต่างหากสำหรับแกลเลอรีแล้วหรือยัง จากนั้นคุณสามารถเรียกสิ่งนั้นได้เสมอหลังจากthe_content()นั้น หลอกลวงได้ถ้ามีหลายหน้าเช่นนี้อยู่แล้ว
GhostToast

ฉันยอมรับว่าเป็นไปได้ แต่ฉันพยายามหลีกเลี่ยงความต้องการของบรรณาธิการใหญ่อีกคน - พยายามทำให้มันง่ายและตรงไปตรงมาที่สุด ฉันหวังว่าฉันจะทำได้ (โดยไม่ต้องใช้ปลั๊กอิน) เพียงแค่เพิ่มแกลเลอรี metabox หรืออะไรที่คล้ายกัน
Howdy_McGee

คำตอบ:


24

เปิดสำหรับทุกคนที่สามารถทำให้สิ่งนี้ง่ายขึ้น แต่นี่คือสิ่งที่ฉันคิดว่าเหมาะกับฉัน

สิ่งแรกคือรับแกลเลอรีใช้get_post_gallery()ทันทีที่วงเริ่ม:

<?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() ฟังก์ชั่น - functions.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;
}

แหล่งข้อมูล:

Stackoverflow:

สิ่งที่ฉันไปจากเดิมซึ่งไม่ทำงานตามที่คาดไว้:


4

รหัสย่อหลักของนิพจน์ปกติ

โดยทั่วไปเราสามารถทำเช่นนั้นกับ Regex - จริงแม้จะมี Regex get_shortcode_regex()ให้โดยหลักโดย

ก่อนอื่นเราต้องคว้าแท็กรหัสย่อและสร้าง regex ฟังก์ชั่นหลักget_shortcode_regex()เศร้ามีโอกาสที่จะโยนในการโต้แย้งใด ๆ ดังนั้นเราจึงต้องการจะทิ้งให้อยู่กับ regex ที่ตรงกับแต่ละคนและทุกรหัสซึ่งเป็นที่ไม่พึงประสงค์ในขณะที่เราเพียง แต่ต้องการที่จะกำหนดเป้าหมาย[gallery]รหัส

// 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'] )
) );

จับแกลเลอรี่ทั้งหมด

ต่อไปเราจะต้องใช้ Regex ที่รวบรวมแกลเลอรี่ทั้งหมด ดังนั้นเราจึงเรียกpreg_match_all()มันว่ามันจะส่งคืนการแข่งขันทั้งหมดสำหรับรหัสย่อแกลเลอรี่เป็นอาร์เรย์ที่มี0ดัชนี (ส่วนที่เหลือจะตรงกับบางส่วนและสามารถละเว้น)

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

ตอนนี้$galleries[0]มีแท็กรหัสย่อของแกลเลอรีมากมาย

เนื้อหาที่ไม่มีแกลเลอรี่

สิ่งต่อไปคือเราต้องทำคือการลบรหัส[gallery]ย่อทั้งหมดออกจากเนื้อหา เราจะใช้ Regex get_the_content()เดียวกันอีกครั้งและเรียกใช้งานบน แน่นอนว่าเราใช้the_contentตัวกรองเนื่องจากสามารถเพิ่มรหัสย่อผ่านการโทรกลับในเวลาแสดงผล

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

$contentตัวแปรตอนนี้ถือเนื้อหาของเรา

ตัวอย่างการโทรกลับเพื่อแก้ไขเนื้อหา

หรือ: คุณสามารถแบ่งเนื้อหาออกเป็นแกลเลอรีและส่วนที่เหลือของโพสต์ได้อย่างไร

เราสามารถแทนที่เนื้อหาด้วยเนื้อหาใหม่ของเราได้อย่างง่ายดายในระหว่างการติดต่อกลับ:

$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() )
);

ซึ่งจะเพิ่มแกลเลอรี่ทั้งหมดก่อนจากนั้นเพิ่มเนื้อหาของเราโดยไม่มีแกลเลอรีซึ่งทั้งคู่คั่นด้วยกฎแนวนอน นี่เป็นเพียงจุดเริ่มต้น


โดยใช้วิธีการที่แตกต่างกันเช่นในwordpress.stackexchange.com/questions/193511/... เมื่อฉันลองรหัสของคุณฉันพบข้อผิดพลาดของ php - คุณช่วยดูหน่อยได้ไหม?
Adeerlike

รหัสไหน ข้อผิดพลาดอะไร รายละเอียดโปรด นี่คือการพัฒนาไม่ได้คาดเดาเกม
ไกเซอร์

รายละเอียดรหัส adn ในลิงค์> wordpress.stackexchange.com/questions/193511/…
Adeerlike

2

ไม่ควรซับซ้อนจนเกินไป โค้ดด้านล่างสามารถย่อให้เหลือสองบรรทัดได้ตามต้องการ

วิธีการ 1. รับเนื้อหาโพสต์ที่สะอาดโดยลบรหัสย่อทั้งหมดรวมถึงแกลเลอรีหนึ่งจากเนื้อหาโพสต์

หมายเหตุ: รหัสย่ออื่น ๆ ทั้งหมดจะถูกลบออกจากโพสต์ หากคุณไม่ใส่รหัสย่อแบบกำหนดเองที่นั่นแสดงว่าแนวทางดังกล่าวเหมาะสำหรับคุณ

สมมติว่าคุณอยู่ในวงวน 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.

สมมติว่าคุณออกไปข้างนอก

$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);

วิธีที่ 2. ลบรหัส[gallery]ย่อเท่านั้นเก็บรหัสย่ออื่น ๆ ทั้งหมดไว้

อาศัยการรับรู้ภายในของวิธีการ[gallery]มองรหัสย่อซึ่งสามารถเปลี่ยนแปลงได้โดยทีม WP ดังนั้นอาจไม่ใช่ข้อพิสูจน์ในอนาคตตามแนวทางที่ 1:

ในการวนรอบ WP

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

ออกมาจากมัน

$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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.