web-dev-qa-db-fra.com

Comment envoyer du courrier aux abonnés à l'aide de wp_mail

Je commence tout juste à créer des plugins et j'essaie d'en créer un simple qui envoie une notification aux abonnés chaque fois que je publie un nouveau message.

Mon code jusqu'ici:

add_action( 'publish_post', 'vb_esa_update_email' ); 
function vb_esa_update_email( $post_id ) { 

    //verify post is not a revision 
    if ( !wp_is_post_revision( $post_id ) ) { 

        //gets subscirbers to send email to
        // WP_User_Query arguments
        $args = array (
            'role'           => 'Subscriber',
        );

        // The User Query
        $user_query = new WP_User_Query( $args );

        $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 .= "<a href='". $post_url. "'>" .$post_title. "</a>\n\n"; 
        //send email to 
        foreach($args as $email_address)
        {
            wp_mail($email_address, $subject, $message );
        }
    }
} 

Comment puis-je remplir un tableau avec la liste des abonnés auxquels envoyer les notifications?

1
gidea

Vous étiez sur la bonne voie lorsque vous avez construit votre WP_User_Query, mais vous n'utilisez pas le résultat de cette requête. Regarde ça:

 //verify post is not a revision 
if ( !wp_is_post_revision( $post_id ) ) { 

        //gets subscirbers to send email to
        // WP_User_Query arguments
        $args = array (
            'role'           => 'Subscriber',
        );


        // The User Query
        $user_query = new WP_User_Query( $args );

        // get email addresses from user objects
         $email_addresses = array();
        foreach ( $user_query->results as $user ) {
            $email_addresses[] = $user->user_email;
        }

        // build message
        $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 .= "<a href='". $post_url. "'>" .$post_title. "</a>\n\n"; 

        //send email to all emails
        wp_mail($email_addresses, $subject, $message );

}
  • nous bouclons tous les utilisateurs et construisons un tableau avec chaque adresse e-mail
  • nous utilisons ce tableau directement en tant que paramètre de wp_mail() (il supporte les tableaux)

Notez que vous auriez probablement besoin d'un service tiers pour envoyer plusieurs mails à la fois, ou vous pourriez avoir un problème avec votre fournisseur d'hébergement. Regardez Mandrill . Ils ont un plugin WordPress qui fonctionne bien avec la fonction wp_mail().

1
thomascharbit

Vous y êtes presque, mais vous ne récupériez aucune des adresses électroniques de votre requête d'utilisateur

Ce code doit faire ce que vous voulez, mais si ma compréhension de votre question est correcte, vous souhaitez envoyer un courrier électronique individuel à chaque abonné, ce qui n’est pas efficace.

Il serait préférable d’ajouter toutes les adresses e-mail à un tableau et de les envoyer en une fois (la fonction wp_mail les séparera correctement pour vous). Mieux encore, ajoutez les adresses au champ Cci, vos abonnés ne pourront pas voir les adresses de tous les autres abonnés.

add_action('publish_post', 'vb_esa_update_email'); 
function vb_esa_update_email($post_id){ 

    /** Ensure that the post is not a revision */
    if(wp_is_post_revision($post_id)) :
        return;

    /** Query all users who have the role 'Subscriber' */
    $args = array (
        'role'           => 'Subscriber',
    );
    $user_query = new WP_User_Query($args);

    /** Check to see if there are any matching users */
    if(!empty($user_query->results)) : 

        /** Set up the email subject and message */
        $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.= "<a href='". $post_url. "'>" .$post_title. "</a>\n\n"; 

        /** Send an individual message to each user */
        foreach($user_query->results as $user) :

            wp_mail($user->data->user_email, $subject, $message);

        endforeach;

    endif;

}
0
David Gard