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