どもです。
今の仕事はシステム系なので、もう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を設置してやる必要があります。