add_post_type_support()のパラメータが変わり、高機能パラメータを指定できるようになりました。
何が変わったのかソースコードまで読んだんですが、本筋以外でも気になるところがあって、PHPのプログラミングとして『そんなことしていいの?』と思っちゃった。
開発者向けの話です。テーマ・プラグインを作っている人は要チェック。
add_post_type_support()は何?
投稿記事(post)にはある機能やその編集画面にある機能を、固定ページやカスタム投稿タイプにも使いたいときに設定する関数です。
たとえば、固定ページにサムネイル(アイキャッチ画像)と抜粋、コメント欄を追加するサンプルです。
(固定ページにはサムネイル、抜粋、コメント欄が表示されないと想定)
<?php
function my_custom_init() {
add_post_type_support( 'page', [ 'thumbnail', 'excerpt', 'comments' ] );
}
add_action('init', 'my_custom_init');
高機能なカスタム機能は消えていたらしい
これまで、カスタム機能のパラメータを渡しても消えていたらしいです。
<?php
add_post_type_support( 'my_post_type', [
'custom_feature' => [
'setting-1' => 'value',
'setting-2' => 'value',
] ]
);
そうなの? と思ってしまいました。たとえば、固定ページにJetpackプラグインのSNS自動投稿を追加するときはできていたはずなのに。
<?php
add_post_type_support( 'page', 'publicize' );
もう1回、公式ガイドを読み返してみると、どうやら多次元配列(高機能なパラメータ)が消されてたみたいです。
使ったことないので見落としてました。
register_post_type()が多次元配列に対応
add_post_type_support()は最終的にregister_post_type()のパラメータsupportsに入って実行します。
そのregister_post_type()のsupportsが多次元配列に対応しました。
<?php
register_post_type(
'my_post_type', [
// ...
'supports' => [
'title',
'editor',
'custom_feature' => [
'setting-1' => 'value',
'setting-2' => 'value',
],
],
// ...
]
);
気になること
そもそもこんなパラメータ指定できたの? と思っちゃいました。
<?php
add_post_type_support( 'my_post_type', [
'custom_feature' => [
'setting-1' => 'value',
'setting-2' => 'value',
] ]
);
add_post_type_support()のコードの中身です。
function add_post_type_support( $post_type, $feature ) {
global $_wp_post_type_features;
$features = (array) $feature;
foreach ( $features as $feature ) {
if ( func_num_args() == 2 ) {
$_wp_post_type_features[ $post_type ][ $feature ] = true;
} else {
$_wp_post_type_features[ $post_type ][ $feature ] = array_slice( func_get_args(), 2 );
}
}
}
すごいデータのぶっ込み方ですね。配列のキー($feature)に配列をぶっ込んでます。
そしてこのコードのスゴイところは、想定していない第3パラメータ以降で高機能パラメータをぶっ込んでます。
(array_slice()のところ。)
正しいパラメータ指定
WP5.3ではadd_post_type_support()のコードはこうなってます。
<?php
function add_post_type_support( $post_type, $feature, ...$args ) {
global $_wp_post_type_features;
$features = (array) $feature;
foreach ( $features as $feature ) {
if ( $args ) {
$_wp_post_type_features[ $post_type ][ $feature ] = $args;
} else {
$_wp_post_type_features[ $post_type ][ $feature ] = true;
}
}
}
高機能なパラメータが指定できるように可変長パラメータになってます。(...$args)
そうなると正解はこうなんじゃないかな?
<?php
add_post_type_support( 'my_post_type', 'custom_feature', [
'setting-1' => 'value',
'setting-2' => 'value', ]
);
WordPress Codex
WordPress.orgリファレンス
PHP公式ドキュメント
公式ガイド
Miscellaneous Developer Focused Changes in 5.3 - Passing Arrays to Supports Argument When Registering Post Types