İçeriği ve Galerisi Böl


22

Mesaj içeriğini ve galeri kısa kodunu ayırmanın bir yolu var mı. Galeriyi nasıl veya nereye yerleştirildiğine bakılmaksızın normal içeriğimin dışında görüntülemek istiyorum. Kısa kodun kendisini almak için bunu kullanabilirim:

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

Ancak galeri kısa kodu ilk örnek değilse, bu işe yaramaz. İçeriğimi ve galerimi tamamen bölmenin bir yolu var mı?


Düzenleme: Bir yarı çözüm var ama bu gitmek için uzun soluksuz bir yol gibi görünüyor. İlk önce postadaki ilk kısa kodu alır (yalnızca "Galeri" kısa kodunu istediğimden beri düzeltilmesi gereken), ardından tüm kısa kodları içerikten kaldırır (yine de gerçekten yapmak istediklerimi değil).

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

Düzenleme # 2 - Tamam, yayında yalnızca galeri kısa kodlarını bulabildim. Ayrıca galeri kısa kod formunu kaldırmak için bir filtre ekledim the_content()- sorun, gönderdiği için kısa kodun kaldırılması gerekmediği, ancak "do_shortcode ()" çalıştırmama izin vermemesi değil

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

Döngü

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

Döngü içinde iki kez kısa kodumu döndürecek (tek bir sayfadayım, iki kez döndürülmem gerekiyor - bu yüzden do_shortcode () çalışmıyor). Emin değilim neden.


1
Sadece galeri için ayrı bir WYSYWIG meta kutusu eklemeyi düşündünüz mü? Sonra her zaman bunun için arayabilirsin the_content(). Bununla birlikte, zaten böyle birçok sayfa varsa daha zor.
GhostToast

Bunun bir olasılık olduğu konusunda hemfikirim ama başka bir büyük editörün ihtiyacından kaçınmaya çalışıyordum - mümkün olduğunca basit ve anlaşılır hale getirmeye çalışıyorum. Keşke (elbette bir eklenti olmadan) bir galeri meta kutusu veya benzeri bir şeyler ekleyebilseydim.
Howdy_McGee

Yanıtlar:


24

Bunu basitleştirebilecek herkese açık ama işte benim için işe yarayanlar geldi.

İlk şey ilk - get_post_gallery()döngü başlar başlamaz , kullanarak galeriyi alın :

<?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() İşlev - 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;
}

Kaynaklar:

StackOverflow'daki:

Başlangıçta neler yaptığımı, beklendiği gibi çalışmadığını:


4

Çekirdek kısa kod Düzenli İfadeler

Temel olarak bunu bir Regex ile yapabiliriz - aslında çekirdek tarafından sağlanan Regex ile bile get_shortcode_regex().

Öncelikle shortcode etiketlerini alıp bir regex oluşturmamız gerekiyor. Çekirdek işlevi get_shortcode_regex()ne yazık ki bir argüman atma şansı sunmuyor, bu yüzden her bir kısa kodla eşleşen bir regex ile kaldık, bu da yalnızca kısa [gallery]kodu hedeflemek istediğimiz için istenmiyor .

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

Tüm galerileri yakala

Sonra tüm galerileri yakalayan bir Regex'e ihtiyacımız var. Bu nedenle preg_match_all(), galeri kısa kodunun tüm Maçlarını 0indeksli bir dizi olarak döndüreceği için çağırıyoruz (gerisi kısmi eşleşecek ve yoksayılabilir).

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

Şimdi $galleries[0]bir dizi galeri kısa kod etiketine sahip.

Galeri içermeyen içerik

Bir sonraki şey, yapmamız gereken [gallery]içerikten tüm kısa kodları kaldırmak . Aynı Regex'i tekrar kullanıp çalıştıracağız get_the_content(). Tabii ki, the_contentfiltreyi oluşturma zamanında bir geri çağırma yoluyla eklenmiş olabileceğinden uyguladık .

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

$contentDeğişken şimdi bizim içeriğini bulundurur.

İçeriği değiştirmek için örnek geri arama

veya: İçeriği galerilere ve gönderinin geri kalanına nasıl bölebilirsiniz?

Geri arama sırasında içeriği kolayca yeni içeriğimizle kolayca değiştirebiliriz:

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

önce tüm galerileri ekler, sonra içeriğimizi galeriler olmadan ekler, her ikisi de yatay bir kuralla ayrılır. Bu sadece bir başlangıç ​​noktasıdır.


wordpress.stackexchange.com/questions/193511/… 'de olduğu gibi farklı bir yaklaşım kullanarak . kodunuzu denediğimde php hatası alıyorum - lütfen bir göz atar mısınız?
Adeerlike,

Hangi kod Hangi hatalar? Detay lütfen. Bu gelişme, oyunların tahmin edilmesi değil.
kaiser


2

Sooo karmaşık olmamalıdır. Aşağıdaki kod istek üzerine birkaç satıra kısaltılabilir.

Yaklaşım 1. Galeri içeriği de dahil olmak üzere tüm kısa kodları yazı içeriğinden kaldırarak temiz yazı içeriğini alın.

Not: diğer tüm kısa kodlar posta kutusundan kaldırılacaktır. Özel kısa kodları oraya yerleştirmezseniz, yaklaşım tam size göre.

WP döngüsünde olduğunuzu varsayalım

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

Dışarıda olduğunuzu varsayalım

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

Yaklaşım 2. Sadece kısa [gallery]kodları kaldırın , tüm diğer kısa kodları içeride tutun.

[gallery]WP ekibi tarafından değiştirilebilecek kısa kodun nasıl göründüğünün içsel olarak gerçekleştirilmesine güvenir , bu nedenle belki de ilk yaklaşım olarak geleceğin kanıtı olmayabilir:

WP döngüsünde

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

Bunun dışında

$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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.