描述

函数update_post_meta()更新指定帖子的现有元键(自定义字段)的值。

这可以用来代替add_post_meta()函数。这个函数首先要做的是确保$post_id上已经存在$meta_key。如果没有,则调用add_post_meta($ post_id,$ meta_key,$ meta_value),并返回其结果。

如果元不存在则返回meta_id,否则在成功时返回true,在失败时返回false。如果提交的值与数据库中已存在的值相同,它也返回false。

请注意,如果您的数据库排序规则不区分大小写(后缀_ci),那么update_post_meta和delete_post_meta和get_posts将使用大写或小写的键更新/删除/查询元记录。但是由于WordPress缓存,get_post_meta显然会区分大小写。有关更多信息,请参阅https://core.trac.wordpress.org/ticket/18210。

用法


<?php update_post_meta( $post_id, $meta_key, $meta_value, $prev_value ); ?> 

参数

$ POST_ID
(整数)(必需)包含要编辑的字段的帖子的ID。
默认值:无
$ meta_key
(string)(必需)您要编辑的自定义字段的键。(这应该是原始的,而不是针对数据库查询进行清理)
默认值:无
$ meta_value
(混合)(必填)自定义字段的新值。传递的数组将被序列化成一个字符串(这应该是原始的,而不是针对数据库查询进行清理)
默认值:无
$ prev_value
(混合)(可选)要更改的自定义字段的旧值。这是为了区分具有相同键的几个字段。如果省略,并且这个帖子和元键有多个行,则所有元值都将被更新。
默认值:空

返回值

(混合)
如果元不存在则返回meta_id,否则在成功时返回true,在失败时返回false。注意:如果传递给此函数的meta_value与数据库中已经存在的值相同,则此函数返回false。

例子

默认使用


<?php update_post_meta( 76, 'my_key', 'Steve' ); ?>

其他例子

假设一个帖子的ID为76,以及以下4个自定义字段:


[key_1] => 'Happy' [key_1] => 'Sad' [key_2] => 'Gregory' [my_key] => 'Steve'

//要将key_2的值更改为Hans:
<?php update_post_meta( 76, 'key_2', 'Hans' ); ?>
//将key_1的值从Sad改为Happy:
<?php update_post_meta( 76, 'key_1', 'Happy', 'Sad' ); ?>

现在这些字段将如下所示:


[key_1] => 'Happy' [key_1] => 'Happy' [key_2] => 'Hans' [my_key] => 'Steve'

注意:此功能将仅更新与条件匹配的第一个字段。

将第一个key_1的值从“ Happy”改为“ Excited”:


<?PHP 
  update_post_meta(76,'key_1','Excited','Happy');
  //要么
  update_post_meta(76,'key_1','Excited');
  //使用键“key_1”更改所有字段:
  $ key1_values = get_post_custom_values('key_1',76);
  foreach($ key1_values为$ value)
    update_post_meta(76,'key_1','Excited',$ value);
?>

编辑页面模板


<?php 
 update_post_meta( $id, '_wp_page_template', 'new_template.php' );
?>

有关更详细的示例,请转到post_meta函数示例页面。

角色逃避

Post元数据在存储时通过stripslashes()函数传递,因此在传递可能包含\转义字符的值(如JSON)时需要注意。

不要存储转义的值
考虑JSON值{"key":"value with \"escaped quotes\""}:


<?php
$escaped_json = '{"key":"value with \\"escaped quotes\\""}';
update_post_meta( $id, 'escaped_json', $escaped_json );
$broken = get_post_meta( $id, 'escaped_json', true );
/*
$broken, after passing through stripslashes() ends up unparsable:
{"key":"value with "escaped quotes""}
*/
?>

解决方法

通过使用函数wp_slash(在WP 3.6中引入)添加一个级别的\ escape,您可以补偿对stripslashes()的调用:


<?php
$escaped_json = '{"key":"value with \\"escaped quotes\\""}';
update_post_meta( $id, 'double_escaped_json', wp_slash( $escaped_json ) );
$fixed = get_post_meta( $id, 'double_escaped_json', true );
/*
$fixed, after stripslashes(), ends up being stored as desired:
{"key":"value with \"escaped quotes\""}
*/
?>

笔记

此函数使用update_metadata()。

源代码

update_post_meta()位于wp-includes/post.php

更改日志
自1.5.0起

有关

自定义字段: the_meta(), get_post_meta(), add_post_meta(), update_post_meta(), delete_post_meta(), get_post_custom(), get_post_custom_values(), get_post_custom_keys() (另请参见: post_meta函数示例)