web-dev-qa-db-ja.com

コンテンツとギャラリーを分割する

投稿内容とギャラリーのショートコードを分割する方法はありますか。配置場所や場所に関係なく、ギャラリーを通常のコンテンツの外側に表示します。これを使ってショートコード自体を取得することができます。

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ではそれは私の短いコードを返すでしょう Twice (私は単一のページにいます、二度ループされるべきです - だからdo_shortcode()を実行していません)。理由がわからない。

22
Howdy_McGee

これを単純化できる人なら誰でも利用できますが、これが私にとって思い付いたことです。

まず最初に - ループが始まったらすぐに 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;
}

リソース:

スタックオーバーフロー:

私がもともと行っていたことは、期待通りには機能しませんでした。

24
Howdy_McGee

複雑すぎてはいけません。以下のコードは、ご希望に応じて数行に短縮することができます。

アプローチ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]ショートコードのみを削除し、他のすべてのショートコードはそのままにします。

WPチームによって変更される可能性があるので、[gallery]ショートコードがどのように見えるかについての内部的な認識に依存しています。

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