0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPress 7.0のDataViewsで、プラグインのカスタムカラムを出す。register_post_meta + show_in_rest から

0
Posted at

前に「WordPress 7.0でプラグインが壊れる箇所」を書きました。その中で、いちばん影響が大きいのが、投稿一覧が従来のWP_List_TableからReact製のDataViewsに置き換わったことでした。今回は、その続きです。「壊れた」の次、「じゃあ7.0で自分のカスタムカラムをどう出すか」の実装を書きます。

先に答えを書きます。DataViewsはReactでできていて、サーバー側のPHPが組んだテーブルを描くわけではありません。だから、従来の manage_posts_columns でHTMLを足す発想では届きません。7.0でやることは、見せたいデータをREST API経由で読める形にして、React側のグリッドに拾わせる、です。要は「HTMLを足す」から「データを公開する」へ、考え方が変わります。(2026年7月時点。最終的には公式のフィールドガイドで確認してください)

従来のやり方が、なぜ効かないのか

6.x までは、こう書いていました。

// WordPress 6.x:フックでカラムを足し、PHPでセルのHTMLを出す
add_filter('manage_post_posts_columns', function ($cols) {
    $cols['my_score'] = 'スコア';
    return $cols;
});
add_action('manage_post_posts_custom_column', function ($col, $post_id) {
    if ($col === 'my_score') {
        echo esc_html(get_post_meta($post_id, 'my_score', true));
    }
}, 10, 2);

7.0の一覧はReactで描かれるので、この「PHPでセルのHTMLを出す」部分が、そのままは効きません。DataViewsは、データをREST APIから取ってきて、ブラウザ側でカラムやフィルタを組み立てます。つまり、まずデータがREST経由で見えていないと、React側はそのカラムを作れません。

手順1:メタをREST APIに公開する

いちばん大事な一歩です。見せたいメタを register_post_meta で登録するとき、show_in_rest => true を付けます。これで、React製のグリッドがそのメタを読めるようになります。

add_action('init', function () {
    register_post_meta('post', 'my_score', [
        'show_in_rest' => true,   // これが無いとDataViewsから見えない
        'single'       => true,
        'type'         => 'number',
        'auth_callback' => function () {
            return current_user_can('edit_posts');
        },
    ]);
});

show_in_rest が抜けていると、いくらReact側でカラムを足そうとしても、データが来ないので出ません。7.0でカスタムカラムが出ない、の多くは、まずここです。

手順2:Field APIで、見せ方を宣言する

7.0では、Field APIが広がって、カラムの見せ方を宣言的に書けるようになりました。以前は独自のReactコンポーネントを書かないと、通貨やファイルサイズの整形ができませんでしたが、formatgetValueFormatted で、コンポーネントを触らずに表示を整えられます。

// 例:数値スコアを、そのまま出すのではなく整形して見せる
const field = {
    id: 'my_score',
    label: 'スコア',
    getValueFormatted: ({ item }) => `${item.my_score ?? 0} 点`,
};

大きな選択肢リストを出すときは、7.0で入った adaptiveSelect が、要素が増えると自動でコンボボックスに切り替わります。数千件のDOMでブラウザが固まるのを防いでくれるので、フィルタUIを自前で作り込む前に、こちらを見ておくと楽です。

手順3:グループ化は groupBy オブジェクトで

6.9まで文字列だった groupByField は、7.0で groupBy オブジェクトに変わりました。ここは、旧コードのままだと動かない定番です。

// ❌ 6.9まで(動かない)
const view = { groupByField: 'status' };

// ✅ 7.0
const view = {
    groupBy: { field: 'status', direction: 'desc', showLabel: true },
};

確認:カラムが出ないときに見る順番

DataViewsでカスタムカラムが出ないときは、この順で切り分けます。

まず、メタがRESTに出ているか。/wp-json/wp/v2/posts を叩いて、自分のメタキーが meta に含まれているかを見ます。ここに無ければ、原因は show_in_rest です。React側の問題ではありません。

次に、権限。auth_callback や、メタの公開範囲で弾かれていないか。ログインユーザーの権限で見えているかを確かめます。

最後に、React側のフィールド登録。データはRESTに出ているのに一覧に出ないなら、フィールドの登録側(id がメタキーと一致しているか等)を見ます。

データが先、表示は後。この順で見ると、たいてい早く切り分けられます。

早見でまとめ

  • 7.0の一覧はReact製。PHPでセルのHTMLを出す従来のやり方は、そのままは効かない
  • 見せたいメタは register_post_metashow_in_rest => true を付けて公開する
  • 見せ方は Field API の format / getValueFormatted で宣言的に。独自コンポーネントは要らない
  • 大きな選択肢は adaptiveSelect、グループ化は groupBy オブジェクト(旧 groupByField は不可)
  • 出ないときは「RESTに出ているか → 権限 → フィールド登録」の順で切り分ける

7.0のDataViewsは、慣れるまでは面倒に見えます。ただ、考え方が「HTMLを足す」から「データを公開して、見せ方を宣言する」に変わっただけ、と分かると、意外と素直でした。役に立ったらストックして、7.0対応でカラムを出すとき見返してください。

参考(公式):


ふだんはraplsworks.comで、WordPressプラグイン開発やClaude Codeまわりのことを書いています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?