Pisahkan Konten dan Galeri

22

Apakah ada cara untuk membagi konten posting dan kode pendek galeri. Saya ingin menampilkan galeri di luar konten normal saya, tidak peduli bagaimana atau di mana ditempatkan. Saya bisa menggunakan ini untuk mendapatkan kode pendek itu sendiri:

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

Tapi ini tidak berfungsi jika kode pendek galeri bukan yang pertama. Apakah ada cara untuk membagi konten dan galeri saya sepenuhnya?


Sunting: Saya memiliki semi-solusi tetapi sepertinya cara yang panjang untuk menyelesaikannya. Pertama-tama mengambil kode pendek pertama di pos (yang perlu diperbaiki karena saya hanya ingin kode pendek "Galeri") kemudian menghapus semua kode pendek dari konten (sekali lagi, tidak benar-benar apa yang ingin saya lakukan.

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

Sunting # 2 - Ok, saya hanya bisa mendapatkan kode singkat galeri di pos. Saya juga menambahkan filter untuk menghapus formulir shortcode galeri the_content()- masalahnya adalah tidak perlu menghapus shortcode sejak posting, tetapi tidak memungkinkan saya untuk menjalankan "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); 

Putaran

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

di Loop itu akan mengembalikan kode pendek saya Dua kali (saya berada di satu halaman, harus dilingkarkan dua kali - sehingga tidak menjalankan do_shortcode ()). Tidak yakin kenapa.

Howdy_McGee
sumber
1
Sudahkah Anda mempertimbangkan untuk menambahkan kotak meta WYSYWIG terpisah hanya untuk galeri? Anda kemudian dapat selalu menelepon untuk itu setelah itu the_content(). Lebih rumit jika sudah ada banyak halaman seperti ini.
GhostToast
Saya setuju bahwa itu adalah suatu kemungkinan, tetapi saya berusaha menghindari kebutuhan editor besar lainnya - berusaha membuatnya sesederhana dan semaju mungkin. Saya berharap saya bisa (tanpa plugin tentu saja) hanya memiliki metabox add gallery atau yang serupa.
Howdy_McGee
Mengapa Anda tidak menggunakan solusi dari Menggunakan preg_replace untuk memisahkan galeri dari the_content?
fuxia

Jawaban:

24

Terbuka untuk siapa saja yang dapat menyederhanakan ini tetapi inilah yang saya temukan yang bekerja untuk saya.

Hal pertama yang pertama - dapatkan galeri, gunakan get_post_gallery(), segera setelah loop dimulai:

<?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() Function - 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;
}

Sumber:

Stackoverflow:

Apa yang awalnya saya lakukan, yang tidak bekerja seperti yang diharapkan:

Howdy_McGee
sumber
4

Kode pendek inti Ekspresi Reguler

Pada dasarnya kita bisa melakukan itu dengan Regex - sebenarnya bahkan dengan Regex yang disediakan oleh core oleh get_shortcode_regex().

Pertama, kita perlu mengambil tag kode pendek dan membangun regex. Fungsi inti get_shortcode_regex()sayangnya tidak menawarkan kesempatan untuk melemparkan argumen sehingga kami akan dibiarkan dengan regex yang cocok dengan masing-masing dan setiap kode pendek, yang tidak diinginkan karena kami hanya ingin menargetkan [gallery]kode pendek.

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

Tangkap semua galeri

Selanjutnya kita membutuhkan Regex yang menangkap semua galeri. Karena itu kami memanggil preg_match_all()karena akan mengembalikan semua Cocok untuk kode singkat galeri sebagai array dengan 0indeks (sisanya akan cocok sebagian dan dapat diabaikan).

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

Sekarang $galleries[0]memegang array tag kode pendek galeri.

Konten tanpa galeri

Hal berikutnya yang perlu kita lakukan adalah menghapus semua [gallery]shortcode dari konten. Kami akan menggunakan Regex yang sama lagi dan menjalankannya get_the_content(). Tentu saja kami menerapkan the_contentfilter karena kode pendek dapat ditambahkan melalui panggilan balik pada waktu render.

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

The $contentvariabel sekarang memegang konten kami.

Contoh panggilan balik untuk mengubah konten

atau: Bagaimana Anda dapat membagi konten menjadi galeri dan sisa posting

Kami dapat dengan mudah mengganti konten dengan konten baru kami selama panggilan balik:

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

yang pertama akan menambahkan semua galeri, lalu menambahkan konten kami tanpa galeri, keduanya dipisahkan oleh aturan horizontal. Ini hanyalah titik awal.

kaisar
sumber
menggunakan pendekatan yang berbeda seperti di wordpress.stackexchange.com/questions/193511/… . ketika saya mencoba kode Anda saya mendapatkan kesalahan php - bisakah Anda melihatnya?
Seperti adeer
Kode yang mana? Kesalahan apa? Tolong detail. Ini pengembangan, bukan game tebak-tebakan.
kaiser
kode dan detail di tautan> wordpress.stackexchange.com/questions/193511/…
Adeerlike
2

Seharusnya tidak terlalu rumit. Kode di bawah ini dapat disingkat menjadi beberapa baris sesuai keinginan.

Pendekatan 1. Dapatkan konten kiriman yang bersih dengan menghapus semua kode pendek, termasuk galeri dari konten kiriman.

NB: semua shortcode lainnya akan dihapus dari pos. Jika Anda tidak menempatkan kode pendek khusus di sana, maka pendekatannya adalah untuk Anda.

Asumsikan Anda berada di loop 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.

Asumsikan Anda keluar

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

Pendekatan 2. Hapus hanya [gallery]kode pendek, simpan semua kode pendek lainnya.

Bergantung pada realisasi internal dari bagaimana [gallery]shortcode terlihat, yang dapat diubah oleh tim WP, jadi mungkin bukan bukti di masa depan seperti pendekatan pertama:

Dalam loop WP

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

Keluar dari situ

$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);
bob-12345
sumber