ど素人から毛を生やす。<延>

管理画面にインプットエリアを設置、カスタムフィールドを簡単に更新するためのfunction

Web > WordPress 2018年4月9日(最終更新:3月前)

どもです。
今の仕事はシステム系なので、もうWordPressの記事は更新しなくなるかなぁと思っていたのですが、サイトの改造なんかを行うとまだネタは発生するようです。
ちょっとした変更を行おうとしたら、該当箇所のソースがかなり汚かったので整理整頓模様替え。

投稿画面に任意のフィールドを追加する方法です。function.phpに記載。
ここで追加した値はカスタムフィールドに入るので、取り出し方もカスタムフィールドのものでおk。

//任意のパラメータを投稿に追加する
function get_add_user_meta_array($target){
  //追加セクション id => array(name, type[1=post&page, 2=post, 3=page])
  if($target == "add_post_page_user_metabox"){
    return array(
      "additional_meta_setting"   => array("name"=>"メタ設定", "type"=>1),
    );
  }
  //追加項目 id => array(name, type[1=text, 2=short_text, 3=textarea, 4=image, 0=任意(保存のみ)], metabox_id)
  if($target == "add_post_page_user_parameter"){
    return array(
      "custom_title"        => array("タイトル", 2, "additional_meta_setting"),
      "coustom_description" => array("ディスクリプション", 1, "additional_meta_setting"),
      "coustom_keyword"     => array("キーワード", 1, "additional_meta_setting"),
      "og_image"            => array("og.image", 4, "additional_meta_setting"),
    );
  }
  if($target == "add_post_page_user_tags"){
    return array(
      1 => "<input type='text' id='{name}' name='{name}' name='{name}' value='{value}'  style='min-width:80%' />",
      2 => "<input type='text' id='{name}' name='{name}' value='{value}'  style='min-width:40%' />",
      3 => "<textarea id='{name}' name='{name}' style='min-width:80%'>{value}</textarea>",
      4 => '<div>
          <input type="text" id="{name}" name="{name}" class="image_url" value="{value}" />
          <a class="media-upload" href="JavaScript:void(0);" rel="og_image">画像を変更する</a>
        </div>',
    );
  }
}
add_action('admin_menu', 'add__user_metabox');
add_action('save_post', 'save__user_metabox');
function add__user_metabox(){
  $add_post_page_user_metabox = get_add_user_meta_array("add_post_page_user_metabox");
  foreach($add_post_page_user_metabox as $id => $arr){
    for($i=0; $i<2; $i++){
      if($i==0){
        $type="post";
        if($arr["type"]==3) continue;
      }else{
        $type="page";
        if($arr["type"]==2) continue;
      }
      add_meta_box($id, $arr["name"], "add_user_meta_edit_{$id}", $type, 'normal', 'high');
    }
  }
}
function add_user_meta_edit_additional_meta_setting(){
  //include("admin/additional_meta_setting.php");
  add_user_meta_edit("additional_meta_setting");
}
function add_user_meta_edit($add_meta_id) {
  global $post;
  $add_post_page_user_parameter = get_add_user_meta_array("add_post_page_user_parameter");
  $add_post_page_user_tags = get_add_user_meta_array("add_post_page_user_tags");
  echo '<input type="hidden" name="nonce_'.$add_meta_id.'" id="'.$add_meta_id.'" value="'.wp_create_nonce($add_meta_id).'" />';
  foreach($add_post_page_user_parameter as $key => $arr){
    if($arr[2]==$add_meta_id && $arr[1]>0){
      $output = $add_post_page_user_tags[$arr[1]];
      $output = str_replace('{name}', $key, $output); 
      $output = str_replace('{value}', get_post_meta($post->ID, $key, true), $output); 
      echo "<div style='margin-bottom:1em;'>";
      echo "<label style='display:block'>";
      echo $arr[0];
      echo "<br>";
      echo $output;
      echo "</label>";
      echo "</div>";
    }
  }
}
function save__user_metabox($post_id){
  $add_post_page_user_parameter = get_add_user_meta_array("add_post_page_user_parameter");
  $add_post_page_user_metabox = get_add_user_meta_array("add_post_page_user_metabox");
  foreach($add_post_page_user_metabox as $metaId => $metaArr){
    if (!wp_verify_nonce($_POST["nonce_".$metaId], $metaId)){ continue; }  //認証チェック
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){ continue; }          //自動保存ルーチンの際は実行しない
    
    foreach($add_post_page_user_parameter as $key => $arr){
      if ($arr[2] != $metaId){ continue; }                                 //複数add_post_page_user_metaboxのとき、重複更新を避ける
      $user_parameter = $_POST[$key];
      update_post_meta($post_id, $key, $user_parameter);
    }
  }
}

変更するのは色付きのところ。
add_post_page_user_metabox ⇒ フィールドのまとまり
add_post_page_user_parameter ⇒ 個別のフィールド

変更する必要はありませんが、
add_post_page_user_tags ⇒ inputの形状
これを追加して番号を割り振れば、add_post_page_user_parameterのtypeで使えます。

add_meta_boxの第二引数で関数名を指定しますが、ここで引数を入れられないため、手動でadd_user_meta_edit_[まとまりのID]の関数を作成し、add_user_meta_editへ送ります。
inputを自動生成しない(type=0の)フィールドがあれば、ここにinputを記載しておくと良いでしょう。

なお、type=4を使用するには、管理画面にjsを読み込んだ上でメディアアップローダー用のjsを設置してやる必要があります。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)