WordPress の管理者ページにカスタムフィールドを追加する

WordPress で批評サイトを作る案件で記事ごとに批評元の URL を管理する必要があったので、カスタムフィールドを追加してみた。

WordPress の投稿記事はタイトルと本文の2つの編集項目しかないのが、カスタムフィールドという機能を使うと、投稿記事ごとに独自の編集項目を追加することができる。

カスタムフィールドを作成するには、以下の3つの関数を作成する。

  1. カスタム―フィールドを宣言する関数
  2. カスタムフィールドの入力フォームを表示する関数
  3. カスタムフィールドに入力された値を保存する関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

function additional_data_inner_custom_box() {
echo '<p>この記事ページの補足情報を入力してください</p>';

$additional_data = "";
if (isset($_GET['post'])) {
$additional_data_array = get_post_meta( $_GET['post'], 'additional_data');
if (isset($additional_data_array[0])) {
$additional_data = $additional_data_array[0];
}
}
$res = "<input name=\"additional_data\" value=\"{$additional_data}\" />";
echo $res;
}

add_action('init', function() {
add_action('admin_menu', function() {
add_meta_box(
'additional_data',
'この記事ページの補足情報',
'additional_data_inner_custom_box',
'post',
'normal',
'high');
});

add_action('save_post', function( $post_id ) {
$data = filter_input(INPUT_POST, 'additional_data', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

if ( $data ) {
if ( "" == get_post_meta( $post_id, 'additional_data')) {
add_post_meta( $post_id, 'additional_data', $data, true);
} else {
update_post_meta( $post_id, 'additional_data', $data);
}
}
});
});

カスタムフィールドで入力された値は、wp_postmeta テーブルに post_id と meta_key, meta_value の組み合わせで保存される。

保存された値は post_id と meta_key で以下のように呼び出すことができる。

1
2
3
4
5
6
7
add_shortcode( 'get_additional_data', function(array $attr) {
$default = [
'post_id' => '',
];
$attr = shortcode_atts( $default, $attr);
return get_post_meta(intval($attr['post_id']), 'additional_data', true);
});

うまく動けば、記事内でショートコード [get_additional_data] でカスタムフィールドに入力した値は表示される。