2026年6月23日

2026年6月23日

WordPressのテキストウィジェットでショートコードを実行させる設定方法

現在のWordPressでは、テキストウィジェットに書いたショートコードは追加の設定なしで実行されます(WordPress 4.9以降)。ブロックベースのウィジェット画面を使っている場合は「ショートコード」ブロックに書くのが確実な方法です。この記事では、いま使っているウィジェット画面に合わせた書き方と、それでもショートコードが文字のまま表示されるときの原因の切り分けを解説します。

昔の解説記事でよく見かける add_filter( 'widget_text', 'do_shortcode' ); は、古いバージョン向けの設定です。現在は基本的に不要で、残っていても多くの場合は害がありませんが、原因調査のときに混乱のもとになるので、意味を理解したうえで扱ってください。

まず確認:どのウィジェット画面を使っているか

WordPress 5.8以降、「外観」→「ウィジェット」はブロックエディターと同じ操作感の画面になりました。クラシックテーマでも、Classic Widgets プラグインを入れている場合やテーマが旧画面を有効にしている場合を除き、こちらの画面が表示されます。ブロックテーマでは「ウィジェット」メニュー自体がなく、サイトエディターでテンプレートやパターンを編集します。

画面によって、ショートコードを書く場所が変わります。

  • ブロックベースのウィジェット画面:「ショートコード」ブロックを追加して書く
  • 旧ウィジェット画面(Classic Widgets 使用時など):「テキスト」ウィジェットに書く
  • ブロックテーマ:サイトエディターで、テンプレートやテンプレートパーツに「ショートコード」ブロックを置く

方法1:ショートコードブロックを使う(ブロックベースの画面)

ウィジェットエリアの「+」から「ショートコード」ブロックを探して追加し、[my_shortcode id="10"] のように入力して更新します。ショートコードブロックは中身をそのまま出力時に実行するため、段落ブロックに書くより意図どおりに動きやすく、編集者にも「ここはショートコードだ」と分かりやすいのが利点です。

段落ブロックに書いたショートコードも、ウィジェットエリアの出力時に処理される場合がありますが、自動整形の影響でHTMLが崩れることもあります。特に、ショートコードが表やフォームのようなブロック要素を出す場合は、ショートコードブロックを選ぶほうが安全です。

旧画面で作ったテキストウィジェットは、ブロックベースの画面では「レガシーウィジェット」として表示され、そのまま中のショートコードも実行されます。

方法2:テキストウィジェットに書く(旧画面)

旧ウィジェット画面では、「テキスト」ウィジェットをウィジェットエリアに追加し、本文にショートコードを書いて保存します。WordPress 4.9以降は、テキストウィジェットの出力時にショートコードが処理されます。

テキストウィジェットには「ビジュアル」と「テキスト」のタブがあります。ショートコードの属性を書くときは、引用符が全角や飾り引用符(“ ”)になっていないか注意してください。日本語入力のまま ” を打ってしまうと、属性が正しく読み取られません。HTMLを多く含む場合は、「カスタムHTML」ウィジェットのほうが自動整形の影響を受けにくい場面もあります。カスタムHTMLウィジェットでのショートコードの扱いはバージョンや環境で差が出ることがあるので、使う前に実際の表示で確認してください。

古い設定 add_filter('widget_text', 'do_shortcode') について

WordPress 4.8以前は、テキストウィジェットでショートコードが実行されなかったため、テーマの functions.php に次の1行を足すのが定番でした。

<?php
// 古いバージョン向けの設定(現在は基本的に不要)
add_filter( 'widget_text', 'do_shortcode' );

4.9以降のテキストウィジェットは、自動整形(段落の付与)の後にショートコードを処理する仕組みをコアに持っています。そのうえで、上の古い設定が見つかった場合はビジュアルモードのテキストウィジェットで二重に処理されないよう配慮されています。つまり、現在のバージョンでこの行を新たに追加する理由はほぼありません。既存のテーマやプラグインに残っていても、すぐに不具合になるわけではありませんが、整理するなら子テーマ側に書かれたものから外し、表示を確認してください。

ショートコードが文字のまま表示されるときの原因と確認方法

[my_shortcode] がそのまま画面に出る場合、WordPressはそのショートコード名を知らない状態です。可能性の高い順に確認します。

1. ショートコードを登録しているプラグインが無効になっている

ショートコードは、それを add_shortcode() で登録しているプラグインやテーマが読み込まれて初めて動きます。プラグインを停止した、テーマを変えた、といった直後に起きやすい症状です。「プラグイン」画面で該当プラグインが有効かを確認します。

2. ショートコード名のつづりが違う

ショートコード名は登録時の名前と一致している必要があります。プラグインの説明ページにある記述をコピーして貼り直すのが確実な確かめ方です。ハイフンを含む名前は、似た名前のショートコードと衝突することがあるため、プラグイン側の説明も確認してください。

3. 登録が条件付きになっている

自作のショートコードで、add_shortcode() を is_singular() などの条件の中や、wp アクション以降の遅いタイミングで呼んでいると、ウィジェットの描画時には登録されていないことがあります。登録は init アクションで、条件を付けずに行うのが基本です。

<?php
add_action( 'init', function () {
    add_shortcode( 'my_notice', 'my_notice_shortcode' );
} );

function my_notice_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'text' => 'お知らせ',
    ), $atts, 'my_notice' );
    return '<p class="my-notice">' . esc_html( $atts['text'] ) . '</p>';
}

4. キャッシュに古い表示が残っている

ページキャッシュやCDNを使っていると、修正後も古いHTMLが表示されることがあります。キャッシュを削除するか、ログアウトした状態の別ブラウザーで確認します。

実行はされるが表示がおかしいとき

ショートコードは処理されているのに、位置や見た目がおかしい場合は、ショートコード側の作りが原因であることが多いです。

  • ウィジェットの外(ページ上部など)に出てしまう:ショートコード関数が echo で出力しています。ショートコードは文字列を return する決まりで、自作の場合は ob_start() と ob_get_clean() で出力をまとめて返すように直します。
  • **余分な <p> や <br> が入る**:テキストウィジェットの自動整形の影響です。ショートコードブロックかカスタムHTMLウィジェットに移すと改善することがあります。
  • 投稿に関する情報が取れない:テキストウィジェットは、アーカイブページなどでグローバルの $post を空にした状態でショートコードを実行する場合があります。ウィジェットで使うショートコードは、表示中の投稿に依存しない作りにするか、get_queried_object() などで対象を明示的に取得するのが安全です。

セキュリティ上の注意

ウィジェットを編集できるのは、通常「外観」を操作できる権限(edit_theme_options)を持つユーザーです。それでも、ショートコードの属性は利用者の入力として扱い、自作する場合は shortcode_atts() で既定値を決め、出力時に esc_html() や esc_url() でエスケープしてください。外部のスクリプトを読み込むショートコードを使う場合は、提供元が信頼でき、更新が続いているかも確認します。

ここで紹介した画面の名称やブロックの名前は、WordPressのバージョンによって変わることがあります(2026年10月現在)。表示が異なる場合は、目的(ショートコードを置く、ウィジェットを編集する)に合う項目を探してください。

まとめ

  • WordPress 4.9以降、テキストウィジェットのショートコードは追加設定なしで実行される
  • ブロックベースのウィジェット画面やブロックテーマでは「ショートコード」ブロックを使うのが確実
  • add_filter( 'widget_text', 'do_shortcode' ) は古いバージョン向けで、現在は基本的に不要
  • 文字のまま表示されるなら、プラグインの有効化、つづり、登録タイミング、キャッシュの順に確認する
  • 自作ショートコードは init で登録し、return で返し、出力をエスケープする

お気軽にご相談ください

お見積りへ お問い合わせへ
▲