管理画面で固定ページのテンプレートごとにカスタムフィールドの表示を切り替える方法(苦肉の策)

WordPressの管理画面で固定ページのテンプレートごとにカスタムフィールドの表示・非表示を切り替える方法

今回は、WordPressのカスタムフィールドについてです!

しかしながら、丸1日かけて見つけた方法でも納得のいく結果にならなくてモヤモヤしています。

そもそもカスタムフィールドってそんなにたくさん作るものじゃない?

こんな疑問を持ったのは、私のように「管理画面で固定ページのテンプレートごとにカスタムフィールドの表示を切り替えたい」という声があまり見つからなかったからです。

唯一、見つけたのはteratailのこちら

wordpressの管理画面(編集画面)で、プラグインを使わずに固定テンプレートごとにカスタムフィールドを分岐表示させる方法|teratail

しかし、こちらの方法はWordPress ver5 以降では使えないようでした。

公式を読んだり、英語でも検索してみましたがうまく見つけられず…。

もしや、カスタムフィールドってそんなにたくさん作らなくて、表示・非表示の切り替えが必要ないのでは?と思い始めました。

でも固定ページのテンプレートごとに6つくらいあるんだけど…

動物病院の固定ページ「トップページテンプレート」

例えば、以前作った動物病院用のWordPressテーマ。この画像は、固定ページのトップページテンプレートを使用したものです。

この中に含まれるカスタムフィールドは5つ。

  • 診療時間
  • 注意事項(「ご予約優先です」のところ。あと2行追加可能)
  • 地図
  • 住所・電話など
  • 診療対象動物

この他にスライドショーの画像など、トップページだけで6つのカスタムフィールドを使用しています。

固定ページごとにカスタムフィールドが増えていたら、管理画面が見づらくて使いにくくなりそうです。

管理画面で固定ページのテンプレートの種類を取得するには

まず、固定ページを公開して表示した画面ではなく、固定ページを編集する管理画面で、テンプレートの種類を取得する必要があります。

固定ページのテンプレートの種類とは

特定の固定ページを作成するとき、phpファイルに下記のようなコメントを書き添えます。

<?php
/*
 Template Name: トップページ
 */
?>

このTemplate Nameがテンプレートの種類として登録されます。

固定ページを編集するときに、右側の設定画面のページ属性で選ぶことができるようになります。

設定でページ属性を選択できる

get_post_meta関数を使う

カスタムフィールドを作るときに、管理画面を表示するためのinputタグやtextareaタグをechoする関数があります。

その中に、次の1行を追記しましょう。

get_post_meta($post->ID, '_wp_page_template', true);

get_post_meta関数の第2引数に、_wp_page_templateを指定すると、テンプレートのphpファイル名を取得することができます。(Template Nameじゃないんかい)

これを利用して、次のようにコードを書いてみました。

add_action('admin_menu', 'add_custom_fields');

function add_custom_fields()
{
    add_meta_box('map_id', '-トップページ- 所在地の地図(Googleマップ)', 'map', 'page', 'normal');
}

function map()
{
    global $post;
    $template = get_post_meta($post->ID, '_wp_page_template', true);
    if ($template == 'page-top.php') {
        echo '埋め込みURL:<br><textarea style="width: 100%; height: 80px;" name="map">' . get_post_meta($post->ID, 'map', true) . '</textarea>';
    } else {
        echo '<p>トップページテンプレート用です</p>';
    }
}

その結果、トップページテンプレートではtextareaが表示され、

カスタムフィールド表示

それ以外のテンプレートでは「トップページテンプレート用です」の表記が出るようになりました。

カスタムフィールド非表示

カスタムフィールドの名前は表示されたまま…

できればもっとスッキリさせるために、カスタムフィールドの名前自体を消したかったのです。

が、get_post_metaはadd_meta_boxで定義した関数の中では使えでも、add_actionで定義した関数の中では使えません。

そのため、理想通りにはできず名前が表示されたままになってしまいました。

でも、全部表示されてしまうよりはだいぶマシでは!?

ちなみに、ページ属性を選択して更新し、リロードしてからでないと機能しない

そう思うと、結局不便な機能を付け加えただけのような…(笑)。

WordPressはReactを使っているので、ページ属性を選んだときに非同期で切り替わってくれたらいいのに。

テーマをつくるときにこの辺りもイジったりできるのでしょうか。

絶対何か方法があるはず…

プログラミングを始めてからというもの、私って人が悩んでいなさそうな点でよく悩んでるなぁと思います。

その理由は主に、実はめちゃくちゃ簡単な方法があるのに気づいていないとか、調べるときのワードが適切でないなどです(笑)。

今回の「管理画面で固定ページのテンプレートごとにカスタムフィールドの表示を切り替える方法」、もしもっと良い方法をご存知の方は教えてくださーい!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)