ウィジェットタイトル入力欄先頭に!が入っているとウィジェットタイトルを表示しないようにするWordPressカスタマイズ方法

先日、どこかのWEBページで「ウィジェットタイトル入力欄」の先頭に「!(エクスクラメーションマーク)」を入力すると、ウィジェットタイトルが表示されなくなるプラグインが紹介されているのを見ました。

けれどその後、使ってみようと思ったときには、「どのページで読んだんだか」、「なんていう名前のプラグインだったか」を完全に忘れてしまいました。やっぱ、すぐにメモらないとすぐに忘れます。

ただ、想像するに実装自体はそこまで難しいものではなさそうだったので、WordPressテーマカスタマイズ方法を考えてみました。

スポンサーリンク
レクタングル(大)広告

今回のカスタマイズの効果ついて

「先頭に!を入力…」といっても、イメージが掴めないと思うので、先に「今回のカスタマイズを行うことにより、どういったことが便利になるか」を簡単に説明します。

ウィジェットタイトルは通常以下のように表示されます(WordPress公式テーマTwenty Sixteenの場合)。

WordPress公式テーマTwenty Sixteen

でもたまにウィジェットを利用していて以下のようなケースはないでしょうか。

デザイン上、ウィジェットのタイトルは表示させたくないな。

そんな時には、タイトル入力欄に何も入力しないなんて方法もあります。

ウィジェットタイトルに何も入力しない状態

けれどこれだと、ウィジェットが折りたたまれて表示されたときに、タイトルが表示されないので「中身に何が入っているのか」が分かり辛くなります。

ウィジェットタイトルが表示されないので何が入っているか分かりづらい

これに対して、今回のカスタマイズを行った後、以下のようにウィジェットタイトルに対して「!を先頭に入力」したとします。

!入りのウィジェットタイトル入力

この場合は、ウィジェットが折りたたまれていてもタイトルから内容を容易に想像することができます。

ウィジェットタイトルが表示されるので中身を把握しやすい

その上、しっかりとウィジェットタイトルが非表示になるカスタマイズです。

!を利用してウィジェットタイトルを表示しないようにした

先頭に!挿入でタイトルを表示しないようにする方法

カスタマイズの方法は簡単で、子テーマ等のfunctions.phpに以下のようにPHPコードをコピペするだけです。

//!でウィジェットのタイトルを隠せるように
add_filter('widget_title', 'widget_title_hidable_demo');
if ( !function_exists( 'widget_title_hidable_demo' ) ):
function widget_title_hidable_demo($title){
  //ウィジェットタイトルの最初の一文字が!のとき
  if (strpos($title, '!') === 0) {
    return null;
  }
  return $title;
}
endif;

これにより、ウィジェットタイトル先頭に!を入力したら

タイトルに!を入力した例

公開画面のウィジェット表示エリアでタイトルが表示されなくなります。

!でタイトルが表示されなくなった公開ウィジェットページ

このカスタマイズは、「WordPressデフォルトウィジェット」のようなwidget_titleフックを一旦経由してウィジェットタイトルを表示するウィジェットのみ有効です。

注意点

今回のカスタマイズは、WordPressデフォルトウィジェットにあらかじめある、widget_titleフィルターフックを利用することにより実装しています。

なので、独自テーマが実装しているウィジェット、widget_titleフックを経由していない場合は、!を先頭に挿入しても非表示にはなりません。

widget_titleフックを通す必要あり

独自テーマのウィジェット機能で反映されない場合は、ウィジェットクラスのwidgetメソッド内でタイトルが格納されている変数に対して以下のようにapply_filtersを通してやる必要があります。

$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

ちなみに、「WordPressデフォルトのテキストウィジェット」の場合は、$instanceからタイトルを取得後、widget_titleフィルターに通すような実装がされています。

$title = ! empty( $instance['title'] ) ? $instance['title'] : '';
$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

タイトル表示部分の実装

あとは、タイトル表示部分で以下のような条件分岐を用いて表示を制御すればOKです。

//タイトルが入力されているとき
if ($title) { 
 //ウィジェットタイトルを表示する場合の処理を書く
 echo $args['before_title'] . $title . $args['after_title']; 
}

$titleがnullかどうかまで判別する場合はこちら。

//タイトルがnullではないとき
if ($title !== null) {
  //ウィジェットタイトルを表示する場合の処理を書く
  echo $args['before_title'];
  if ($title) {
    //タイトルが設定されている場合は使用する
    echo $title;
  } else {
    //タイトルが空欄の時はデフォルトタイトルを表示
    echo '新着記事';
  }
  echo $args['after_title'];
}

まとめ

今回のカスタマイズ「先頭に!でウィジェットタイトルの非表示化」を行うことで、以下のような不便は無くなるかと思います。

ウィジェットタイトルを表示したくないけど、未入力にすると管理する上で中身が分かりづらくなるからなぁ…。

とはいっても、逆に言えば「単にウィジェットタイトルを未入力にしてもウィジェット管理画面で中身が分かりやすいというだけ」のカスタマイズです。

無理してやるほどのものでは、ないかもしれません。

Simplicityでは、次のバージョンで今回のカスタマイズを適用しようと考えています。ですので、カスタマイズを行うと処理が重複してしまう可能性があるのでご注意ください。