仅当帖子上不存在帖子元键和值时才添加该帖子元键和值

时间:2016-09-21 作者:Lance

我在WooCommerce产品上有一个自定义字段,我正在将另一个产品的ID输入其中。保存该产品时,我将向输入的产品添加一个元字段,在它们之间创建一个“链接”。我有这个工作很好,但问题是,它添加了它,即使它已经存在了。

function part_fits($post_id){


   global $post;
   global $product;

  $current_diagram_id = get_the_ID();

   if( have_rows(\'product_association\') ):

     while( have_rows(\'product_association\') ): the_row();

    $single_part_id = get_sub_field(\'part\');

     add_post_meta($single_part_id, \'part_fits\', $current_diagram_id);


   endwhile;

      endif;



 }
是否有一种方法可以检查该键和值是否已经存在,并仅在不存在时添加它?

4 个回复
最合适的回答,由SO网友:Ahmed Fouad 整理而成

看起来你需要使用update_post_meta()

https://codex.wordpress.org/Function_Reference/update_post_meta

Source: WP Codex

函数update\\u post\\u meta()更新指定帖子的现有元键(自定义字段)的值。

This may be used in place of add_post_meta() function. 此函数要做的第一件事是确保$post\\u id上已经存在$meta\\u key。如果不存在,则调用add\\u post\\u meta($post\\u id,$meta\\u key,$meta\\u value),并返回其结果。

如果meta不存在,则返回meta\\u id,否则在成功时返回true,在失败时返回false。如果提交的值与数据库中已有的值相同,则返回false。

SO网友:Matt Sims

add_post_meta() 具有可选的第四个参数$unique – 设置为时true, 如果指定帖子的自定义字段中已存在给定键,则不会添加自定义字段。

函数将返回false 如果$unique 参数设置为true 并且具有给定密钥的自定义字段已存在。

SO网友:Kerry Randolph

我会使用$product->meta\\u exists函数,如下所示:

if( !$product->meta_exists( $key ) ) {
  if( $new_val !== $existing_val ) {
    $product->update_meta_data( $key, $new_val );
  }
}
注意:不要忘记保存更改:

$product->save_meta_data();

SO网友:John White

那一句话:

“如果提交的值与数据库中已有的值相同,则返回false。”。。。非常重要(感谢艾哈迈德·福阿德),因为这完全违反直觉!当操作不是真正的失败时,您可以合理地期望数据库更新返回success(true)。但在这里,当数据保持不变时,Wordpress给出了失败(false)。这让我完全被愚弄了,因为除了投稿的笔记外,抄本中没有提到它!

您不认为“失败”意味着无法访问数据库吗?

因此,我使用了一个简短的函数来总结问题:

function check_update_post_meta( $postid, $key, $value ) {
    // Get the single/first value of this key in this post\'s meta
    $response = get_post_meta( $postid, $key, true );
    if ($response == $value) {
        // If the value is already set return true
        return true;
    } else {
        // Replace the old value with the new, or add a key into the db
        $response = update_post_meta( $postid, $key, $value );
    }
    return $response;
    // Now \'false\' means a failure to reach the database
    // Now \'true\' means the data now exists in the database without or with changes
    // A return int>0 means a new record with this ID was added
    // Note: It\'s not possible that the ID=1 when calling this function from within a post.
}

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在