WordPressのショートコードの中でショートコードを実行し展開する

WordPressの使い方

WordPressのショートコードの中でショートコードを入れ子的に実行し展開する

この記事では「WordPressのショートコードの中でショートコードを入れ子的に実行し展開する方法」について解説します。

デフォルトのWordPressの設定では、投稿や固定ページの本文の中で使っているショートコードが展開されたあとの文字列に、さらにショートコードが含まれる場合はそのままショートコードの記述自体が出力されてしまいます。

せっかく便利なWordPressのショートコードなので、いろいろな場所で何度でも使えるようにしたいですよね!

サンプルソースコードを貼り付けてできるよう、ていねいに解説します。

この記事を監修・執筆した専門家

こんにちは!私は現役のエンジニアで、普段はWordPressの開発案件などをメインに担当しております。誰もが知っている月間数千万人が利用するサービスの開発をしたり、月間数百万人が訪問する規模のWordPressサイトの運営しております。WordPressを触らない日はありません。

そんな私がプロの目で解説していきます!

ショートコードの中でショートコードを「入れ子的に実行して展開する」とは?

では「ショートコードの中でショートコードを入れ子的に実行して展開する」とはどういったことなのでしょうか?

例えば、[shortcode_test1]というショートコードを使うと以下の文字列が展開されるとします。

[shortcode_test1]が出力した文字列の中にさらに[shortcode_test2]というショートコードが含まれていますが、このショートコードは実行されず、新たな文字列に変換されません。

もう一度ショートコードが実行されるようにするとこうなります。

WordPressのショートコードを入れ子的に実行するサンプルソースコード

まずはWordPressの投稿や固定ページの本文でショートコードの入れ子展開が実現できるサンプルを示します。

以下のサンプルソースをfunctions.phpに貼り付けます。

functions.phpについてよくわからない方は以下を参照してください。

functions.phpの場所、編集方法

functions.phpはWordPressの機能追加をするためのPHPファイルです。

functions.phpの場所は
「外観>テーマエディター」から

試用しているテーマ名を選んで、funcstions.phpを選びます。

また、直接functions.phpを編集するよりもこちらのプラグインで編集した方が便利なので参考にしてみてください。

functions.phpに貼り付けるサンプルソースコード


/*************************************************************
 * ショートコードの中でショートコードを実行する
 ************************************************************/

add_filter('the_content', function ($text){ //the_contentは投稿の本文

	if(
		is_single() //投稿ページのみ
		&& !is_admin() //管理画面は出さない
		&& $text != null //テキストが空でない
	){
		$text = do_shortcode($text); //テキスト中のショートコードを展開
		return $text;
	}
	
}, 9999999); // 11よりも大きければ本文のショートコード展開の後に実行される

たったこれだけで「WordPressの投稿や固定ページの本文でショートコードの入れ子展開」が実現できます。

WordPressのフィルターフック自体は奥が深いので、ここでは簡単に説明しておきます。

  • do_shortcodeは文字列の中のショートコードを実行展開する関数です。
  • add_filterはWordPressの各テキスト処理の途中に処理をカスタマイズできるコールバックを挿入できる関数です。挿入できる場所はフィルターフックと呼ばれ名前がつけられている場所です。
  • the_contentは記事の出力前というフィルターフックです。
  • $priorityは指定のフィルターフック内の優先順位で数字が小さいほど先に実行されます。デフォルトは10。本体のショートコード変換は11なので、通常は12でも十分だがプラグインやテーマによってもっと高い値が設定されていることもあるのでここでは十分に大きな値に設定しました。

【add_filter構文】

add_filter( $tag, $function_to_add, $priority, $accepted_args ) bool

WordPressのサイトの様々な箇所で入れ子的実行を実現する

サンプルは記事本文だけでしたが、the_contentの部分(フィルターフック名)を変更することで様々な場所のテキストを変換することができます。

フィルター名 説明
the_title 記事のタイトル
the_content 記事の内容
widget_title ウィジェットのタイトル
widget_text ウィジェットのテキスト
the_excerpt 抜粋のテキスト
comment_text コメントのテキスト

以上では主なものを取り上げましたが、WordPressにはその他さまざまなフィルターフックが存在します。

その他の条件の絞り込み

サンプルで使った条件以外にいろいろと使いたい場合は以下の判定用の関数を参考にしてみてください。自由度が無限に広がります。

関数名 説明 引数 返り値
is_single() 投稿・添付・カスタム投稿タイプの個別ページかどうか mixed $post →投稿のIDやスラッグ、またはその配列 bool
is_page() 固定ページかどうか mixed $page →ページのIDやスラッグ、またはその配列 bool
is_attachment() 添付ページかどうか mixed $attachment →添付ファイルのIDやスラッグ、またはその配列 bool
is_singular() is_single()・is_page()・is_attachment()のどれかかどうか mixed $post_types →カスタム投稿タイプ、またはその配列 bool
is_archive() アーカイブページであるかどうか
アーカイブとは投稿の一覧ページのこと。
(カテゴリ、タグ、作成者、日付、カスタム投稿タイプ、およびカスタム分類など)
なし bool
is_category() カテゴリーのアーカイブページかどうか
引数にカテゴリーIDやカテゴリースラッグを指定できる
配列で複数の指定も可能
mixed $category →カテゴリID、名前、スラッグ、またはその配列 bool
is_tag() タグのアーカイブページかどうか mixed $tag →カテゴリID、名前、スラッグ、またはその配列 bool
is_author() 投稿者別のアーカイブページであるとき
引数に投稿者IDや投稿者のニックネームを指定できる
配列で複数の指定も可能
$author →ユーザーID、ニックネーム、nicename、またはその配列 bool
is_date() 日付のアーカイブページかどうか bool
is_year() 年別のアーカイブページかどうか bool
is_month() 月別のアーカイブページかどうか bool
is_day() 日別のアーカイブページかどうか bool
is_search() 検索結果ページかどうか bool
is_404() 404ページかどうか bool
is_paged() 複数ページ構成の2ページ目以降かどうか bool
is_home() || is_front_page() トップページかどうか bool

引数の使い方としては、is_single()だと投稿全体ならtrue, is_single(123)だと投稿IDが123のページの時だけtrueといった具合になります。

終わりに

最後までお読みいただきありがとうございました!

以下にWordPressのショートコード関連の理解が深まる記事やフィルターフックの詳しいサンプルソースコードの記事を紹介します。
ぜひ読んで参考にしてみてください。

コメント

タイトルとURLをコピーしました