web-dev-qa-db-ja.com

コンテンツの後に下部にギャラリーを表示

ショートコードがポストHTMLのどこにあるかに関わらず、他のコンテンツの後にギャラリーショートコードを実行する方法は?

ありがとう。

1
Vincent

これは防弾ではありませんが、ほとんどの場合、完璧に動作するはずです。

class WPSE_105676_Gallery_First {
    private static $_gallery = '',
                   $_handler;

    public static function gallery( $attr ) {
        self::$_gallery .= is_callable( self::$_handler ) ? call_user_func( self::$_handler, $attr ) : '';
        return '';
    }

    public static function content( $text ) {
        $text .= self::$_gallery;
        self::$_gallery = '';
        return $text;
    }

    public static function startup() {
        if ( ! isset( self::$_handler ) ) {
            if ( empty( $GLOBALS['shortcode_tags']['gallery'] ) || ! self::$_handler = $GLOBALS['shortcode_tags']['gallery'] )
                self::$_handler = 'gallery_shortcode';

            add_shortcode( 'gallery', array( __class__, 'gallery' ) );
        }

        add_filter( 'the_content', array( __class__, 'content' ), 1000 );
    }
}

add_action( 'init', array( 'WPSE_105676_Gallery_First', 'startup' ), 100 );

素人の言葉で言うと、startup()ではgalleryの現在のショートコードハンドラを保存し(デフォルトをオーバーライドするプラグインやテーマでも動作するはずです)、それから独自のgallery()メソッドに置き換えます。これが、ギャラリーを「キャプチャ」して空の文字列を返す場所であるため、ショートコードが存在する場所には表示されなくなります。

すべてのショートコードが解析された後に実行されるように、低優先順位のフィルタでout content()メソッドがthe_contentにフックされ、さ​​らに独自のコンテンツを追加する可能性のあるフィルタが実行されます。これはキャプチャされたギャラリーを追加し、プロパティをリセットし、投稿内容を返します。

0
TheDeadMedic