web-dev-qa-db-fra.com

Les commentaires ne respectent pas le paramètre display_name, comment créer un plugin pour surmonter ce problème

Lorsque je poste quelque chose sur Wordpress, il est posté avec mon nom d'affichage. Toutefois, si je change de nom d'affichage, les messages postés par moi seront mis à jour avec le nouvel auteur. Les commentaires resteront avec l'ancien nom.

Puisque dans mon site wordpress, les commentaires ne sont disponibles que pour les utilisateurs enregistrés et que le champ du nom d'affichage est masqué - ils ont des profils personnalisés, je voudrais écraser le nom d'affichage utilisé (il doit toujours correspondre au nom prénom et au dernier nom). J'ai donc essayé le hook the_author sans succès.

En regardant le code source, j'ai trouvé que le nom de l'auteur dans author_link est généré comme suit:

function get_comment_author( $comment_ID = 0 ) {
    $comment = get_comment( $comment_ID );
    if ( empty($comment->comment_author) ) {
        if (!empty($comment->user_id)){
            $user=get_userdata($comment->user_id);
            $author=$user->user_login;
        } else {
            $author = __('Anonymous');
        }
    } else {
        $author = $comment->comment_author;
    }
    return apply_filters('get_comment_author', $author);
}

Cela signifie que si comment_author est écrit dans la base de données, je ne peux pas l'utiliser de quelque manière que ce soit. Si ce n'est pas le cas, le nom d'utilisateur actuel de l'auteur du commentaire sera transmis au hook get_comment_author, où je pourrais interroger la base de données pour obtenir la ligne, et donc le nom et le prénom. Je n'aime pas que cette nouvelle requête soit nécessaire, mais je peux vivre avec cela si c'est le seul moyen. Mais quelles étapes dois-je effectuer pour que cela fonctionne. Pour le moment, comment_author est toujours écrit dans la base de données.

1
Maxim Krizhanovsky

Ce code fait le travail avec un filtre. Peu importe ce que le commentaire dit, le nom de l'auteur est.

Rien de particulièrement délicat à ce sujet. Devrait être explicite.

add_filter('get_comment_author', 'wpse31694_comment_author_display_name');
function wpse31694_comment_author_display_name($author) {
    global $comment;
    if (!empty($comment->user_id)){
        $user=get_userdata($comment->user_id);
        $author=$user->display_name;    
    }

    return $author;
}
2
Otto

N'oubliez pas que chaque profil définit son propre paramètre display_name et que, pour l'appliquer, vous pouvez vous connecter au filtre pre_user_display_name qui vous donne la possibilité de le modifier avant qu'un utilisateur ne soit mis à jour ou inséré. Malheureusement, cependant, pre_user_display_name ne transmet aucune information à part display_name qui est généralement user_login. Et vous ne pouvez même pas manipuler les données static dans vos fonctions pour attendre pre_user_first_name et pre_user_last_name car elles ne sont disponibles qu’après display_name.

Comme vous pouvez le voir dans le code que vous avez publié (http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/comment-template.php#L23) si la colonne comment_author est vide, La user est récupérée via get_userdata() (fournie avec la propriété user_id du commentaire), ce qui génère les données utilisateur via une requête de base de données.

Si j'ai bien compris, vous voulez éviter la requête supplémentaire (en particulier si get_userdata() devait être émis pour obtenir le $author), de sorte que la propriété comment_author de $comment (hydratée par l'appel get_comment()) devrait déjà contenir un nom d'affichage bien formaté pour éviter toute modification ultérieure. requêtes.

Ainsi, comment_author doit lui-même être stocké dans la base de données dans le format souhaité à partir du moment où le commentaire est stocké.

wp_new_comment()http://core.trac.wordpress.org/browser/tags/3.2.1/wp-includes/comment.php#L1302 est un excellent endroit pour commencer à chercher, comme il est appelé par wp-comments-post.php dès que vous postez un commentaire.

La toute première chose que vous voyez est l’application de filtre preprocess_comment. Vous pouvez donc modifier le comment_author immédiatement et conserver la version modifiée dans la base de données.

Vous avez votre user_ID, que vous pouvez utiliser pour obtenir les données de l'utilisateur et modifier le nom en conséquence. Pour éviter la requête supplémentaire pour les données utilisateur par le user_ID, vous pouvez toutefois utiliser le global $current_user, qui est déjà pré-hydraté avec les métadonnées de l'utilisateur.

Voici une preuve de concept simple:

function wpse31694_alter_comment_author( $commentdata ) {
    global $current_user;
    $commentdata['comment_author'] = $current_user->user_firstname.' '.$current_user->user_lastname;
    return $commentdata;
}
add_filter( 'preprocess_comment', 'wpse31694_alter_comment_author' );

Pour modifier les données comment_author saisies précédemment, qui contiennent le nom d'utilisateur au lieu du formulaire requis, vous pouvez planifier un simple Cron pour la fin de la nuit, qui passera par chaque chaque commentaire un par un et modifiez le comment_author pour former celui requis. Et en plus, vous pouvez wp_update_user() et permuter le display_name via le même cycle Cron, à vous de choisir.

0
soulseekah