- 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も不要に