当前浏览:首页 / WordPress函数 / update_post_meta()

update_post_meta( int $post_id, string $meta_key, mixed $meta_value, mixed $prev_value = '' )

根据给定的文章ID更新文章meta字段

post_meta 文章meta

updatemore...


描述

使用$prev_value参数区分具有相同键和post ID的meta字段。

如果文章的meta字段不存在,则将添加它并返回其ID。

可以用来代替add_post_meta()


参数

$post_id

(int)(必填) 文章ID

$meta_key

(string)(必填) 元数据(metadata)的 key

$meta_value

(mixed)(必填) 元数据值。如果不是标量,则必须是可序列化的。

$prev_value

(mixed)(可选) 更新前要检查的上一个值。如果指定,则仅使用此值更新现有元数据项。否则,更新所有条目。

默认值: ''


返回

(int|bool) 如果键不存在则为meta ID,更新成功时为true,失败时或者传递给函数的值与数据库中已有的值相同时为false。


更多信息

字符转义

文章meta值在存储时通过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, 通过stripslashes()后,最终无法解析:
{"key":"value with "escaped quotes""}
*/
?>

变通办法

通过使用函数wp_slash(在WP 3.6中引入)再添加一级 \ 转义,可以弥补对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, 在stripslashes()之后,最终被原样存储:
{"key":"value with \"escaped quotes\""}
*/
?>


源码

查看源码 官方文档


更新日志

版本描述
1.5.0开始引入

用户贡献的笔记

  • 贡献者:lucerny

    请注意,当$meta_value等于您试图在数据库中更新的值时,此函数也将返回false

  • 贡献者:Aurovrata Venet

    更新页面使用的模板,

    update_post_meta( $page_id, '_wp_page_template', 'new_template.php' );
    
  • 贡献者:Fiaz Husyn

    注意:如果一个键有多个值,如果未设置$prev_value,则所有值都将更新。

  • 贡献者:Codex

    其他示例
    假设一篇文章的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' );
    
    //Or
    
    update_post_meta( 76, 'key_1', 'Excited' );
    
    //To change all fields with the key "key_1":
    
    $key1_values = get_post_custom_values( 'key_1', 76 );
    foreach ( $key1_values as $value )
    	update_post_meta( 76, 'key_1', 'Excited', $value );
    ?>
    

    编辑页面模板

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

  • 贡献者:elmachoiq

    “重要信息:如果使用序列化数据,则使用额外的嵌套数组更新数组。
    为了保持相同的结构,请在第一个嵌套位置更新对象。”。

    $ticket_meta = get_post_meta($azgTorneoID,"mep_event_ticket_type",)
    $ticket_meta[0][0]["option_rsv_t"] = "9";
    update_post_meta($azgTorneoID,"mep_event_ticket_type",$ticket_meta[0]);
    
  • 贡献者:Drew Jaynes

    请注意,如果您的数据库排序规则不区分大小写(如后缀_ci)),则update_post_meta()delete_post_meta()以及get_posts()将更/删/查具有大写或小写键的meta记录。但是get_post_meta()由于WordPress缓存,将区分大小写。请参阅https://core.trac.wordpress.org/ticket/18210了解更多信息。

  • 贡献者:Codex

    默认用法

    <?php update_post_meta( $post_id = 76, $key = 'my_key', $value = 'Steve' ); ?>