【WordPress】プラグインなし!特定ページで特定ウィジェットを非表示にする方法

ブログ関連ブログ関連

WordPressユーザー向け!
PHPを使って特定のページのみ、特定のウィジェットを非表示にする方法を記します。
「特定のページ以外を非表示」と指定もできるため、実質的に特定のページのみに表示させることも可能です。

「Simple GA Ranking」という人気記事ランキングを表示してくれる(データを引っ張ってきてくれる)超軽量なプラグインを利用して作ったウィジェットを、PHP(プラグインなし)で特定のページのみ表示してみました。
「Simple GA Ranking」以外でも使用できます。

備忘も兼ねて、記録を残しておきます。(汎用的に使えるコードは一番ラスト!)

PHPで表示・非表示を切り替える

実は私が使用しているテーマ「Luxeritas」はとっても優れたテーマで、既存のウィジェット(オプションのあるウィジェット)であれば簡単にページごとの表示・非表示を切り替えることができます

チェック一つでできる手軽さ!
めちゃくちゃ分かりやすいし、細かい設定が可能です。

関連サイト

◆ Luxeritas
公式HP

しかし、今回私がページごとに表示を切り替えたいものは、自分でPHPで作成した人気記事ランキングのウィジェット
「Simple GA Ranking」プラグインをインストールした時にオプション有りのウィジェットは作られるので、それを使えばLuxeritasの設定で表示を切り替えることはできるのですが、細かくカスタマイズしたかったのでランキングをPHPで作成しています。
そのため、ページ毎に表示を切り替えてくれるプラグインを入れて使うか、自分でPHPを書いてなんとかするかの二択だったんです。

私はサイトの軽量化・高速化を強く求めているため、プラグインの多用が好きではありません。(人気ランキング作成で設定が簡単な「WordPress Popular Post」を使わず「Simple GA Ranking」を使うのも軽量化のため)
プラグインが増えすぎると、何か問題が起こった時に原因がどこにあるのか探すのも一苦労。

そのため、PHPで対応することにしました。

特定のページ(トップページ)のみ非表示にしてみた

特定のウィジェットを非表示にする方法については、以下サイトでコードを紹介されています。

上記サイトでは「モバイル端末で見たときに特定のウィジェットを非表示にする」というコードが紹介されています。こちら大変参考になりました!
最初はこの紹介されているコードから条件判定ウィジェットIDを書き換えて使用し、大満足しておりました。

具体的に言うと当ブログでは、「Simple GA Ranking」をトップページのみ非表示に。そのときに書いたコードは以下です。

function remove_specific_widget($sidebars_widgets){
    if(!is_admin() && is_home()){
        foreach($sidebars_widgets as $widget_area => $widget_list){
            foreach($widget_list as $pos => $widget_id){
                if($widget_id=='sga_ranking_sample_cat'){
                    unset($sidebars_widgets[$widget_area][$pos]);
                }
            }
        }
    } 
    return $sidebars_widgets;
}
add_filter('sidebars_widgets','remove_specific_widget');

2行目の条件判定を「is_home()」とすることでトップページのみ、5行目で指定した「sga_ranking_sample_cat」というIDのウィジェットを非表示にすることができました。

私はカスタマイズして「カテゴリー別人気記事ランキング(sga_ranking_sample_cat)」を作っているのですが、トップページの場合はカテゴリーがないから「ごちゃまぜランキング」が表示されるので、気になっていたんです。
特化ブログならごちゃまぜでも何かしら関連したものが表示されると思うんですけど、うちのような超・雑記ブログだと「何のランキング?」となってしまうんです。
水耕栽培、お店の記事、地域関連記事、読書記録、ブログごと、ゲーム、映画……自分でも突っ込みたくなる雑記度に大混乱!
ということで、トップページから非表示にしました。

ですが後々、実は他にも表示させたくない場所が多かったことに気づいたんです。
トップページのみならず、アーカイブページとか固定ページとかタグページとか検索結果ページとか、「カテゴリー要素がないページ」は全てごちゃまぜランキングが表示されちゃうんですね。

こうなるといちいち全部除外していくのは面倒だし、モレもありそうだし、むしろ「特定のページのみ表示させる(特定のページ以外を非表示にする)」方が良いなぁということに。
そもそもカテゴリー要素が入っているのは「個別の記事ページ」と「カテゴリーページ」のみだ! と気付いたので、上記サイトからプログラムコードを参考にさせていただきつつ書き換えました。

特定のページ以外を非表示にしてみた

というわけで、「ハニコログ。(当ブログ)」が記述しているのは以下のコードです。
子テーマの「functions.php」に記述しています。

function remove_specific_widget($sidebars_widgets){
    if(!is_admin() && !(is_single() || is_category())){
        foreach($sidebars_widgets as $widget_area => $widget_list){
            foreach($widget_list as $pos => $widget_id){
                if($widget_id=='sga_ranking_sample_cat'){
                    unset($sidebars_widgets[$widget_area][$pos]);
                }
            }
        }
    } 
    return $sidebars_widgets;
}
add_filter('sidebars_widgets','remove_specific_widget');

これでうちは万事解決しました。
個別記事((is_single())」または「カテゴリーページ(is_category())」以外、かつ「管理画面(is_admin())」以外のページで、指定したウィジェット「sga_ranking_sample_cat」を非表示にすることができました。

応用して他のページやウィジェットでも使えます

こちらのコードは、様々なシーンで応用できます。
子テーマの「functions.php」に記述しますが、「functions.php」はちょっとでも間違えると管理画面に行けなくなってしまうこともありますので、細心の注意を払ってくださいね。
(サーバーのファイル管理から入る等して、足した記述を消せばすぐに戻すことは可能です)

特定のページで非表示にする場合

function remove_specific_widget($sidebars_widgets){
    if(!is_admin() && ●●){
        foreach($sidebars_widgets as $widget_area => $widget_list){
            foreach($widget_list as $pos => $widget_id){
                if($widget_id=='★★'){
                    unset($sidebars_widgets[$widget_area][$pos]);
                }
            }
        }
    } 
    return $sidebars_widgets;
}
add_filter('sidebars_widgets','remove_specific_widget');

●●」の部分には「is_home()」などの条件判定を記入、「★★」の部分には表示を消したいウィジェットのIDを記入してください。

条件判定はWordPress Codex 日本語版で紹介されています。

関連サイト

◆ WordPress Codex 日本語版
条件分岐タグ

ウィジェットのIDは、該当のウィジェットが表示されているページでChromeなら「右クリック→検証」safariなら「右クリック→要素の詳細を表示」で調べることができます。
該当のウィジェットを指定しているIDを見つけて記述しましょう。

特定のページが複数ある場合は、上記の2行目のコードを以下に替えて、●●部分にそれぞれ複数のページを指定すればOKです。

    if(!is_admin() && (●● || ●● || ●●)){

「()」が多すぎたり足りなかったりしないよう、気を付けてくださいね。

特定のページ以外で非表示にする場合

function remove_specific_widget($sidebars_widgets){
    if(!is_admin() && !●●){
        foreach($sidebars_widgets as $widget_area => $widget_list){
            foreach($widget_list as $pos => $widget_id){
                if($widget_id=='★★'){
                    unset($sidebars_widgets[$widget_area][$pos]);
                }
            }
        }
    } 
    return $sidebars_widgets;
}
add_filter('sidebars_widgets','remove_specific_widget');

こちらも「●●」の部分には「is_home()」などの条件判定を記入、「★★」の部分には表示を消したいウィジェットのIDを記入してください。
全く同じように見えますが、「●●」の前に「!」がついているのがポイントです。この一文字で逆の意味にすることができるんですね。

同じように複数指定することも可能です。2行目のコードを以下にして、●●部分に複数のページを指定すればOKです。

    if(!is_admin() && !(●● || ●● || ●●)){

プラグインなしで表示・非表示できました!

コードが逆説ばかり(非表示を逆にする、とか)で混乱しそうになりますが、これを使えば表示したくないウィジェットを非表示にできるし、思い通りに指定できるはず。

プラグインなしで指定できるのは大きいと思います。
内容にもよりますが、プラグインの数が増えるとどうしても重たくなるし、プラグイン同士の喧嘩で悪さをすることもあります。

個人的な見解ですが、ユーザビリティやGoogleの評価、エラー発生時の影響の大きさを考えると、必要なもの以外はできるだけ使いたくないところ。

そうはいっても、細かくたくさんの指定がしたい場合は、全部PHPで書くのは大変だと思います。
指定が少ない方は上記方法で、指定が多い方はプラグインを入れるのも良いと思います。私は使用したことないですが、プラグインなら「Widget Logic」が評判良いみたいですね。

PHPを書くにしろプラグインを使うにしろ、ウィジェットを非表示にすることでサイトの読み込みスピードも上がります。お役に立てれば嬉しいです!