質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,554

mtr0326

score 11

 前提・実現したいこと

wordpressでテンプレートテーマを作成しています。
下の例のように固定ページ編集画面でプラグインを使用せずに、
選択されたデザインテンプレートごとにカスタムフィールドを切り替えて設置・表示させることは可能でしょうか?

例)
固定ページ編集画面にて
デフォルトテンプレート選択時にはカスタムフィールド非表示
デザインテンプレート1を選択したときにカスタムフィールド1を表示

 functions.php

// カスタムフィールド1作成
function add_page_fields() {
    add_meta_box( 'page_setting', '本の情報', 'insert_page_fields', 'page', 'normal');
}
add_action('admin_menu', 'add_page_fields');



// カスタムフィールドの入力エリア
function insert_page_fields() {
    global $post;
    echo '題名: <input type="text" name="page_name" value="'.get_post_meta($post->ID, 'page_name', true).'" size="50" /><br>';
    echo '作者: <input type="text" name="page_author" value="'.get_post_meta($post->ID, 'page_author', true).'" size="50" /><br>';
    echo '価格: <input type="text" name="page_price" value="'.get_post_meta($post->ID, 'page_price', true).'" size="50" /> <br>';

    if( get_post_meta($post->ID,'page_label',true) == "is-on" ) {
        $page_label_check = "checked";
    }
    echo 'ベストセラーラベル: <input type="checkbox" name="page_label" value="is-on" '.$page_label_check.' ><br>';
}


// カスタムフィールドの値を保存
function save_page_fields( $post_id ) {
    if(!empty($_POST['page_name'])){ 
        update_post_meta($post_id, 'page_name', $_POST['page_name'] ); 
    }else{ 
        delete_post_meta($post_id, 'page_name'); 
    }

    if(!empty($_POST['page_author'])){
        update_post_meta($post_id, 'page_author', $_POST['page_author'] );
    }else{
        delete_post_meta($post_id, 'page_author');
    }

    if(!empty($_POST['page_price'])){
        update_post_meta($post_id, 'page_price', $_POST['page_price'] );
    }else{
        delete_post_meta($post_id, 'page_price');
    }

    if(!empty($_POST['page_label'])){
        update_post_meta($post_id, 'page_label', $_POST['page_label'] );
    }else{
        delete_post_meta($post_id, 'page_label');
    }
}
add_action('save_post', 'save_page_fields');

 試したこと

  add_meta_box( 'page_setting', '本の情報', 'insert_page_fields', 'page', 'normal');

上記コード3行目add_meta_boxの第4引数にデザインテンプレートのパス(page/template1.php)なども記載してみましたがダメでした。

 補足情報(FW/ツールのバージョンなど)

WordPress 4.9.4

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

固定ページにカスタムフィールドを設置して、どのテンプレートが選択されたかをjavascriptで取得して、そのカスタムフィールドを表示・非表示させればどうでしょうか。

たとえば、固定ページに設置したカスタムフィールドのHTMLが以下のようだとして、

<div id="page_setting">
//カスタムフィールド
</div>


選択したテンプレートのselectのIDが「page_template」、valueが「front-page.php」だとします。

functions.phpに以下のコードを追加して

function testdayo() {
    if( get_post_type() == 'page' ) {

echo '<script type="text/javascript">

$(document).ready(function() {
    $("div#page_setting").hide();
    $("#page_template").bind("change", function() {
        var temp = $("#page_template").val();
        if( temp == "front-page.php") {
        $("div#page_setting").show();
    } else {
        $("div#page_setting").hide();
    }
});
});

</script>';
}}
add_action( 'admin_footer', 'testdayo' );


参考まで。

追記

function testdayo() {
    if( get_post_type() == 'page' ) {

echo '<script type="text/javascript">

$(document).ready(function() {
//ここから変更
    var temp = $("#page_template").val();
    if( temp == "front-page.php") {
        $("div#page_setting").show();
    } else {
        $("div#page_setting").hide();
    }
//ここまで変更
    $("#page_template").bind("change", function() {
        var temp = $("#page_template").val();
        if( temp == "front-page.php") {
            $("div#page_setting").show();
        } else {
            $("div#page_setting").hide();
        }
    });
});

</script>';
}}
add_action( 'admin_footer', 'testdayo' );


すいませんでした。
最初のコードでは、ページを読み込んだ時点ではカスタムフィールドを隠す設定になっていたので、公開した後の読み込みでも隠れてしまったようです。
なので、テンプレートの状態を判定させる処理を付け加えました。
ただ、わたしはjavascriptについて門外漢なので、違ったコードのほうがいいかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/12 15:53

    無事にいけました!
    ありがとうございます!

    キャンセル

  • 2018/02/12 16:06

    ちなみに固定ページ管理画面でカスタムフィールドに値を入力後更新ボタンを押すと、カスタムフィールドが非表示になるのですが、もし解決法があれば教えてください。

    キャンセル

  • 2018/02/13 01:54

    なるほど。
    valueの値を読み込んで条件分岐させているんですね..大変勉強になりました。
    ありがとうございました!

    キャンセル

+1

管理画面の話ですね。
「Custom Field Template」のプラグインを入れることで、解決するかもしれません。
このテンプレートを使用していれば、という判定も設定できます。

https://techacademy.jp/magazine/4139

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/09 12:25

    ちなみに、出力時の話かと思ってしまったので、
    タイトルを「wordpressの管理画面(編集画面)で、〜」に変えておいたほうが、後から気になって調べる方にも分かりやすいような気がします。

    キャンセル

  • 2018/02/09 16:38

    さっそくのご回答・ご指摘ありがとうございました。
    Custom Field Templateを使用せずコードのみで実装できる方法を探していましたので、質問を編集させていただきました。

    キャンセル

  • 2018/02/09 16:43

    では、ソース側で行ったことはないので分かりません、力になれずすみません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • PHPに関する質問
  • wordpressの管理画面(編集画面)で、プラグインを使わずに固定テンプレートごとにカスタムフィールドを分岐表示させる方法