WordPress自定义字段应该是唯一的。有可能吗?

时间:2014-07-14 作者:Damith

我有一个名为“website\\u url”的自定义字段。它应该是唯一的。

例如:如果作者设置“https://wordpress.stackexchange.com/questions/ask作为post的自定义字段值https://wordpress.stackexchange.com/questions/ask“不能用于任何其他帖子。

怎么做?

2 个回复
SO网友:gmazzap

您可以使用过滤器挂钩\'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),也没有人可以添加非唯一的元值。

SO网友:Thamisetty Krishna Mohan

您可以使用以下代码添加自定义错误消息

  if ( ! empty( $exists ) ) {
    $post_id  = get_post_meta_by_id($exists[0])->post_id;
    wp_die( __( $key.\' - \'. $value .\' already exists for Post ID:\'.$post_id));
    return FALSE;
  }

结束

相关推荐