Respuestas de comentarios sin hilos con enlace al comentario original

10

Explicaré lo que estoy tratando de lograr.

Me gustaría tener comentarios regulares sin hilos (planos / clásicos) con un enlace de respuesta a cada comentario. Cuando alguien responde a un comentario, el comentario de respuesta terminará en la parte superior (o inferior) como el último comentario tal como lo haría en los comentarios sin hilos predeterminados, pero a diferencia del comentario sin hilos predeterminado, la respuesta debe mostrar un enlace a El comentario original / autor.

Hay una solución propuesta en el foro de WordPress:

http://wordpress.org/support/topic/reply-to-link-for-chronological-non-threaded-comments

Simplemente no lo hago funcionar. No estoy seguro de en qué archivos está colocando el póster las diferentes piezas de código. Intenté usar el código y enganchar una función para comment_post:

add_action('comment_post', 'print_reply_link', 10, 2);

function print_reply_link( $comment_id, $approved ){
  if( $approved ){
    $comment = get_comment( $comment_id );
    if ( $comment->comment_parent ) {
    $parent = get_comment( $comment->comment_parent );
    $parent_link = esc_url( get_comment_link( $comment->comment_parent ) );
    printf( ' in reply to <a href="%1$s">%2$s</a>', $parent_link, $parent->comment_author );
    } 
  }
}

Esto devolvió una página en blanco con "en respuesta al nombre del autor ". Después de volver a cargar la publicación, aparece un comentario de respuesta correctamente pero sin ningún enlace al comentario original

Mis habilidades de codificación son realmente muy básicas, así que no tengo una buena idea de cómo debo proceder. Estaría muy agradecido por cualquier ayuda.

sarytash
fuente
¿Cuál es el contenido de hrefen el asiguiente 'en respuesta a' según la herramienta 'Inspeccionar elemento' en Chrome (o similar en su navegador de elección)?
mor7ifer
He resuelto el problema después de muchas pruebas y errores. El truco consistía en obtener las piezas de código en el orden correcto y los lugares en los archivos de comentarios y funciones. El sen %1$slos medios que el argumento es tratado y presentado como una cadena. Esto se explica en detalle en el manual de php para la función sprintf: php.net/manual/en/function.sprintf.php
sarytash
3
Debe presentar lo que hizo como solución para ayudar a mantener el sitio organizado y para ayudar a cualquier persona que lo persiga con el mismo problema a superarlo de manera rápida y eficiente.
mor7ifer
Sí, si pudiera publicar una solución de trabajo que sería genial.
Borek Bernard
1
De acuerdo, me encantaría ver esto en acción.
helgatheviking

Respuestas:

4

Esta es mi solución y no la solución propuesta sugerida en los foros de WordPress. Resulta ser bastante fácil, pero implica unos pocos pasos.

1) Vaya a wp-admin-> Configuración-> Discusión y apague los comentarios enhebrados. Esto deshabilitará el enhebrado, lo que queremos, pero también eliminará la capacidad de "responder" a un comentario en particular. Tenemos que volver a poner eso.

2) Agregue el script a continuación a las funciones de su tema.php o a un complemento.

function load_script_for_fake_threading() {
    if (is_singular()) wp_enqueue_script('comment-reply');
}
add_action('wp_enqueue_scripts','load_script_for_fake_threading');

3) La impresión de los comentarios se maneja mediante una devolución de llamada a wp_list_comments . TwentyEleven utiliza la función twentyeleven_comment()en su functions.php. Si su tema no tiene una devolución de llamada, deberá crear uno. Por defecto, se utiliza el contenido del método start_el de la clase Walker_Comment en "wp-includes / comment-template.php". Copie eso o copie la devolución de llamada del tema y cambie el nombre de la función a fake_threaded_comment.

3) Busque la función wp_list_comments en su tema comments.phpy cambie la devolución de llamada. Debería verse así:

wp_list_comments(array('callback'=>'fake_threaded_comment'));

4) Ahora vamos a hacer trampa un poco. En esa devolución de llamada, 'fake_threaded_comment', debería haber una llamada a la función comment_reply_link . Necesitamos editarlo para que pasemos los argumentos codificados de 'profundidad' y 'max_depth'. Estamos configurando 'profundidad' en 1 y max_depth en 2. Esto obtendrá nuestro botón / enlace "Responder".

comment_reply_link( 
  array_merge( 
    $args, 
      array( 
        'reply_text' => __( 'Reply <span>&darr;</span>', 
        'themetextdomainname' ), 
        'depth' => 1, 
        'max_depth' => 2 
)));

5) Configure el enlace al comentario principal. Al lado de la función de devolución de llamada, puede haber notado referencias $comment. $comment->comment_parentes el ID del comentario respondido y get_comment_link($comment->comment_parent)proporciona la URL del comentario primario (no el marcado de anclaje completo). get_comment($comment->comment_parent)obtendrá los datos del comentario principal. Entonces, algo así como ...

$pcom = get_comment($comment->comment_parent);
echo '<a href="'.get_comment_link($comment->comment_parent).'">This is a reply to '.$pcom->comment_author.'</a>';

Eso es. Ahora puede comentar comentarios particulares, pero una vez publicado, el comentario aparecerá al final o al principio de la lista de comentarios, según el orden de carga.

Probado con TwentyEleven en WordPress 3.4.1 (un poco desactualizado pero ya está en mi servidor de desarrollo). Estoy seguro de que hay cosas que los temas o complementos podrían hacer para romper esto, pero no creo que un tema o complemento con buen comportamiento lo rompa.

Esa es mi buena acción del día. Avísame si algo sale mal.

s_ha_dum
fuente