wp_update_post 更新数据库中的文章、页面或自定义文章类型

文 / @WordPress主题

函数描述

这个函数的作用是更新数据库中的文章(或页面或其他自定义文章类型)。该函数需要传入一个数据库中存在的文章ID才能正常工作。

需要注意的是,文章更新时,现有文件将被复制一个文章版本。文章内容将会被新值替代,文章的分类方法、标签、关联到该文章的自定义字段等数据保持不变。

使用方法

<?php wp_update_post( $post, $wp_error ); ?>

参数

参数 数据类型 是否必需 描述 默认值
$post 数组|对象 文章数组或对象,数组元素和 wp_posts 数据表中的数据列是一对一关系 []
$wp_error 布尔值 允许失败时返回一个 WP_Error 对象 false

使用示例

调用 wp_update_post() 之前,我们需要创建一个包含必要文章元素的数组。和 wp_insert_post() 不一样的是:此函数只有文章ID参数是必需的,其他不需要更新的内容将保持原样不变。

//更新ID为37的文章
$my_post = array(
    'ID' => 37,
    'post_title' => '文章的新标题',
    'post_content' => '新的文章内容',
);

//更新文章到数据库
wp_update_post( $my_post );

处理 $wp_error

如果你的更新没有起作用,可能出现了某些错误。这时候,设置 $wp_error 为 true 可以显示错误信息以便调试。

wp_update_post( $current_item, true );

if ( is_wp_error( $post_id ) ) {
    $errors = $post_id->get_error_messages();
    foreach ( $errors as $error ) {
        echo $error;
    }
}

参数说明

分类目录

分类目录应该以分类ID数组的形式传入。即使只需要设置一个分类目录,该参数的值也必须为数组。

注意-死循环

当执行一个挂载到 save_post(比如一个自定义 metabox)的 action 时,wp_update_post() 有可能会产生一个死循环。死循环产生的原因是(1)wp_update_post() 调用了 save_post,文章版本生成时 (2)save_post 被调用了一次。

如果更新文章的过程中必须调用 save_post,则需要在更新文章之前先检查一下 post_type 不是 'revision',以确保 $post 对象确实需要更新。

同理,如果挂载到 edit_attachment 的函数包含了一个调用 wp_update_post() 的函数,也可以导致死循环。

要避免这个问题,更新文章之前先卸载 save_post 动作,更新完成之后,在把 save_post 动作添加上。如下面的演示代码:

function my_function( $post_id ) {
    if ( ! wp_is_post_revision( $post_id ) ) {

        //先卸载 save_post 动作,以避免死循环
        remove_action( 'save_post', 'my_function' );

        //更新文章
        wp_update_post( $my_args );

        //然后重新添加 save_post 动作
        add_action( 'save_post', 'my_function' );
    }
}

add_action( 'save_post', 'my_function' );

定时文章

如果想使用 wp_update_post() 定时发布一篇文章,除非传入 $my_post->edit_date=true 参数,否则 WordPress 将在更新草稿时忽略 post_date 参数。

返回值

(integer) 更新成功,将返回文章 ID,更新失败返回0或 $wp_error 对象。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。