WordPressで特定の記事のときだけウィジェットエリアを削除する方法です。

テーマによってウィジェットエリアの有無や数や場所が異なりますので操作したいウィジェットエリアを特定することから始めます。

ウィジェットエリアの特定方法

…テーマによってそれぞれですが…

ソースを見て下記の文を抜き出してみる

register_sidebar

するとこんな感じになってるはず

/** サンプル */
register_sidebar( array(
        'name' => __( 'Widget Area', 'twentyfifteen' ),
        'id' => 'sidebar-1',
        'description' => __( 'Add widgets here to appear in your sidebar.', 'twentyfifteen' ),
        'before_widget' => '<aside id="%1$s" class="widget %2$s">',
        'after_widget' => '</aside>',
        'before_title' => '<h2 class="widget-title">',
        'after_title' => '</h2>',
    ) );

このとき ‘id’ として指定されているのがウィジェットエリアのIDっていうことになります。

サンプルの場合は 「sidebar-1」ですね。

HTMLを見る…

こちらを参考にしてください。

https://whitewood-hp.com/web-tips/archives/3376

ウィジェットエリアのIDがわかったらコードをfunctions.phpに記述する

これを覚えて下記のコードをテーマの functions.php またはそれに準ずる場所へ記述します。

// 特定投稿IDのとき ウィジェットエリア 削除
function my_unregister_sidebars() {
  // ウィジェットエリアのIDを指定
  $widgets_area_id = "sidebar-1";
  // 表示させたくない記事のIDを追加する
  $remove_area_posts = array( '1234', '2345' );

  $post_id = get_the_ID();
  if ( in_array( $post_id, $remove_area_posts ) ) {
    unregister_sidebar( $widgets_area_id );
  }
}
add_filter( 'wp', 'my_unregister_sidebars' );

この例では 投稿ID 1234 と 2345 のときは IDが sideba-1 のウィジェットエリアが出力されなくなります。

  $widgets_area_id = "sidebar-1";
  $remove_area_posts = array( '1234', '2345' );    // 表示させたくない記事のIDを追加する

  $post_id = get_the_ID();
  if ( in_array( $post_id, $remove_area_posts ) ) {

この辺が分岐のキモなのでテキトーに調整すればいろいろ応用できます。

add_filter のフックについて

add_filter のフックなんですが、例では wp を指定しています。

詳しい方であれば widgets_init でやればいいと思うかもしれません。

ところが…

widgets_init では get_the_ID() が使えない

いろいろ調べましたが widgets_init のタイミングでは投稿IDを取得できませんでした。

一律にウィジェットを削除するカスタマイズならば…

add_filter( ‘widgets_init’, ‘my_unregister_sidebars’ );

ってやればいいだけなんですが、投稿IDによって…となるとこのタイミングでは出来ないんですよね…

いろいろ試した結果(ひとつずつやってみましたw)

ここでいいんじゃないかな?って感じに出来ました。

特定の記事ID なので固定ページとか投稿タイプとか関係ありませんが、固定ページや投稿タイプによって該当のウィジェットエリアがそもそも表示されないこともあるので注意してください。

あとはトップページとか一覧ページだから出力されないウィジェットエリアもありますね。

この記事が気に入ったら
いいね ! しよう

Twitter で