我开发了一个WordPress插件,需要在保存自定义帖子类型的帖子时执行其他处理。
最合乎逻辑的解决方案是使用“save_post”操作。在被调用时,操作处理程序在自定义表中创建或更新数据库记录(取决于是否单击“创建帖子”或“更新帖子”)。
我已经实现了这个并且它似乎工作得很好,但是我想解决一个小问题。在第一次加载“创建帖子”页面时(即在输入任何用户输入之前和按下提交新/更改按钮之前),似乎也会触发“save_post”。
这意味着自定义数据库表将为每个保存的新帖子填充一个空行。这也意味着每次加载帖子页面时都会有一个空白行。
以下是我的“save_post”处理程序的简化版本:
function do_save_post($post_id) {
if (get_post_type($post_id) !== 'mycustomtype')
return $post_id;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
return $post_id;
if (!current_user_can('edit_mycustomtype'))
return $post_id;
echo 'This happens when selecting "Add New" from admin sidebar.';
echo 'Even though post has not been saved or updated.';
echo 'This should only happen when button on right of editor is clicked.';
}
如何检测帖子是否实际被保存?
答案 0 :(得分:18)
我遇到了同样的问题并查看了post.php的相关部分。事实上,每当post.php运行时都会调用save_post,因此你将在创建帖子,列表等时运行它。
在WP 3.1中,“post_updated”仅在post.php中的save / create事件中调用。所以我用过:
add_action('post_updated', 'some_function');
希望这也适合你。
答案 1 :(得分:5)
使用'post_updated'钩子往往会有问题,特别是在使用自定义帖子类型时。相反,我用它作为我的解决方案:
function do_save_post($post_id){
$post = get_post($post_id);
if($post->post_status == 'trash' or $post->post_status == 'auto-draft'){
return $post_id;
}
echo "do stuff";
}
我也不想在将项目发送到垃圾箱时执行任何操作。
答案 2 :(得分:2)
只要创建或更新帖子或页面,就可以运行此挂钩,这可以来自导入,发布/页面编辑表单,xmlrpc或通过电子邮件发送。所以我猜它也会在保存修订版后运行。如果我在哪里,我将检查是否设置了postID(是钩子函数应该获得的唯一参数),以及它是否是修订版wp_is_post_revision()
。
答案 3 :(得分:1)
您可能只想检查数据是否实际发布。
if(isset($_POST['post_title'])){
//do stuff
}