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

发布于:
更新时间:2020-10-28

函数描述

此函数的作用是更新数据库中的文章(或页面或其他自定义文章类型),该函数需要传入一个数据库中存在的文章 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对象。

我们提供 WordPress主题和插件定制开发服务

本站长期承接 WordPress主题、插件、基于 WooCommerce 的商店商城开发业务。 我们有 10 年WordPress开发经验,如果你想 用WordPress开发网站, 请联系微信: iwillhappy1314,或邮箱: amos@wpcio.com 咨询。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

*