以前Cocoonのfunctions.phpをいじって、こんなカスタマイズをしたことがありました。
この時はis_index_middle_widget_visibleという関数を子テーマ側で無理矢理上書きしてインフィード広告の複数表示を実現させていました。ところが、他にもそういった要望があったようです。先日のCocoon 1.8.3へのアップデートでは、同様のカスタマイズ可能な口がテーマ側に設けられていました。
互換性を考えればなるべくテーマ側の意向に沿った形でおさめておくのが一番なので、うちで実施したカスタマイズも、新しく設けられたフック関数を使う形に修正することにしました。
is_index_middle_ad_visibleフック関数に表示条件を設定する
以前自分でやったカスタマイズではウィジェットの表示条件を修正しましたが、今回サポートされたのはウィジェットではなく「広告の表示位置」で指定する設定判定のところでした。従って前回functions.phpに書いたis_index_middle_widget_visible関数は丸ごと削除。新しく次のフック関数を追加します。
//インデックスミドル広告の表示条件 add_filter('is_index_middle_ad_visible', function ($is_visible, $count){ //ここにインデックス広告の表示条件分岐を書く //3個目と7個目のときに表示 return (($count == 3) || ($count == 7)); }, 10, 2);
広告の表示条件を確認した後で呼ばれるフック関数なので、本当なら「$is_visibleがtrueの時に、次の条件(3個目と7個目)なら表示させる」と記述したかったんですけど、どうも$countが3の時しか$is_visibleがtrueになってくれてない様子。
仕方がないので、「無条件に3個目と7個目の時はtrueで返却」する関数にしてしまいました。
自分の用途的にはそれでOKなんですが、気持ち悪さも少し残ります。
念のためにフック関数を呼び出している親テーマのコードを見ると、次のようになっていました。
//広告をトップページのリスト表示中間に掲載するか
if ( !function_exists( 'is_index_middle_ad_visible' ) ):
function is_index_middle_ad_visible($count){
$is_visible =
//広告表示設定が有効な時
is_ad_pos_index_middle_visible() &&
// //3個目の表示のときのみ
// ($count == 3) &&
// //トップページリストのみ
// is_home() &&
//ページネーションの最終ページでないとき
!is_pagination_last_page() &&
// //1ページに表示する最大投稿数が6以上の時
// is_posts_per_page_6_and_over() &&
// //エントリーカードタイプの一覧のとき
// is_entry_card_type_entry_card() &&
// //&&//公開記事が6以上の時
// (get_all_post_count_in_publish() >= 6)
is_index_middle_widget_visible($count);
$is_visible = apply_filters('is_index_middle_ad_visible', $is_visible, $count);
if ($is_visible) {
return true;
}
}
endif;
ああ…なるほど。
ポイントは、フック関数の呼び出し(apply_filtersの行)の前に呼ばれている赤字の部分です。
これ、インデックスミドルのウィジェットを表示させるか確認するところで、前回カスタマイズした関数でもあるんですけど、そこのコードがどうなっているか確認してみると、そっちには相変わらず「3個目の表示のときのみ」とするコードが有効になっちゃってるんですよね。
//ウィジェットをトップページのリスト表示中間に掲載するか
if ( !function_exists( 'is_index_middle_widget_visible' ) ):
function is_index_middle_widget_visible($count){
$is_visible =
//3個目の表示のときのみ
($count == 3) &&
なので、3個目の表示の時以外は$is_visibleがfalseにならざるを得ない…と。コメントアウト漏れのバグかとも思いましたが、こうしておかないと「標準の状態では3個目の時に表示する」ことができないからですね多分。$is_visibleをフック関数側であてにしちゃ駄目か。
そういうことであればさっきの気持ち悪さは「仕方ない」と割り切ることができます。さらにコードをさかのぼると、広告表示設定が無効な時はそもそもこのフック関数の位置まで降りてこないこともわかったので、フック関数は今の単純な作りのままでも特に問題はなさそうです(たとえばCocoon設定画面で広告を非表示にしたらちゃんと反映される)。
これでコードのカスタマイズはOKということにして、Cocoonの設定に移ることにしました。
インデックスミドルのウィジェットを消して、広告の表示位置設定でインデックスミドルを指定する
前回のカスタマイズでウィジェットを用いてインデックスミドルに広告を出すようにしてますから、WordPress管理画面の[外観]→[ウィジェット]を開き、該当するものを削除します。
次に、[Cocoon設定]を開いて広告タブの中にある「広告の表示位置」設定で、インデックスページのミドル位置にチェックを入れ、広告の表示を指示します。
以上でカスタマイズ終了。
インデックスページをリロードすると、ウィジェットを削除したにも関わらず、ちゃんとインフィード広告が表示されていました。
こんにちは!半年前に基本情報に受かったとご報告した者ですが、春の試験で応用情報にも合格しました!キタミ式にはまたもお世話になりました。ありがとうございます!!
わ!おめでとうございます!
良かったですね~!!