[WordPress] 指定ページのヘッダやサイドバーの表示を切り替える方法
4 min read
やりたいこと
- 404 ページの時にヘッダーとサイドバーを表示しない
- 条件は条件分岐タグを使いたい
実装
前提
基本的にサイドバーなどのテンプレートはは以下のように呼ぶ。
get_template_part('templates/common/sidebar');
これをラップする。
呼び出し
get_template_part()
の代わりにこんな感じで呼び出す。
Template::get_template_header();
内部の実装は以下のような感じ。
public static function get_template_header() {
if ( self::is_display_header() ) {
get_template_part('templates/common/header');
}
}
判定
private static $header_invisible = ['is_404'];
private static $sidebar_invisible = ['is_404'];
public static function is_display_header() {
return self::is_display(self::\$header_invisible);
}
$header_invisible
と$sidebar_invisible
は、配列で WordPress の条件分岐タグを文字列で入れていく。以下の様な感じ。
private static $header_invisible = ['is_home', 'is_single', 'is_404'];
ページの条件分岐を判定する
is_display()
の引数には条件分岐タグを入れた配列を指定する。
private static function is_display($invisible) {
$display = true;
// 指定の条件分岐に該当するものがある場合は非表示にする
if (in_array(true, self::set_conditional_result_from_str($invisible) ) ) {
$display = false;
}
return $display;
}
指定のページ(条件分岐タグ)が指定されていたら、この場合ヘッダを非表示にする(\$display
をfalse
)。
private static function set_conditional_result_from_str($funcs) {
$result = [];
foreach($funcs as $is_conditional) {
if( function_exists($is_conditional) ) {
$result[] = $is_conditional(); // true or false
} else {
$result[] = false;
}
}
return $result;
}
条件分岐タグの文字列("is_home"など)をfunction_exists()
で存在チェックをし、存在する場合は関数として実行する。
条件分岐タグが存在していれば、条件分岐タグから返される判定を$result
に入れる。そもそも指定の関数が存在しなければfalse
を$result
に入れる。
完成
<?php
class Template {
private static $header_invisible = ['is_404'];
private static $sidebar_invisible = ['is_404'];
public static function get_template_header() {
if ( self::is_display_header() ) {
get_template_part('templates/common/header');
}
}
public static function get_template_sidebar() {
if ( self::is_display_sidebar() ) {
get_template_part('templates/common/sidebar');
}
}
public static function get_template_footer() {
get_template_part('templates/common/footer');
}
public static function is_display_header() {
return self::is_display(self::$header_invisible);
}
public static function is_display_sidebar() {
return self::is_display(self::$sidebar_invisible);
}
private static function is_display($invisible) {
$display = true;
// 指定の条件分岐に該当するものがある場合は非表示にする
if (in_array(true, self::set_conditional_result_from_str($invisible) ) ) {
$display = false;
}
return $display;
}
// 文字列から条件分岐タグの結果を取得する
private static function set_conditional_result_from_str($funcs) {
$result = [];
foreach($funcs as $is_conditional) {
if( function_exists($is_conditional) ) {
$result[] = $is_conditional(); // true or false
} else {
$result[] = false;
}
}
return $result;
}
}