您可以使用过滤器挂钩\'add_post_metadata\'
和\'update_post_meta\'
, 当函数挂接在那里时NULL
添加/更新元数据的过程已停止。
两个钩子传递几乎相同的参数:
只有最后一个参数不同,如果更新是前一个值,如果添加是$unique
传递给的值add_post_meta
.
其想法是:
为两个挂钩运行筛选器回调使用自定义SQL查询以确保该值唯一该值已被使用,然后返回除NULL
示例:
add_filter( \'add_post_metadata\', \'my_unique_url_meta\', 10, 4 );
add_filter( \'update_post_metadata\', \'my_unique_url_meta\', 10, 4 );
function my_unique_url_meta( $null, $pid, $key, $value ) {
// here I assume the meta key to force unique is "url", change this to fit your needs
if ( $key !== \'url\' ) return $null;
global $wpdb;
$exists = $wpdb->get_col( $wpdb->prepare(
"SELECT meta_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = %s",
$key, $value
) );
// return anything but NULL stop the process, however returning FALSE is the only way
// to obtain a "pretty" error message by WordPress in post admin screen
if ( ! empty( $exists ) ) return FALSE;
}
使用前面的代码,当元键的元字段已经存在时,您会收到一条错误消息,如“请提供自定义字段值”就像您没有提供任何自定义字段值一样,恐怕无法更改该消息。此外,如果在为自定义字段添加了已使用的元值之后,直接保存/更新帖子(在单击元框内的“添加自定义字段”按钮之前),则不会看到错误消息,但重新加载页面时,自定义字段就不在了。
Previuos警告仅适用于核心“自定义字段”元盒,但您可以使用自定义元盒作为唯一的元键,并使用ajax显示正确的错误消息,然而,我的代码确保,即使使用代码(而不是UI),也没有人可以添加非唯一的元值。