如何获取帖子批量编辑动作触发器和编辑后的帖子ID?

时间:2014-04-05 作者:sun

我想发送电子邮件,如果一篇文章的邮戳更改为预期值。所以之前我在做循环检查每个帖子中的帖子元。我在这里运行循环admin_init 钩但这会减慢网站的速度,所以我想只在save post上这样做。因此,编辑后的文章可能具有我所期望的元值,然后我将发送邮件。

以前的

$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {

    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        if(get_post_meta($the_query->post->ID,\'custom_post_meta\',true)==\'ok\'){
        //mail() function goes here
        }
    }

} 

wp_reset_postdata();
这是不需要的,因为只有某些帖子可以编辑。每次盲目地用循环检查post-meta都是浪费。

所以我想用在save_post 保存时,我们将检查post meta是否更改为预期值,然后我们将发送邮件。如下所示

function testing($post_id){
    if(get_post_meta($the_query->post->ID,\'send_mail\',true)==\'ok\'){
        //mail() function goes here
        }
        //only for edited post alone i\'m checking here
}

add_action(\'save_post\',\'testing\');
还有另外两种可能更改post meta的场景,分别是bulk editquick edit

为了快速编辑,我找到了这个

function check(){
var_dump($_REQUEST);//can able to get the post id, i can do the rest
}
add_action(\'check_ajax_referer\',\'check\');
但对于批量编辑,我没有任何线索。我试着在this answer 我发现了$_REQUEST 可能包含actionpostid. 所以我认为批量编辑可能会在$_REQUEST[\'action\'] 但当我这样尝试时,我找不到

function another_check(){
var_dump($REQUEST[\'action\']);
}

add_action(\'admin_init\',\'another_check\');
我找到了这个check_admin_referer 也一样,但我无法确定,因为当我转储var时,它不会打印。这个会吗(check_admin_referer) 这是工作还是套装?有没有其他简单的方法来获取已编辑的帖子ID?

How can i get the List of post id on bulk edit? 从那时起,我可以进行检查并相应地发送邮件

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

如果您的问题是:

如果帖子的Posteta更改为预期值,我想发送电子邮件

您为什么要求:

如何在批量编辑时获取帖子id列表?

这是一个典型的x/y problem: 当你遇到问题时,问如何解决这个问题,而不是问如何应用你认为的解决方案。。。

在详细信息中,您想在更新元字段时执行操作吗?为什么不看看。。更新的那一刻?

每次更新帖子元时,WordPress都会调用挂钩\'updated_postmeta\' 就像这样

do_action("updated_{$type}_meta", $meta_id, $object_id, $meta_key, $meta_value);

哪里$type\'post\'.

正如你所见,你有足够的信息去做任何你想做的事情。

假设您希望每次将meta“send\\u mail”设置为“ok”时都向帖子作者发送邮件:

add_action( \'updated_post_meta\', \'listen_to_meta_change\', 20, 4 );

function listen_to_meta_change( $mid, $pid, $key, $value ) {
  if ( $key !== \'send_mail\' ) return; // if the key is not the right one do nothing
  $value = maybe_unserialize( $value );
  if ( $value !== \'on\' ) return; // if the value is not the right one do nothing
  // if we\'re here, the post meta \'send_mail\' was set to \'on\' for a post, let\'s get it
  $post = get_post( $pid );
  if ( $post->post_type !== \'post\' ) return; // maybe check for a specific post type?
  $recipient = new WP_User( $post->post_author ); // get the post author
  if ( ! $recipient->exists() ) return; // check if is a valid user

  static $sended = array();
  if ( ! isset($sended[$recipient->ID]) ) $sended[$recipient->ID] = array();
  if ( isset($sended[$recipient->ID][$pid]) ) {
    // already sent email for this user & post & request: that\'s enough, let\'s exit
    return;
  }
  $sended[$recipient->ID][] = $pid;

  // ok, send the email, you can write the function, by yourself, isn\'t it?
  // be sure to have control on how many emails you send to an user:
  // too much emails slow down your site and also make you a spammer...
  // probably you can take control that using an user meta...
  send_email_to_user_when_meta_updated( $recipient );
}
请注意,此代码仅在元数据更新时运行,而在添加元数据时不运行。

要在添加meta时运行相同的代码,只需添加另一个操作:

add_action( \'added_post_meta\', \'listen_to_meta_change\', 20, 4 );
这两个钩子都以相同的方式工作,传递相同的参数,所以对这两个钩子使用相同的函数没有问题。

结束