web-dev-qa-db-fra.com

Envoyer un e-mail transactionnel: poste du premier utilisateur

Je souhaite ajouter cette partie de code à mon fichier functions.php afin que, lorsqu'un utilisateur crée son premier message, il reçoive un courrier électronique pour le féliciter.

function set_mail_html_content_type() {
    return 'text/html';
}

add_action( 'publish_post', 'author_publish_notice', 10 ,2 );

function author_publish_notice( $ID, $post ) {
    if( 'post' == $post->post_type && count_user_posts(the_author_meta('ID') == 1); ) {
        return;
    }
    $to = '[email protected]';
    $subject = 'Your Article Is Online';
    $message = '<h1>Congratulations!</h1> <p>Your article is now online and 
        is sure to receives trillions of comments. Please do hang around and answer any questions
        viewers may have!</p> <p><a href="' . get_permalink( $ID ) . '">' . $post->post_title . '</a></p>';

    add_filter( 'wp_mail_content_type', 'set_mail_html_content_type' );
    wp_mail( $to, $subject, $message ); 
    remove_filter( 'wp_mail_content_type', 'set_mail_html_content_type' );

}

Cependant, j'ai un doute sur cette ligne:

$to = '[email protected]';

Pour récupérer l'email de l'auteur, le codex montre ceci:

 <?php the_author_email(); ?> 

Cela aurait-il un sens? :

$to = the_author_email();

En outre, cela suffit pour ajouter la condition que le message est le premier message de l'auteur:

if( 'post' == $post->post_type && count_user_posts(the_author_meta('ID') == 1); )

Merci pour votre temps et votre aide

1
Graham Slick

Vous êtes proches - jetons un coup d'oeil à cette ligne:

if( 'post' == $post->post_type && count_user_posts(the_author_meta('ID') == 1); )
  1. Ce point-virgule est une erreur de syntaxe, PHP va barf - laissez-le aller
  2. the_author_meta() imprime les données, il ne retourne rien - utilisez get_the_author_meta() pour les comparaisons et les transferts
  3. La comparaison post-comptage doit être en dehors de l'appel de fonction - notez la différence entre les parenthèses: count_user_posts( $id ) == 1, pas count_user_posts( $id == 1 )

Cela dit, j'ai l’impression que cette condition (une fois corrigée) est l’inverse de ce que vous voulez - au moment où vous essayez de dire "si le type de message est post et que l’auteur a un message, ne fait rien ", alors que vous voulez réellement le contraire (?)

Dans ce cas, voici ce que je pense que vous recherchez:

if ( 'post' !== $post->post_type || count_user_posts( $post->post_author ) > 1 )
   return; // If the post is NOT a post, or the author has more than one post, bail

Voyez comment j'ai utilisé $post->post_author aussi? C'est l'ID utilisateur. Cela fait partie de l'objet post, pas besoin d'utiliser une fonction ici (malgré ce que j'ai dit à propos de get_the_author_meta() plus tôt).

Enfin, l'email: vous pouvez soit utiliser cette fonction auteur, soit récupérer directement l'objet utilisateur (c'est ce que l'ancien est un wrapper):

$user_email = get_user_by( 'id', $post->post_author )->user_email;

Tous ensemble maintenant:

function author_publish_notice( $ID, $post ) {
    if ( 'post' !== $post->post_type || count_user_posts( $post->post_author ) > 1 )
        return;

    $to = get_user_by( 'id', $post->post_author )->user_email;
    $subject = 'Your Article Is Online';
    $headers = array(
        'Content-Type: text/html',
        'From: [email protected]',
    );

    $message = '<h1>Congratulations!</h1> <p>Your article is now online and 
    is sure to receives trillions of comments. Please do hang around and answer any questions
    viewers may have!</p> <p><a href="' . get_permalink( $ID ) . '">' . $post->post_title . '</a></p>';

    wp_mail( $to, $subject, $message, $headers ); 
}

Vous verrez que j'ai également supprimé le filtre de type de contenu - . Vous pouvez transmettre les en-têtes de courrier en tant que quatrième paramètre à wp_mail() , séparés par un saut de ligne ou comme un tableau.

2
TheDeadMedic