[WordPress] 指定ページのヘッダやサイドバーの表示を切り替える方法

この記事は WordPress Advent Calendar 2015 の23日目です。

#やりたいこと

  • 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;
}

指定のページ(条件分岐タグ)が指定されていたら、この場合ヘッダを非表示にする($displayfalse)。

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;
    }

}