コンテンツとギャラリーの分割


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 -OK、投稿でギャラリーショートコードしか取得できませんでした。ギャラリーショートコードフォームを削除するためのフィルターも追加しました。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では、短いコードを2回返します(私は1ページにあり、2回ループする必要があります-そのため、do_shortcode()を実行しません)。理由はわかりません。


1
ギャラリー専用のWYSYWIGメタボックスを追加することを検討しましたか?その後、いつでもそれを呼び出すことができthe_content()ます。ただし、このようなページが既に多数ある場合は、より注意が必要です。
ゴーストトースト

私はそれが可能性であることに同意しますが、私は別の大きなエディターの必要性を避けようとしていました-それを可能な限りシンプルで率直にしようとしています。(もちろんプラグインがなくても)ギャラリーメタボックスの追加などがあればいいのにと思います。
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;
}

リソース:

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

私が元々行っていたもので、期待通りに機能しませんでした:


4

コアショートコードの正規表現

基本的には、正規表現を使用してそれを行うことができます-実際には、コアによって提供される正規表現を使用してもget_shortcode_regex()

まず、ショートコードタグを取得して正規表現を作成する必要があります。get_shortcode_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'] )
) );

すべてのギャラリーをキャッチ

次に、すべてのギャラリーをキャッチする正規表現が必要です。したがってpreg_match_all()、ギャラリーショートコードのすべての一致を0インデックス付きの配列として返すため、呼び出しています(残りは部分一致であり、無視できます)。

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

$galleries[0]ギャラリーショートタグの配列を保持しています。

ギャラリーのないコンテンツ

次に[gallery]、コンテンツからすべてのショートコードを削除する必要があります。同じ正規表現を再度使用して実行し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エラーが発生します。ご覧ください。
アデリアライク

どのコードですか?どんなエラー?詳細をお願いします。これは開発であり、ゲームを推測するものではありません。
カイザー


2

すっごく複雑になるべきではありません。以下のコードは、必要に応じて数行に短縮できます。

アプローチ1.投稿コンテンツからギャラリー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.