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

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

ただいまの
回答率

88.77%

WordPressでカスタムフィールドのfunctionを簡略化したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 409

chacky

score 16

実現したいこと

functions.phpでカスタムフィールドを保存しているのですが、そのコードを簡略化したいです。

下記のコードで
function create_lang() {}
function create_sex() {}
function create_age() {}
という3つを
function create_all() {}
のように一括したい感じです。

現在の状況

現在のコードはこの「言語」に対応する形で
add_meta_box( 'post_meta_lang', '言語', 'create_post_meta_lang', 'mypost', 'side' );

このfunctionがあり、フィールドが追加されるようになっています。
function create_lang() {}

しかしこのように「性別」や「年齢」などたくさんあったときに
add_meta_box( 'post_meta_sex', '性別', 'create_post_meta_sex', 'mypost', 'side' );
add_meta_box( 'post_meta_age', '年齢', 'create_post_meta_age', 'mypost', 'side' );

このようにいちいち同じようなfunctionを書きたくないと思いました。
function create_sex() {}
function create_age() {}

これらのfunction create_xxx() {}で違うのは$keyname = 'post_meta_xxx';の部分だけだからです。

そこで教えていただきたいのは、「言語」「性別」「年齢」などのすべてに対応できるfunctionです。

たとえばこのように1つにまとめるにはどうしたらよろしいでしょうか。
function create_all() {}

現在のソースコード

現在のソースコードはこちらです。

/*
投稿編集画面でカスタムフィールドを表示する
=======================================*/
add_action( 'admin_menu', 'add_meta_field' );
function add_meta_field() {
      add_meta_box( 'post_meta_lang', '言語', 'create_post_meta_lang', 'mypost', 'side' );
      add_meta_box( 'post_meta_sex', '性別', 'create_post_meta_sex', 'mypost', 'side' );
      add_meta_box( 'post_meta_age', '年齢', 'create_post_meta_age', 'mypost', 'side' );
}

/* これらをまとめたfunctionはどのようなコードになるか? */
function create_lang() {
      $keyname = 'post_meta_lang';
      global $post;
      $get_value = get_post_meta( $post->ID, $keyname, true ); 
      wp_nonce_field( 'action-' . $keyname, 'nonce-' . $keyname );
      echo '<input name="' . $keyname . '" value="' . $get_value . '">';    
}
function create_sex() {
      $keyname = 'post_meta_sex';
      // create_langと同じだからまとめたい
}
function create_age() {
      $keyname = 'post_meta_age';
      // create_langと同じだからまとめたい
}

/*
投稿編集画面でカスタムフィールドを保存する
=======================================*/
add_action( 'save_post', 'save_meta_field' );
function save_meta_field( $post_id ) {
      $custom_fields = ['post_meta_lang','post_meta_sex','post_meta_age'];
      foreach( $custom_fields as $d ) {
            if ( isset( $_POST['nonce-' . $d] ) && $_POST['nonce-' . $d] ) {
                    if( check_admin_referer( 'action-' . $d, 'nonce-' . $d ) ) {
                            if( isset( $_POST[$d] ) && $_POST[$d] ) {
                                    update_post_meta( $post_id, $d, $_POST[$d] );
                            } else {
                                    delete_post_meta( $post_id, $d, get_post_meta( $post_id, $d, true ) );
                            }
                    }
            }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+3

$custom_fields=['言語'=>'lang','年齢'=>'age','性別'=>'sex'];
add_action( 'admin_menu',function()use($custom_fields){
  foreach($custom_fields as $label=>$key){
    $keyname='post_meta_'.$key;
    add_meta_box( $keyname, $label, function($post)use($label,$keyname){
      $get_value = get_post_meta( $post->ID, $keyname, true ); 
      wp_nonce_field( 'action-' . $keyname, 'nonce-' . $keyname );
      echo '<input name="' . $keyname . '" value="' . $get_value . '">'; 
    }, 'mypost', 'side' );
  }
});


save_postの方も同じ要領で$custom_fieldsを使い回す

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/23 23:58 編集

    ありがとうございます。なんとなく、わかりました。

    $custom_fieldsの配列は関数の外にあるから、
    function()use($custom_fields){
    によって関数の中に渡さないといけないということですね。

    でもそれならば、$custom_fieldsの配列を、foreachの直前(関数の中)に書いてあげれば、
    function()use($custom_fields){
    でなく
    function(){
    だけでよくなりますよね。
    そのほうがシンプルで良いということはないのでしょうか?
    $custom_fieldsの配列を関数の外に出しておくことにはどのようなメリットがあるのですか?

    キャンセル

  • 2019/03/24 00:20

    $custom_fieldsを外に出してるのはsave_postでも使いたいからです

    仮に$custom_fieldsの項目が増えたとしても$custom_fieldsの要素を一つ増やすだけで
    フォームの出力と保存の処理の変更が一箇所の修正だけで済みますし
    どちらかだけを変更して片方を変更し忘れて動かなくなったとかいうことが起きにくくなります

    キャンセル

  • 2019/03/24 00:27

    ナルホド!「admin_menuの$custom_fields」と「save_postの$custom_fields」とで、同じ「$custom_fields」を二か所に書くことになってしまうからですか。ご高察とお心遣いに感謝申し上げます。どうもありがとうございました。

    キャンセル

+2

$callback_args が多分使えるのでは。

【add_meta_box – WordPress私的マニュアル】
https://elearn.jp/wpman/function/add_meta_box.html

【add_meta_box() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/add_meta_box/

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/22 23:43 編集

    ありがとうございます。

    「表示用関数のパラメータを指定」とありますが使い方がわかりませんねこれ。

    質問に沿った具体的なコードではどうなるかわかりますか?

    「add_meta_field() {}」で「add_meta_box」がありますけど、

    その「add_meta_box」に「$callback_args」を使うだけで

    「function create_lang() {}」と「function create_sex() {}」と「function create_age() {}」がまとまるというわけでもありませんよね?

    キャンセル

  • 2019/03/22 23:50

    > 使い方がわかりませんねこれ。
    こっちのほうがわかりやすいかな。

    【関数リファレンス/add meta box - WordPress Codex 日本語版】
    https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_meta_box#.E3.82.B3.E3.83.BC.E3.83.AB.E3.83.90.E3.83.83.E3.82.AF.E5.BC.95.E6.95.B0

    > 「$callback_args」を使うだけで(中略)がまとまるわけでもありませんよね?
    まとめた関数を割り当てることが出来るだけです。

    キャンセル

  • 2019/03/23 23:27 編集

    むつかしかったです…汗
    「>まとめた関数を割り当てることが出来る」というのも理解できませんでした。
    今回は質問に沿った形でご回答を頂けまして、「$callback_args」というのは見送りらせていただこうかと思います。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る