カスタムフィールドを作成するプラグインは現在いくつあるのでしょう?
便利だから使っている方も多いでしょう。
以下に該当する方以外は参考になりません。
- プラグインによっては入力の無いカスタムフィールドの値もページごとに保存されてゴミが溜まるのが嫌
- アフィリエイトのサイトなど自分でいくつも作りたい時に、プラグインの設定を何度もしたくない
- 自分でプラグインを作りたい
ということで
プラグインなしで投稿ページにカスタムフィールドを作成する方法
functions.php
// 投稿ページにカスタムフィールドを作る場合は、引数は順に htmlのID, メタボックスへ付けるタイトル, コールバック関数名, 投稿の種類, デザインのフォーマット
function tn_custom_fields() {
add_meta_box( 'description', '説明', 'tn_create_fields', 'post', 'normal');
}
add_action('admin_menu', 'tn_custom_fields');
// カスタムフィールド(formの入力部品を作る)
function tn_create_fields() {
$fiealds = get_post_custom( $post->ID );
echo 'ページの説明: <input name="description" size="50" type="text" value="'.$fiealds['description'][0].'" />';
//入力欄が複数ある場合は、同じ手順で入力欄を増やします。
}
// カスタムフィールドの値を保存
function tn_save_fields( $post_id ) {
if(!empty($_POST['description'])){
update_post_meta($post_id, 'description', $_POST['description'] );
}else{
delete_post_meta($post_id, 'description');
}
//入力欄が複数ある場合は、同じ手順で入力欄を増やします。
}
add_action('save_post', 'tn_save_fields');
nonce_fieldも抜けていますし、せっかくだから複数のカスタムフィールドに対応したものを書き直しました。
functions.php
//カスタムフィールドのキーと値をセットする
$tn_1956_fields = array(
'box1' => 'ラベル1',
'box2' => 'ラベル2',
'box3' => 'ラベル3',
'box4' => 'ラベル4',
);
function tn_add_meta_box() {
global $tn_1956_fields;
foreach ( $tn_1956_fields as $tn_key => $tn_value ) {
add_meta_box(
$tn_key,
$tn_value,
'tn_meta_box_callback',
'post'
);
}
}
add_action( 'add_meta_boxes', 'tn_add_meta_box' );
/**
* 投稿画面の入力フォームの作成と既存値をセットする
*/
//カウンターとカスタムフィールドのキー
$tn_1956_keyvalue = 0;
$array_key = array_keys($tn_1956_fields);
function tn_meta_box_callback( $post ) {
global $tn_1956_fields, $tn_1956_keyvalue, $array_key;
//カスタムフィールド入力欄のラベルをセットする
$key = $array_key[$tn_1956_keyvalue];
$label = $tn_1956_fields[$key];
$tn_1956_keyvalue += 1;
//カスタムフィールドの値を取得する
$field = get_post_meta( $post->ID, $key, true );
// nonceフィールドを追加
wp_nonce_field( 'アクションの名前', 'nonce フィールドの名前' );
echo '<label for="'.$key.'">'.$value.'</label> ';
echo '<input type="text" id="'.$key.'" name="'.$key.'" value="' . esc_attr( $field ) . '" size="25" />';
//今回はテキストだけの対応ですがtype属性を工夫してテキスト以外にも対応できます。
}
/**
* 投稿が保存されたとき、カスタムデータも保存する
*/
function tn_save_meta_box_data( $post_id ) {
// nonceが正しいかどうか検証
if ( ! isset( $_POST['nonce フィールドの名前'] ) || ! wp_verify_nonce( $_POST['nonce フィールドの名前'], 'アクションの名前' ) {
return;
}
// $_POSTの中身があるかどうか確認
if ( ! isset( $_POST ) ) {
return;
}
// 自動保存の場合はなにもしない
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// 投稿ページの確認
if ( !isset( $_POST['post_type'] ) || 'post' !== $_POST['post_type'] ) {
return;
}
global $tn_1956_fields;
// データがセットされているか確認する
foreach ( $tn_1956_fields as $key => $value ){
if ( ! isset( $_POST[$key] ) ) {
return;
}
// 入力を無害化する
$tn_field = sanitize_text_field( $_POST[$key] );
// フィールドを更新
update_post_meta( $post_id, $key, $tn_field );
}
}
add_action( 'save_post', 'tn_save_meta_box_data' );
cf. 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
自分のサイトで使うならたったこれだけのコード量で済みます。
今回は投稿タイプがpostでしたが投稿タイプを単語で追加するだけです。
投稿タイプやカスタムフィールドを管理画面から設定できるようにして、そのうちにプラグインにしてみようと思います。