web-dev-qa-db-fra.com

Lorsqu'un utilisateur crée une publication (en attente), envoyez un lien de confirmation lui permettant de publier.

J'ai une autre question pour vous les gars!

J'ai besoin de la chose suivante:

  1. L'utilisateur crée une publication (la met automatiquement en attente d'approbation)
  2. Envoyer à l'utilisateur un email avec un lien de confirmation
  3. L'utilisateur clique sur le lien
  4. Les messages seront définis pour être approuvés et affichés automatiquement.

Comment cela peut-il être créé? Existe-t-il des points d'ancrage dans Wordpress pour créer un tel lien de confirmation?

3
Cas

Vous avez besoin d’une fonction qui accroche dans post status transitions et que vous envoyez un e-mail contenant un lien contenant des variables de vérification et une fonction prenant ces variables, vérifiez-les et, si tout est correct, mettez à jour le statut des messages.

Je pense que le code suivant est explicite, et les commentaires fournissent une aide supplémentaire:

add_action('new_to_pending', 'send_approve_link');
add_action('draft_to_pending', 'send_approve_link');
add_action('auto-draft_to_pending', 'send_approve_link');
add_action('init', 'approve_post');

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

function send_approve_link( $post ) {
  // get author of post
  $author = new WP_User($post->post_author);
  // create a key for security check and save as meta
  $check = md5( $author->user_email . $post->ID  );
  update_post_meta( $post->ID, '_approve_key', $check);
  // set the content for the email
  $content = '<p>Please click following link to allow the publishing of your post: &quot;';
  $content .= esc_html( get_the_title($post->ID) ) . '&quot;</p>';
  // create an url vor verify link with some variables: key, post id, and email
  $url = add_query_arg( array('email'=>$author->user_email,'approve'=>$post->ID), site_url() );
  $content .= '<p><a href="' . $url . '">Click to Confirm</a></p>';
  $from = get_bloginfo('name');
  $from_email = get_option('admin_email');
  $headers = 'From: ' . $from . ' <' . $from_email . '>' . "\r\n";
  // sending email in html format
  add_filter( 'wp_mail_content_type', 'set_html_content_type' );
  wp_mail( $author->user_email, 'Confirm your Post', $content, $headers);
  remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
}

function approve_post( ) {
  if ( isset($_GET['approve']) && isset($_GET['email']) ) {
    // have we all variable needed?
    if ( empty($_GET['approve']) || ! filter_var($_GET['email'], FILTER_VALIDATE_EMAIL) ) return;
    // get post
    $post = get_post($_GET['approve']);
    // this post has an author?
    if ( ! isset($post->post_author) ) return;
    // is the post already published?
    if ( $post->post_status == 'publish' ) {
      wp_redirect( get_permalink($post->ID) );
      exit();
    } elseif ( $post->post_status != 'pending' ) { // was the post deleted by admin?
      return;
    }
    // get the author
    $author = new WP_User($post->post_author);
    // check author variable
    if ( ! isset($author->user_email) ) return;
    // verify email
    if ( $_GET['email'] != $author->user_email ) return;
    // verify key
    $key = get_post_meta( $post->ID, '_approve_key', true);
    if ( $key != md5( $author->user_email . $post->ID ) ) return;
    // ok, update status
    $post_data = array('ID' => $post->ID, 'post_status' => 'publish');
    $update = wp_update_post($post_data);
    // update failed...
    if ( ! $update ) return;
    // delete verify key
    delete_post_meta($post->ID, '_approve_key');
    // work finished, view the post
    wp_redirect( get_permalink($post->ID) );
    exit();
  }
}

C'est tout. Veuillez noter que le code est non testé .

4
gmazzap