如何仅在保存时过滤发布的内容

时间:2016-11-14 作者:gzbuaapzroyn

我想知道,只有在用户单击“保存”按钮或发布新帖子后,帖子才直接用新修订版保存,如何触发过滤器挂钩。

我的想法是替换帖子的特定部分,但我不需要在每次发送ajax自动保存请求或创建新帖子草稿时触发过滤器。

我现在正在使用此筛选器(不要注意var\\u dump)

        add_filter(\'wp_insert_post_data\', array(&$this, \'filter_post_data\'), \'99\', 2);
  function filter_post_data($data, $postarr)
    {
        var_dump($data);
        var_dump($postarr);
        exit;
        // Change post title
        return $data;
    }
每次将post数据保存到数据库时,都会触发此过滤器。但我只需要在用户单击“保存”按钮时触发此过滤器。

我怎样才能做到这一点?我是否应该检查帖子类型、状态。。。在里面postarr 确定是否要保存此帖子。如何确保在用户单击时保存帖子?(什么论据可以告诉我这一点)

谢谢

2 个回复
最合适的回答,由SO网友:jgraup 整理而成

看看\'save_post\'Post Status Transitions.

save_post 是在创建或更新帖子或页面时触发的操作,可以从导入、帖子/页面编辑表单、xmlrpc或通过电子邮件发布。帖子的数据存储在$\\u post、$\\u GET或全局$post\\u数据中,具体取决于帖子的编辑方式。例如,快速编辑使用$\\u POST。由于此操作在帖子保存后立即触发,因此您可以使用get\\u post($post\\u id)轻松访问此帖子对象

修订功能可以告诉您这是否是自动保存:wp_is_post_revision() / wp_get_post_revisions().

function wpse_save_post( $post_id ) {

    // If this is just a revision, so we can ignore it.
    if ( wp_is_post_revision( $post_id ) )
        return;

    $post_title = get_the_title( $post_id );
    $post_url = get_permalink( $post_id );
    $subject = \'A post has been updated\';

    $message = "A post has been updated on your website:\\n\\n";
    $message .= $post_title . ": " . $post_url;
}

add_action( \'save_post\', \'wpse_save_post\' );
在这里,您可以使用保存后更新帖子内容wp_update_post(). 但一定要避免无限循环。

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

        // unhook this function so it doesn\'t loop infinitely
        remove_action(\'save_post\', \'my_function\');

        // update the post, which calls save_post again
        wp_update_post( $my_args );

        // re-hook this function
        add_action(\'save_post\', \'my_function\');
    }
}
add_action(\'save_post\', \'my_function\');

SO网友:Benoti

您可以在函数中使用不同的语句来确定:

 function filter_post_data($data, $postarr){
    if ( is_admin() && defined( \'DOING_AJAX\' ) && DOING_AJAX ){
        exit;
    }
    // Change post title
    return $data;
 }
在您的情况下,过渡后操作可能更好,例如:

 add_action(  \'pending_to_publish\',  \'filter_post_data\', 10, 1 );
您可以发现所有这些Post status transitions

相关推荐

WooCommerce:Pre_Get_Posts中的复杂查询

我想在获取产品时添加一个复杂的过滤。我有一些产品,其中一些链接到自定义帖子类型</此自定义帖子类型有一个转发器字段根据cookie的不同,我应该只获取在此转发器字段中具有该值的产品,我知道我可以使用:add_filter( \'pre_get_posts\', \'fwp_archive_per_page\' ); 我知道我可以像这样设置额外的元查询:$query->set( \'meta_query\', array( \'relation\' => \'