ショートコードがポストHTMLのどこにあるかに関わらず、他のコンテンツの後にギャラリーショートコードを実行する方法は?
ありがとう。
これは防弾ではありませんが、ほとんどの場合、完璧に動作するはずです。
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
にフックされ、さらに独自のコンテンツを追加する可能性のあるフィルタが実行されます。これはキャプチャされたギャラリーを追加し、プロパティをリセットし、投稿内容を返します。