固定ページ内のショートコードでショートコードを含む埋め込みウィジェットを機能させる方法

WordPressに於いてショートコードは使い出があり2015年3月12日に最終更新されているサイト WordPressの実 の記事のもある通り投稿ページや固定ページの記事内でPHPコードを実行させるべく下手にプラグインを用いるよりは 安心も出来るため頻繁に用いる処です。 固定ページにはPHPコードではなくショートコードを利用する!

処で今回固定ページの中ほどにウィジェットを表示させたい要請がありました。 元来ブログシステムはオンラインで記事編集出来るのが旨味であり 其の延長線上にあるのが通常はサイドバーなどに表示させるウィジェットです。 然るにウィジェット上の編集を固定ページや投稿ページの中ほどに反映させたい要請も必然です。 此処でウィジェットに記述された内容をコピー&ペーストすれば宜しいではないか、 という解決法が先ず想起されますが今回此の方法の採用はなりません。 なんとなれば中ほどに表示させたいウィジェットにもショートコードが用いられていたからです。 ウィジェットの記述をそのままコピー&ペーストすればショートコードが実行されないで ソースコードが其の儘出力される結果となります。 此れを避けるべく当該ショートコードに対応する処理をfunctions.phpに記述するのは 返って複雑化を招き難儀な状態となる処か、 利用者に取ってはブログシステムの旨味も享受出来なくなり本末転倒です。

スポンサーリンク

以上の要件にて先ずはWordPressの固定ページ上にショートコードを機能させるべく実装を試みたのですが functions.phpの記述に問題がある際例に依って画面が真っ白になる事態が出来し難儀さを予感させます。 此の件は結局関数名にハイフンを用いたのが原因となりWordPressが機能しなくなったので 各位注意されたくもあり当該情報は Webサイト専門プログラマの言いたい放題 の2015年10月12日配信の以下ページに 演算子のマイナス記号とプログラム実行エンジンからは判別が難しく避けるべき とのヒントがありましたので直ぐにも解決出来ました。

【jQueryの変数名 ハイフンの代わりにアンダースコアを使おう】

さて固定ページ内にウィジェットを表示させるのは上手くなりましたが 次は此の表示されたウィジェット内のショートコードを機能させなければなりません。 ウィジェット内のウィジェット、謂わば子ウィジェットを機能させるコード名を child-widget で表現して其れを其の儘funcitons.php内の現在表示されている謂わば親ウィジェットを parent-widget と表現すれば以下のコードの如く峻別出来ますので その上でコードを記述に追加してみます。

// 親ウィジェット
dynamic_sidebar( 'parent_widget' );
// 子ウィジェット
dynamic_sidebar( 'child_widget' );

// ウィジェット内ショートコード実行想定コード
add_shortcode( 'shortcode_in_shortcode', 'parent_widget' );
function shortcode_in_shortcode( ) {
   if ( is_active_sidebar( 'child__widget' ) ) {
      dynamic_sidebar( 'child__widget' );
   }
}

処が此のコードでは出力が想定外のものとなる問題が発生します。 子ウィジェット表示の一行は考えてみれば勿論ショートコード記述位置では実行されず 当該コードのファイルの冒頭、若しくはPHPのルールに従った位置で実行されてしまうのでした。 困ってネットを繰ってみてもなかなか都合良く dynamic_sidebar を固定ページ内で実行させるショートコード実装例などが見つかりません。

結論から言えば此れを記述位置で実行させるにはPHPのバッファリン命令 ob_start() で処理すれば想定通り記述位置で表示してくれます。 ヒントとなったのはサイト 寝ログ の2015年5月6日の記事でした。

コピペ一発!Wordpress本文中にウィジェットでアドセンス挿入するカスタマイズ方法

参考サイトのサンプルコードでは 本文中ウィジェットの実行出力結果をバッファリングして返り値としています。 此の如くすれば返り値は唯のHTMLテキストですので 想定通りの位置で出力されるという塩梅です。 最後に以上知見から得た手元の最終的な実装の概念部分を記しておきます。

// 最終的なウィジェット内ショートコード実行コード
add_shortcode( 'shortcode_in_shortcode', 'parent_widget' );
function shortcode_in_shortcode( $atts, $content = '' ) {
   $content = "";
   if ( is_active_sidebar( 'child__widget' ) ) {
      ob_start();
      dynamic_sidebar( 'child__widget' );
      $content = ob_get_clean();
   }
   return $content;
}