從 WordPress 5.5 開始,register_meta() 函數(包括 register_post_meta())支持注冊元數據默認值。在此之前,只能像這樣注冊REST API模式的默認值:
register_meta(
'post',
'greeting',
array(
'single' => true,
'type' => 'string',
'show_in_rest' => array(
'schema' => array(
'type' => 'string',
'default' => 'hello',
),
),
)
);
但是,這僅適用于從REST API內進行的調用 – 使用get_post_meta()將無法獲取默認值。
WordPress 5.5 開始,可以傳遞一個默認值,該值將應用于任何元函數的所有調用,如下所示:
register_meta(
'post',
'greeting',
array(
'single' => true,
'type' => 'string',
'default' => 'hello',
'show_in_rest' => array(
'schema' => array(
'type' => 'string',
),
),
)
);
此次對register_meta()的改進,很像另一個函數register_setting(),自WordPress 4.7起,可以在register_setting()中注冊選項的默認值。
默認值還可以與對象子類型(在WordPress 4.9.8中引入)配對,以限制默認值的范圍。例如,如果插件注冊的自定義文章類型為product。開發(fā)人員可以注冊僅適用于product這個文章類型的默認值。如下所示:
register_post_meta(
'product',
'price',
array(
'single' => true,
'type' => 'string',
'default' => '0.00',
)
);
值得注意的是,將默認值注冊到這樣的自定義文章類型可能會帶來一些性能開銷。要確定當前文章ID是哪種文章類型,它必須加載該對象。有關更多詳細信息,請參見get_object_subtype。在大多數情況下,meta和主對象是同時加載的(例如使用WP_Query時),但是如果您的代碼除了加載meta數據以外還執(zhí)行其他操作,那么它現在也可以加載主對象類型。
非單一元數據
也可以注冊非單一(Non-Single)的默認值,如下所示:
register_post_meta(
'product',
'price',
array(
'single' => false,
'type' => 'string',
'default' => '0.00',
)
);
請求多個值時,如下所示:
$result = get_post_meta( 123, 'price', false );
上面的代碼將返回一個以0.00作為第一個值的數字數組。
驗證方式
注冊默認元值時,數據必須與提供的類型匹配。以下示例將觸發(fā)_doing_it_wrong通知提示hello不是整數(integer)。
register_meta(
'post',
'greeting',
array(
'single' => true,
'type' => 'integer',
'default' => 'hello',
)
);
新過濾器
如果您希望使用默認的元值進行一些真正的自定義,現在有一個過濾器:
$value = apply_filters( "default_{$meta_type}_metadata", $value, $object_id, $meta_key, $single, $meta_type );
這是一個動態(tài)過濾器,要求您添加元類型。這是一個用法示例:
function add_my_meta_value( $value, $object_id, $meta_key, $single ){
if( 'price' === $meta_key ) {
if ( ! $single ) {
$value = array( '0.99' );
} else {
$value = '0.99';
}
}
}
add_filter( 'default_post_metadata', 'add_my_meta_value', 10, 4 );
新函數
為了使此功能成為可能,WordPress 核心添加了兩個新函數:
get_metadata_raw()get_metadata_default()
現在,get_metadata()函數調用get_metadata_raw(),如果該值為null,則調用get_metadata_default()。因此,調用get_metadata()不再獲取原始值,這就是現在使用get_metadata_raw()的目的。
要了解跟多相關信息,請看#43941。





這個可以有