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.
Cela semble être une fonctionnalité utile. Pour obtenir ce dont vous avez besoin, vous devez changer trois choses:
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:
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…
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 );
}
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
:
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
.
C'est tout. Vous pouvez télécharger le code en tant que plugin sur GitHub:
Plugin Commentaires anonymes par message