web-dev-qa-db-ja.com

投稿一括編集アクションのトリガーを取得し、編集後の投稿IDを取得する方法

投稿のpostmetaが期待される値に変更された場合、私は電子メールを送りたいです。以前は、私は各投稿の投稿メタをチェックするためにループをしていました。ここではadmin_initフックでループを実行しています。しかし、これはサイトを遅くするので、私はこれを保存投稿でのみ行うことを考えています。 SO編集した投稿には期待しているメタ値が含まれている可能性があるので、メールを送信します。

$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を使うことを考えていました。投稿メタが期待される値に変更されているかどうかをチェックし、次にmailを行います。

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');

投稿メタが変更される可能性がある別の2つのシナリオがあります。それは一括編集クイック編集です。

クイック編集のために私はこれを見つけた

function check(){
var_dump($_REQUEST);//can able to get the post id, i can do the rest
}
add_action('check_ajax_referer','check');

しかし、一括編集のために私は何の手がかりも持っていません。私は検索してみました、 この答え 私は$_REQUESTactionpostidを含んでいるかもしれないことを知りました。だから私は一括編集のために$_REQUEST['action']にアクションがあるかもしれないと思ったが、私はこのようにしようとすると見つけることができません

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

add_action('admin_init','another_check');

私もこれcheck_admin_refererを見つけました、しかし、私がvarダンプするとき、それが印刷しないので、私は理解することができませんでした。これ(check_admin_referer)はうまくいくでしょうか、これに合いますか?編集した投稿IDを取得する簡単な方法は他にありますか?

一括編集で投稿IDのリストを取得するにはどうすればよいですか?それ以降、チェックを実行してそれに応じてメールを送信することができます。

1
sun

あなたの問題があるならば:

投稿のpostmetaが予想される値に変更されたら私は電子メールを送りたいです

なぜあなたは頼むのですか?

一括編集で投稿IDのリストを取得する方法を教えてください。

これは典型的な x/y問題です :問題があるときは、何を適用するかを尋ねるのではなく、その問題を解決する方法を尋ねてくださいあなたはが解決策だと思います...

詳細に進むと、メタフィールドが更新されたときにアクションを実行しますか?更新された瞬間を見ないでください。

投稿メタが更新されるたびに、WordPressはフック'updated_postmeta'をそのように呼び出します

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

$type'post'です。

お分かりのように、あなたはあなたがやりたいことをするのに十分な情報を持っています。

メタ 'send_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 );
}

このコードは、メタが更新されたときにのみ実行され、が追加されたときには実行されません。

メタも追加されたときに同じコードを実行するには、別のアクションを追加するだけです。

add_action( 'added_post_meta', 'listen_to_meta_change', 20, 4 );

どちらのフックも同じように機能し、同じ引数を渡しますので、両方に同じ関数を使用しても問題ありません。

1
gmazzap