web-dev-qa-db-fra.com

Autoriser les commentaires des invités sur un seul post

J'autorise les commentaires des invités qui ne sont pas encore inscrits à ne commenter qu'un seul post. Les autres articles doivent être commentés uniquement pour les utilisateurs enregistrés.

3
Amaca

Cela semble être une fonctionnalité utile. Pour obtenir ce dont vous avez besoin, vous devez changer trois choses:

  1. Ajoutez une case à cocher pour activer les commentaires anonymes par publication.
  2. Enregistrez la valeur de la case à cocher avec la publication.
  3. Filtrez les vérifications de l'exigence d'enregistrement de commentaire sur les vues de publication pour activer le formulaire de commentaire et sur l'action de sauvegarde de commentaire réelle pour les laisser passer.

La case à cocher

Si vous ouvrez l’écran Options d’écransur une page d’éditeur de publication, vous pouvez activer la discussion metabox. Nous allons ajouter notre case à cocher à cette metabox:

enter image description here

Nous avons de la chance, il y a un crochet: 'post_comment_status_meta_box-options'. Utilisons-le:

add_action( 'post_comment_status_meta_box-options', 'acpp_checkbox' );
/**
 * Print a checkbox into the comment status metabox.
 *
 * @wp-hook post_comment_status_meta_box-options
 * @param   object $post
 * @return  void
 */
function acpp_checkbox( $post )
{
    $key = '_allow_anonymous_comments';
    $current = get_post_meta( $post->ID, $key, TRUE );

    printf(
        '<br /><label for="%1$s">
        <input type="checkbox" id="%1$s" name="%1$s" class="selectit" %2$s/> %3$s
        </label>',
        $key,
        checked( 1, $current, FALSE ),
        apply_filters( 'acpp_metabox_label', 'Allow anonymous comments.' )
    );
}

Comme vous pouvez le constater, j’ai inventé une nouvelle clé de méta-clé '_allow_anonymous_comments'. Le trait de soulignement principal le cachera dans les champs personnalisés metabox. (Connexes: Comment supprimer un champ personnalisé "suggestions" de la liste déroulante )
Si la méta-valeur existe déjà et si elle est égale à 1 on la présélectionne .

Le filtre 'acpp_metabox_label' existe pour permettre aux auteurs de thèmes de traduire cette valeur. J'étais trop paresseux pour ajouter un fichier de langue pour juste une petite chaîne…

Enregistrer la méta valeur

Pour enregistrer notre valeur, nous accrochons dans 'save_post', exécutons quelques vérifications et stockons le résultat sous forme d'entier:

add_action( 'save_post', 'acpp_save' );
/**
 * Save the checkbox value as number
 *
 * @wp-hook save_post
 * @param   int $post_id
 * @param   object $post
 * @return  void
 */
function acpp_save( $post_id, $post )
{
    // AJAX autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;

    // Some other POST request
    if ( ! isset ( $_POST['post_type'] ) )
        return;

    // Missing capability
    if ( ! current_user_can( 'edit_' . $_POST['post_type'], $post_id ) )
        return;

    $key = '_allow_anonymous_comments';

    // Checkbox successfully clicked
    if ( isset ( $_POST[ $key ] ) and 'on' === strtolower( $_POST[ $key ] ) )
        return update_post_meta( $post_id, $key, 1 );

    // Checkbox deselected
    delete_post_meta( $post_id, $key );
}

Filtrer les contrôles d'enregistrement

Et maintenant, nous devons utiliser cette valeur sur le front-end et changer le résultat pour les contrôles sur l'option comment_registration. Nous ne voulons pas changer la valeur du blog dans wp-admin:

enter image description here

C’est pourquoi nous ajoutons une vérification de is_admin() à ce filtre. Le filtrage des vérifications d'option est en réalité simple: connectez-vous à 'pre_option_' . $option_name et renvoyez toute autre valeur que FALSE. Puisque nous ne voulons pas non plus renvoyer TRUE, nous tromperons cette vérification en retournant 0.

add_filter( 'pre_option_comment_registration', 'acpp_comment_reg_filter' );
/**
 * Trick the registration checks on front-end
 *
 * Important: If we return FALSE, the filter will be effectively ignored.
 * It has to be any other value.
 *
 * @wp-hook pre_option_comment_registration
 * @return bool|int
 */
function acpp_comment_reg_filter()
{
    if ( is_admin() )
        return FALSE;

    $key     = '_allow_anonymous_comments';
    $post_id = 0;

    // Only available on wp-comments-post.php, not on regular post pages.
    if ( isset( $_POST['comment_post_ID'] ) )
        $post_id = (int) $_POST['comment_post_ID'];

    //
    $post = get_post( $post_id );
    $open = get_post_meta( $post->ID, $key, TRUE );

    if ( 1 == $open )
        return 0;

    return FALSE;
}

Cette vérification est utilisée par WordPress pour le formulaire de commentaire, les liens de réponse de commentaire sur les commentaires de fil de discussion et lorsqu'un commentaire est enregistré dans wp-comments-post.php.

Brancher

C'est tout. Vous pouvez télécharger le code en tant que plugin sur GitHub:
Plugin Commentaires anonymes par message

3
fuxia