WordPress问题“save_post”动作

时间:2011-03-25 14:59:34

标签: php mysql wordpress-plugin wordpress

我开发了一个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.';
}

如何检测帖子是否实际被保存?

4 个答案:

答案 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
}