Réponses aux commentaires sans discussion avec lien vers le commentaire d'origine

10

Je vais expliquer ce que j'essaie d'accomplir.

Je voudrais avoir des commentaires réguliers non-filetés (plats / classiques) avec un lien de réponse à chaque commentaire. Lorsque quelqu'un répond à un commentaire, le commentaire de réponse se terminera en haut (ou en bas) en tant que dernier commentaire, comme il le ferait dans les commentaires non filetés par défaut, mais contrairement au commentaire non fileté par défaut, la réponse devrait afficher un lien vers le commentaire / auteur d'origine.

Il y a une solution proposée sur le forum wordpress:

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

Je n'arrive tout simplement pas à le faire fonctionner. Je ne sais pas dans quels fichiers l'affiche place les différents morceaux de code. J'ai essayé d'utiliser le code et d'accrocher une fonction à 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 );
    } 
  }
}

Cela a renvoyé une page vierge avec "en réponse à authorname ". Après avoir rechargé le message, un commentaire de réponse s'affiche correctement mais sans aucun lien vers le commentaire d'origine

Mes compétences en codage sont vraiment très basiques, donc je ne sais pas comment je dois procéder. Serait très reconnaissant pour toute aide.

sarytash
la source
Quel est le contenu de hrefla aqui suit « dans to` de réponse selon l' « outil Inspecter l' élément » dans Chrome (ou similaire dans votre navigateur de choix)?
mor7ifer
J'ai résolu le problème après de nombreux essais et erreurs. L'astuce consistait à mettre les morceaux de code dans le bon ordre et à les placer dans les fichiers de commentaires et de fonctions. L' sentrée %1$ssignifie que l'argument est traité et présenté comme une chaîne. Ceci est expliqué en détail dans le manuel php pour la fonction sprintf
sarytash
3
Vous devez soumettre ce que vous avez fait comme solution pour aider à garder le site organisé et pour aider toute personne qui vient après vous avec le même problème à le surmonter rapidement et efficacement.
mor7ifer
Oui, si vous pouviez publier une solution de travail qui serait formidable.
Borek Bernard
1
convenu, aimerait voir cela en action.
helgatheviking

Réponses:

4

C'est ma solution et non la solution proposée suggérée sur les forums WordPress. Cela s'avère assez facile, mais implique quelques étapes.

1) Accédez à wp-admin-> Paramètres-> Discussion et désactivez les commentaires filetés. Cela désactivera le filetage, ce que nous voulons, mais nous supprimera également la possibilité de «répondre à» un commentaire particulier. Nous devons remettre cela.

2) Ajoutez le script ci-dessous au functions.php de votre thème ou à un plugin.

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) L'impression des commentaires est gérée par un rappel à wp_list_comments . TwentyEleven utilise la fonction twentyeleven_comment()dans son functions.php. Si votre thème n'a pas de rappel, vous devrez en créer un. Par défaut, le contenu de la méthode start_el de la classe Walker_Comment dans "wp-includes / comment-template.php" est utilisé. Copiez cela ou copiez le rappel du thème et renommez la fonction en fake_threaded_comment.

3) Recherchez la fonction wp_list_comments dans votre thème comments.phpet modifiez le rappel. Cela devrait ressembler à:

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

4) Maintenant, nous allons tricher un peu. Dans ce rappel, 'fake_threaded_comment', il devrait y avoir un appel à la fonction comment_reply_link . Nous devons le modifier afin de passer des arguments codés en dur 'depth' et 'max_depth'. Nous mettons la «profondeur» à 1 et max_depth à 2. Cela récupérera notre bouton / lien «Répondre».

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

5) Configurez le lien vers le commentaire parent. À côté de la fonction de rappel, vous avez peut-être remarqué des références à $comment. $comment->comment_parentest l'ID du commentaire auquel on a répondu et get_comment_link($comment->comment_parent)donne l'URL du commentaire parent (pas le balisage d'ancrage complet). get_comment($comment->comment_parent)obtiendra les données du commentaire parent. Donc, quelque chose comme ...

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

C'est tout. Vous pouvez maintenant commenter des commentaires particuliers, mais une fois publié, le commentaire apparaîtra à la fin ou au début de la liste de commentaires en fonction de l'ordre de chargement.

Testé avec TwentyEleven sur WordPress 3.4.1 (légèrement dépassé mais il est déjà sur mon serveur de développement). Je suis sûr qu'il y a des choses que les thèmes ou les plugins pourraient faire pour casser cela, mais je ne pense pas qu'un thème ou un plugin bien comporté le briserait.

C'est ma bonne action pour la journée. Veuillez me faire savoir si quelque chose ne va pas.

s_ha_dum
la source