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

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

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

2018年4月9日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。
今の仕事はシステム系なので、もう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)