web-dev-qa-db-fra.com

Comment obtenir le déclencheur d'action d'édition en bloc et obtenir les ID d'articles modifiés?

Je veux envoyer un email si un postmeta d'un post est modifié à la valeur attendue.Alors auparavant, je faisais boucle pour vérifier la méta de post dans chaque post. Ici, je lance la boucle dans le crochet admin_init. Mais cela ralentit le site, alors je pense que cela ne devrait être fait que par sauvegarde. SO l'article publié peut avoir la méta-valeur attendue, puis j'enverrai le courrier.

Précédent

$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();

Ceci est indésirable car seul certains messages peuvent être édités. Vérifier aveuglément les méta-post avec une boucle à chaque fois est un gaspillage.

J'ai donc pensé à utiliser sur save_post lors de la sauvegarde, nous vérifierons si la méta de la publication a la valeur attendue, puis nous ferons le mail.like ci-dessous

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

Il existe deux autres scénarios dans lesquels la méta de publication peut être modifiée, à savoir , édition en bloc et , édition rapide .

Pour l'édition rapide j'ai trouvé ceci

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

Mais pour l'édition en masse, je n'ai aucune idée. J'ai essayé de chercher, dans cette réponse , j'ai découvert que $_REQUEST peut contenir action et postid. J'ai donc pensé que pour l'édition en masse, il pourrait y avoir une action dans $_REQUEST['action'] mais je ne pouvais pas trouver quand j'essaie comme ça

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

add_action('admin_init','another_check');

J'ai trouvé ce check_admin_referer aussi mais je ne pouvais pas comprendre car il ne s'imprime pas quand je dump var. Cela (check_admin_referer) fonctionnera-t-il ou conviendra-t-il? Existe-t-il un autre moyen simple d'obtenir les identifiants de publication modifiés?

Comment puis-je obtenir la liste des identifiants de post sur édition en bloc? À partir de là, je peux faire la vérification et envoyer le courrier en conséquence

1
sun

Si votre problème est:

Je veux envoyer un email si un postmeta d'un post est modifié à la valeur attendue

Pourquoi demandez-vous:

Comment puis-je obtenir la liste des identifiants de post en bloc?

Ceci est un problème typique de x/y : quand vous avez un problème, demandez comment le résoudre, au lieu de demander comment appliquer quoi vous pensez est la solution ...

En allant dans les détails, vous voulez effectuer une action quand un méta-champ est mis à jour? Pourquoi ne pas simplement regarder .. le moment où il est mis à jour?

Chaque fois qu'une méta de publication est mise à jour, WordPress appelle le hook 'updated_postmeta' comme suit

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

$type est 'post'.

Comme vous pouvez le constater, vous avez suffisamment d’informations pour faire tout ce que vous voulez.

Supposons que vous souhaitiez envoyer un courrier électronique à l'auteur du message chaque fois que la méta "send_mail" est définie sur "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 );
}

Notez que ce code ne s'exécute que lorsqu'une méta est mise à jour , et non quand est ajouté .

Pour exécuter le même code lorsque la méta est également ajoutée, ajoutez simplement une autre action:

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

Les deux hooks fonctionnent de la même manière, en passant des arguments identiques, donc aucun problème pour utiliser la même fonction pour les deux.

1
gmazzap