Estoy tratando de cambiar el nombre del autor del comentario (o más específicamente, el autor de la revisión en WooCommerce) para que sea el nombre, el apellido, la inicial ( por ejemplo, «John D.» para «John Doe»).
Llegué a la mayor parte del camino con el siguiente código en functions.php, pero por alguna razón (quizás debido a cómo el comentario / revisión se envió) tiende a dejar en blanco el nombre y reemplazarlo con un punto («.») en algunas (no todas) las reseñas.
add_filter("get_comment_author", "my_comment_author", 10, 1); function my_comment_author( $author = "" ) { // Get the comment ID from WP_Query $comment = get_comment( $comment_ID ); if ( empty($comment->comment_author) ) { if (!empty($comment->user_id)){ $user=get_userdata($comment->user_id); $author=$user->first_name." ".substr($user->last_name,0,1)."."; // this is the actual line you want to change } else { $author = __("Anonymous"); } } else { $user=get_userdata($comment->user_id); $author=$user->first_name." ".substr($user->last_name,0,1)."."; // this is the actual line you want to change } return $author; }
Sin embargo, si modifico el código de esta manera como alternativa, siempre muestra el nombre completo:
add_filter("get_comment_author", "my_comment_author", 10, 1); function my_comment_author( $author = "" ) { // Get the comment ID from WP_Query $comment = get_comment( $comment_ID ); if ( empty($comment->comment_author) ) { if (!empty($comment->user_id)){ $user=get_userdata($comment->user_id); $author=$user->first_name." ".substr($user->last_name,0,1)."."; // this is the actual line you want to change } else { $author = __("Anonymous"); } } else { $author = $comment->comment_author; } return $author; }
Preferiría dejar los nombres reales en la base de datos intacto, y simplemente filtrar la salida en el lado público del sitio para comentarios (es posible que necesitemos su nombre completo para mostrar en otro lugar, pero realmente no podemos probarlo hasta que los autores de los comentarios se muestren correctamente).
Respuesta
Le falta un «NO» operador lógico (!) en su declaración if. Quiere decir «si el autor del comentario NO ESTÁ vacío». A partir de ahora, la función está leyendo que el autor no está vacío y por defecto a su declaración else que le dice que muestre el nombre completo del autor. Utilice el segundo bloque de código pero realice el siguiente cambio.
Cambie lo siguiente:
if ( empty($comment->comment_author) ) {
por:
if ( !empty($comment->comment_author) ) {
De lo contrario, parece correcto yo.
Comentarios
Respuesta
Tuve el mismo problema …
Aquí está mi código para eso:
add_filter( "comment_author", "custom_comment_author", 10, 2 ); function custom_comment_author( $author, $commentID ) { $comment = get_comment( $commentID ); $user = get_user_by( "email", $comment->comment_author_email ); if( !$user ): return $author; else: $firstname = get_user_meta( $user->id, "first_name", true ); $lastname = get_user_meta( $user->id, "last_name", true ); if( empty( $firstname ) OR empty( $lastname ) ): return $author; else: return $firstname . " " . $lastname; endif; endif; }
Comprueba si hay un nombre y apellido y los muestra. Si no los hay, se devuelve el autor habitual.
Responder
Hmm, después de unos minutos de depuración y lectura de este tema , He llegado a la conclusión de que es más fácil pasar por la función get_user_by ()
Así que pasé por get_user_by("email",$comment->comment_author_email)
y logré obtener los detalles del usuario incluso si el comentario / revisión se envía sin que el usuario haya iniciado sesión.
Este es mi código completo
add_filter("get_comment_author", "comments_filter_uprise", 10, 1); function comments_filter_uprise( $author = "" ) { $comment = get_comment( $comment_author_email ); if ( !empty($comment->comment_author_email) ) { if (!empty($comment->comment_author_email)){ $user=get_user_by("email", $comment->comment_author_email); $author=$user->first_name." ".substr($user->last_name,0,1)."."; } else { $user = get_user_by( "email", $comment->comment_author_email ); $author = $user->first_name; } } else { $user=get_userdata($comment->user_id); $author=$user->first_name." ".substr($user->last_name,0,1)."."; $author = $comment->comment_author; } return $author; }
if(!empty($comment->user_id))
aif($comment->user_id > 0)
comment_author_email
está registrado para un usuario actual. Si es así, toma el resto de los datos del usuario de esa manera.