カテゴリー
SugiBlog ホームページ制作・システム開発|大阪

カスタムフィールドを追加し、常に投稿画面に表示させる – WordPress

記事を新規投稿する際、プラグインを使用せずカスタムフィールドの入力欄をデフォルトで表示させる、という方法があったのでご紹介します。
自作のオリジナルテーマであることが前提です。

テーマの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も不要に

この記事がお役に立ちましたらシェアお願いします

1,897 views

コメントは受け付けていません。