カスタムフィールドを追加し、常に投稿画面に表示させる – WordPress
- WordPress
-
2014-06-02 - 更新:2018-06-15
記事を新規投稿する際、プラグインを使用せずカスタムフィールドの入力欄をデフォルトで表示させる、という方法があったのでご紹介します。
自作のオリジナルテーマであることが前提です。
テーマのfunctions.phpに記述します。
admin_menuアクションフックでカスタムボックスを定義
(管理画面メニューの基本構造が配置された後に実行する)
add_action('admin_menu', 'add_custom_fields');
また、add_meta_boxesアクションフックでも可能なようです。
(投稿編集画面が読み込まれた際に実行する(バージョン3.0以降))
add_action('add_meta_boxes', 'add_custom_fields');
投稿画面にカスタムフィールドを表示するカスタムセクションを追加
function add_custom_fields() {
add_meta_box('my_sectionid', 'カスタムフィールド', 'my_custom_fields', 'post');
}
固定ページ投稿画面に追加する場合は
add_meta_box('my_sectionid', 'カスタムフィールド', 'my_custom_fields', 'page');
add_meta_box関数について
add_meta_box( $id, $title, $callback, $page, $context, $priority );
$id |
編集画面セクションの HTML ID |
|---|---|
$title |
編集画面セクションのタイトル、画面上に表示される |
$callback |
編集画面セクションに HTML 出力する関数 |
$page |
編集画面セクションを表示する画面のタイプ (‘post’, ‘page’, ‘link’, またはcustom_post_type。カスタムポストタイプはスラッグを指定) |
$context |
編集画面セクションが表示される部分 (‘normal’, ‘advanced’ または (2.7 以降) ‘side’) |
$priority |
ボックスが表示される優先度 (‘high’ または ‘low’) |
追加したセクションにHTMLを出力するコールバック関数
function my_custom_fields() {
global $post;
$meta_custom_field = get_post_meta($post->ID, 'meta_custom_field', true); //第3引数をfalseにするとデータが配列で返ってきます
echo '<p>項目名(meta_custom_field)<br />';
echo '<input type="text" name="meta_custom_field" value="'.esc_html($meta_custom_field).'" size="40" /></p>';
}
データが入力された際、save_postアクションフックを使ってカスタムデータも保存します。
(データがデータベースに保存された後に実行される)
add_action('save_post', 'save_custom_fields');
投稿を保存した際、カスタムフィールドの値を保存するコールバック関数
引数は投稿ID
function save_custom_fields( $post_id ) {
if(!empty($_POST['meta_custom_field'])) {
update_post_meta($post_id, 'meta_custom_field', $_POST['meta_custom_field'] );
} else {
delete_post_meta($post_id, 'meta_custom_field');
}
}
これで投稿画面に、タイトル・本文以外に任意の項目を表示できるようになります。
カスタムフィールドを実際に記事へ表示します。
if(have_posts()) {
while(have_posts()) {
the_post();
echo get_post_meta($post->ID, "meta_custom_field", true);
}
}
チェック項目を追加するには
チェック項目を追加する場合は次の関数を追加します。
function my_check_fields() {
global $post;
$meta_check = get_post_meta($post->ID, 'meta_check', true);
if($meta_check == 1) $meta_check_c = " checked=\"checked\"";
echo '<p>チェック項目(meta check)<br>';
echo '<input type="checkbox" name="meta_check" value="1"'.$meta_check_c.'></p>';
}
add_custom_fields関数に以下の1行を追加します。
add_meta_box( 'my_checkid', 'チェック項目', 'my_check_fields', 'post');
カスタムフィールドの値を保存するsave_custom_fields関数にもコードを追加します。
if(!empty($_POST['meta_check']))
update_post_meta($post_id, 'meta_check', $_POST['meta_check'] );
else delete_post_meta($post_id, 'meta_check');
投稿一覧画面にカスタムフィールドを表示、更にソートする
まず投稿一覧画面にカスタムフィールドを表示させます。
function add_post_columns_name($columns) {
$columns['meta_custom_field'] = "カスタムフィールド";
return $columns;
}
function add_column($column_name, $post_id) {
if( $column_name == 'meta_custom_field' ) {
$ma = get_post_meta($post_id, 'meta_custom_field', true);
if ( isset($ma) && $ma ) {
echo attribute_escape($ma);
} else {
echo __('-');
}
}
}
add_filter( 'manage_posts_columns', 'add_post_columns_name' );
add_action( 'manage_posts_custom_column', 'add_column', 10, 2);
次に追加したフィールドでソートできるように設定します。
function column_orderby_myfield( $vars ) {
if ( isset( $vars['orderby'] ) && 'meta_custom_field' == $vars['orderby'] ) {
$vars = array_merge( $vars, array(
'meta_key' => 'meta_custom_field',
'orderby' => 'meta_value'
));
}
return $vars;
}
add_filter( 'request', 'column_orderby_myfield' );
// ソートする項目を登録
function myfield_register_sortable( $sortable_column ) {
$sortable_column['meta_custom_field'] = 'meta_custom_field';
return $sortable_column;
}
add_filter( 'manage_edit-post_sortable_columns', 'myfield_register_sortable' ); //並べ替え可能にする
ソートできるようになると使い勝手が良くなると思います。
参考URL:
公式 関数リファレンス
【WordPress】プラグインなしでカスタムフィールド設置!All in One SEOも不要に




