関数

register_and_do_post_meta_boxes() 関数を解説:WordPressでのデフォルトポストメタボックス登録とアクション実行方法

register_and_do_post_meta_boxes()関数は、WordPressの投稿編集画面で必要なメタボックスを自動で登録し、対応するアクションフックを実行する仕組みです。

これにより、サムネイル、カスタムフィールド、リビジョン、タクソノミーなど、投稿タイプに応じた編集画面の拡張が簡単に実現できます。

register_and_do_post_meta_boxes() の基本構造

引数の検証と取得

WordPressの投稿編集画面で用いられるregister_and_do_post_meta_boxes()関数は、まず渡された$postオブジェクトや投稿タイプに対して必要な情報を検証します。

具体的には、投稿タイプのサポート機能(例:サムネイルやカスタムフィールド、リビジョンなど)が有効かどうかをチェックし、必要なコールバック関数やオプション引数を取得する処理が含まれています。

例えば、下記のサンプルコードでは、投稿タイプがサムネイルに対応しているかどうかを判定して、引数を整える流れを示しています。

// $postオブジェクトの検証とサポート機能の確認例
function verify_and_setup_meta_box($post) {
    $post_type = $post->post_type;
    if (!post_type_supports($post_type, 'thumbnail')) {
        return; // サムネイルがサポートされていなければ処理を終了
    }
    $args = array('__back_compat_meta_box' => true);
    // サムネイル用メタボックス登録のためのパラメータを用意
    add_meta_box('postimagediv', 'Featured Image', 'post_thumbnail_meta_box', null, 'side', 'low', $args);
}
// 管理画面に「Featured Image」メタボックスが表示される

動的メタボックス登録処理

投稿タイプ別の条件分岐

この関数は、投稿タイプに応じて表示するメタボックスを動的に決定します。

例えば、通常の投稿と添付ファイル(attachment)とで、必要なメタボックスが異なります。

添付ファイルの場合、画像、音声、動画に別個の処理が施され、関連するメタボックスが必要に応じて登録されます。

条件分岐の例として、$post->post_typeの値に基づいて処理を切り替えるコードは以下のようになります。

// 投稿タイプに応じた動的な条件分岐例
if ('attachment' === $post->post_type) {
    // 添付ファイル用の挙動(例:画像編集用スクリプトの読み込み)
    wp_enqueue_script('image-edit');
    add_meta_box('submitdiv', 'Save', 'attachment_submit_meta_box', null, 'side', 'core');
} else {
    // 通常の投稿の場合はPublishメタボックスを登録
    add_meta_box('submitdiv', 'Publish', 'post_submit_meta_box', null, 'side', 'core');
}
// 投稿タイプごとに「Save」または「Publish」メタボックスが管理画面に表示される

内部処理フロー

内部処理では、各メタボックスの登録順序や引数設定、そしてレイアウトを決定するためのロジックが実行されます。

各メタボックスは固有のコールバック関数によりレンダリングされ、ユーザーが入力や編集を行えるような画面レイアウトが組み立てられます。

この処理の最後には、編集画面に反映するためのアクションフックの発火が余儀なくされます。

アクションフックの実行

add_meta_boxes アクション

メタボックスの基本登録が完了すると、add_meta_boxesというアクションが実行されます。

このアクションは、既定のメタボックスの登録後に、プラグインやテーマが追加のメタボックスを登録できるようにするためのものです。

例えば、特定の投稿タイプに対して独自の情報を追加する場合、以下のようにフックに紐づけることができます。

// custom meta boxを追加する例
add_action('add_meta_boxes', function($post_type, $post) {
    if ('post' === $post_type) {
        add_meta_box('custom-metabox', 'Custom Info', 'custom_info_meta_box', null, 'normal', 'high');
    }
}, 10, 2);
// 投稿編集画面に「Custom Info」メタボックスが追加される

do_meta_boxes アクション

do_meta_boxesアクションは、各コンテキスト(たとえば、sideやnormal)のメタボックスがレンダリングされる直前に実行されます。

このフックにより、出力前の最終的なカスタマイズ処理が可能となり、既存のメタボックスの内容を柔軟に変更することができます。

下記のサンプルコードは、特定のコンテキストに対するカスタマイズ例です。

// do_meta_boxes アクションを利用して、出力前に処理を加える例
add_action('do_meta_boxes', function($post_type, $context, $post) {
    if ('side' === $context && 'post' === $post_type) {
        // 必要であればここでメタボックス内容のフィルタをかける
    }
}, 10, 3);
// メタボックスレンダリング前に追加処理が実行される(画面上には通常通りメタボックスが表示される)

各種メタボックス登録の詳細

サムネイルおよび画像関連

サムネイルや画像関連のメタボックスは、ユーザーが投稿に対して画像を設定するための重要な機能です。

まず、current_theme_supports('post-thumbnails', $post->post_type)post_type_supports($post->post_type, 'thumbnail')で、該当の投稿タイプがサムネイルに対応しているかを確認します。

その後、ユーザーの権限チェック(例:current_user_can('upload_files'))を行い、条件を満たす場合に登録されます。

以下はサムネイル用メタボックス登録の具体例です。

// サムネイルサポートの有無を確認し、メタボックスを登録する例
if (current_theme_supports('post-thumbnails', $post->post_type) && post_type_supports($post->post_type, 'thumbnail')) {
    if (current_user_can('upload_files')) {
        add_meta_box('postimagediv', esc_html(get_post_type_object($post->post_type)->labels->featured_image),
            'post_thumbnail_meta_box', null, 'side', 'low');
    }
}
// 管理画面のサイドバーに「Featured Image」メタボックスが表示される

カスタムフィールド・ページ属性・著者情報

カスタムフィールド、ページ属性、著者情報は、投稿編集画面で利用者が詳細な設定や情報入力を行うための機能として重要です。

各フィールドは、それぞれのサポート状況やユーザー権限に応じ、動的にメタボックスとして登録されます。

たとえば、カスタムフィールドはpost_type_supports($post->post_type, 'custom-fields')で確認でき、対象の場合に表示されるようになっています。

// カスタムフィールド、ページ属性、著者情報のメタボックス登録例
if (post_type_supports($post->post_type, 'custom-fields')) {
    add_meta_box('postcustom', 'Custom Fields', 'post_custom_meta_box', null, 'normal');
}
if (post_type_supports($post->post_type, 'page-attributes') || count(get_page_templates($post)) > 0) {
    add_meta_box('pageparentdiv', get_post_type_object($post->post_type)->labels->attributes,
        'page_attributes_meta_box', null, 'side');
}
if (post_type_supports($post->post_type, 'author') && current_user_can(get_post_type_object($post->post_type)->cap->edit_others_posts)) {
    add_meta_box('authordiv', 'Author', 'post_author_meta_box', null, 'normal');
}
// 投稿編集画面に「Custom Fields」「Page Attributes」「Author」の各メタボックスが順次表示される

リビジョン関連処理

リビジョン機能は、投稿の履歴管理を行うための仕組みです。

リビジョンが2件以上存在する場合にのみ、リビジョン用のメタボックスが表示されるように条件分岐が組まれています。

リビジョン数は、wp_get_latest_revision_id_and_total_count($post->ID)で取得され、その結果によりメタボックスの登録が制御されます。

// リビジョン数の取得とメタボックス登録例
if (post_type_supports($post->post_type, 'revisions') && 'auto-draft' !== $post->post_status) {
    $revisions = wp_get_latest_revision_id_and_total_count($post->ID);
    if (!is_wp_error($revisions) && $revisions['count'] > 1) {
        add_meta_box('revisionsdiv', 'Revisions', 'post_revisions_meta_box', null, 'normal');
    }
}
// リビジョン数が2以上の場合、管理画面に「Revisions」メタボックスが表示される

コメント・ディスカッション設定

投稿に対するコメントおよびピンバックの許可状況により、ディスカッションに関するメタボックスが動的に登録されます。

例えば、comments_open($post)pings_open($post)のチェックにより、対象の場合にメタボックスが表示されるように設計されています。

また、投稿のステータスやコメントの件数を考慮して、ディスカッション設定の細かな制御が行われます。

// コメントとピンバックのチェックによるメタボックス登録例
if (comments_open($post) || pings_open($post) || post_type_supports($post->post_type, 'comments')) {
    add_meta_box('commentstatusdiv', 'Discussion', 'post_comment_status_meta_box', null, 'normal');
}
$statuses = get_post_stati(array('public' => true));
if (empty($statuses)) {
    $statuses = array('publish');
}
$statuses[] = 'private';
if (in_array(get_post_status($post), $statuses, true)) {
    if (comments_open($post) || pings_open($post) || $post->comment_count > 0 || post_type_supports($post->post_type, 'comments')) {
        add_meta_box('commentsdiv', 'Comments', 'post_comment_meta_box', null, 'normal');
    }
}
// 対象の投稿編集画面に「Discussion」と「Comments」のメタボックスがそれぞれ表示される

特殊な投稿タイプへの対応

添付ファイル (Attachment) の処理

添付ファイルの場合、画像だけでなく音声や動画に対しても専用のメタボックスが登録される仕組みを取り入れています。

投稿オブジェクトのpost_mime_typeをチェックし、ファイルの種類に応じた処理が実施されます。

音声ファイル対応

音声ファイルの場合、wp_attachment_is('audio', $post)関数によるチェックで判定し、音声専用のメタボックスが登録されます。

下記のコード例は、音声ファイル用のメタボックスを追加する方法です。

// 添付ファイルが音声の場合のメタボックス登録例
if ('attachment' === $post->post_type && $post->post_mime_type) {
    if (wp_attachment_is('audio', $post)) {
        // 音声用メタボックス登録
        add_meta_box('attachment-id3', 'Metadata', 'attachment_id3_data_meta_box', null, 'normal');
    }
}
// 管理画面に「Metadata」メタボックスが音声添付ファイル用に表示される

動画ファイル対応

動画ファイルに対しては、wp_attachment_is('video', $post)のチェックを行い、動画専用のメタボックスが登録される例があります。

下記のサンプルは、動画向けのメタボックス登録処理を示しています。

// 添付ファイルが動画の場合のメタボックス登録例
if ('attachment' === $post->post_type && $post->post_mime_type) {
    if (wp_attachment_is('video', $post)) {
        // 動画用メタボックス登録
        add_meta_box('video-meta', 'Video Details', 'video_details_meta_box', null, 'normal');
    }
}
// 管理画面に「Video Details」メタボックスが動画添付ファイル用に表示される

タクソノミー関連処理

投稿に関連するタクソノミーは、分類情報を表示するために個別のメタボックスが設定されます。

WordPressは、get_object_taxonomies($post)を利用して対象タクソノミーを取得し、各タクソノミーオブジェクトのプロパティによってメタボックスの表示可否を判断します。

階層型タクソノミー

階層型タクソノミーの場合、基本的にはタクソノミー名にdivが付加されたIDが利用され、シンプルなメタボックスが登録されます。

この場合、ユーザーはカテゴリーのように階層構造で情報を入力できるようになります。

// 階層型タクソノミー用メタボックス登録例
$taxonomy = get_taxonomy('category');
if ($taxonomy->show_ui && false !== $taxonomy->meta_box_cb) {
    $tax_meta_box_id = 'categorydiv';
    add_meta_box(
        $tax_meta_box_id,
        $taxonomy->labels->name,
        $taxonomy->meta_box_cb,
        null,
        'side',
        'core',
        array('taxonomy' => 'category')
    );
}
// 投稿編集画面のサイドバーに「カテゴリー」メタボックスが表示される

非階層型タクソノミー

非階層型タクソノミー(例:タグ)の場合は、IDの先頭にtagsdiv-が付加され、複数の選択肢からタグを入力する形式が採用されます。

この仕組みにより、タグ入力専用のインターフェースが提供されます。

// 非階層型タクソノミー用メタボックス登録例
$taxonomy = get_taxonomy('post_tag');
if ($taxonomy->show_ui && false !== $taxonomy->meta_box_cb) {
    $tax_meta_box_id = 'tagsdiv-post_tag';
    add_meta_box(
        $tax_meta_box_id,
        $taxonomy->labels->name,
        $taxonomy->meta_box_cb,
        null,
        'side',
        'core',
        array('taxonomy' => 'post_tag')
    );
}
// 管理画面に「タグ」メタボックスが表示される

投稿タイプごとの動作分岐とカスタマイズ

通常投稿と添付ファイルの違い

スクリプト・スタイルの読み込み

投稿タイプごとに必要なスクリプトやスタイルの読み込みは異なります。

添付ファイルの場合は、画像編集用など特定のスクリプトをエンキューする必要があります。

下記は、投稿タイプに応じたスクリプト・スタイルの読み込み例です。

// 投稿タイプによるスクリプトの読み込み例
if ('attachment' === $post->post_type) {
    wp_enqueue_script('image-edit'); // 添付ファイル用のスクリプト読み込み
} else {
    wp_enqueue_style('editor-style'); // 通常投稿用のスタイル読み込み
}
// 各投稿タイプに応じたスクリプトやスタイルが管理画面に適用される

登録されるメタボックスの条件

通常投稿と添付ファイルで登録されるメタボックスは異なります。

添付ファイルでは、ファイルの種類により「Save」メタボックスが、通常投稿では「Publish」メタボックスが利用されます。

条件分岐によって、これらのメタボックスの登録が行われる様子は下記のサンプルのようになります。

// 投稿タイプに応じたメタボックス登録の条件分岐例
if ('attachment' === $post->post_type) {
    add_meta_box('submitdiv', 'Save', 'attachment_submit_meta_box', null, 'side', 'core');
} else {
    add_meta_box('submitdiv', 'Publish', 'post_submit_meta_box', null, 'side', 'core');
}
// 添付ファイルと通常投稿で、それぞれ適切なメタボックスが管理画面に登録される

拡張性のための後方互換対応

古いアクションフックへの対応処理

WordPressは後方互換性を確保するため、古いアクションフックも一定期間サポートする設計となっています。

例えば、古いバージョンで使用されていたdbx_post_advancedアクションは、現在はadd_meta_boxesに置き換えられていますが、依然として挙動を保持するための措置が講じられています。

この仕組みにより、既存のプラグインやテーマとの互換性が保たれ、システム全体の安定性が維持されます。

// 古いアクションフックへの対応例(後方互換性のための実装)
do_action_deprecated('dbx_post_advanced', array($post), '3.7.0', 'add_meta_boxes');
// 古いアクションフックが呼び出された場合、デバッグ目的の警告が表示される(実際の画面表示には反映されない)

まとめ

本記事では、WordPressの投稿編集画面でメタボックスを動的に登録するための関数「register_and_do_post_meta_boxes()」の全体構造と処理の流れについて解説しています。

引数検証、投稿タイプ別の条件分岐、内部処理、及びadd_meta_boxesとdo_meta_boxesの各アクションフックの役割をサンプルコードと共に説明しています。

また、サムネイル、カスタムフィールド、リビジョン、コメント設定、添付ファイルやタクソノミーへの対応、投稿タイプごとのカスタマイズや後方互換対応についても具体例を示しながら理解を深める内容となっています。

関連記事

Back to top button
目次へ