O comentário não encadeado responde com link para o comentário original

10

Vou explicar o que estou tentando realizar.

Eu gostaria de ter comentários regulares não-encadeados (simples / clássicos) com um link de resposta para cada comentário. Quando alguém responde a um comentário, o comentário da resposta termina na parte superior (ou inferior) como o comentário mais recente, como faria nos comentários não encadeados padrão, mas, diferentemente do comentário não encadeado padrão, a resposta deve exibir um link para o comentário / autor original.

Existe uma solução proposta no fórum wordpress:

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

Eu simplesmente não faço isso funcionar. Não sei em quais arquivos o pôster está colocando as diferentes partes do código. Eu tentei usar o código e ligar uma função 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 );
    } 
  }
}

Isso retornou uma página em branco com "em resposta ao nome do usuário ". Após recarregar a postagem, um comentário de resposta aparece corretamente, mas sem nenhum link para o comentário original

Minhas habilidades de codificação são realmente muito básicas, então não tenho uma boa ideia de como devo proceder. Ficaria muito grato por qualquer ajuda.

sarytash
fonte
Qual é o conteúdo do item hrefa aseguir 'em resposta a' de acordo com a ferramenta 'Inspecionar elemento' no Chrome (ou similar no navegador de sua escolha)?
mor7ifer
Eu resolvi o problema depois de muitas tentativas e erros. O truque era colocar os pedaços de código na ordem certa e colocar os arquivos de comentários e funções. O sin %1$ssignifica que o argumento é tratado como e apresentado como uma string. Isso é explicado em detalhes no manual do php para a função sprintf: php.net/manual/en/function.sprintf.php
sarytash
3
Você deve enviar o que fez como solução para ajudar a manter o site organizado e para ajudar quem procura o mesmo problema a superá-lo com rapidez e eficiência.
mor7ifer
Sim, se você pudesse postar uma solução funcional, seria ótimo.
Borek Bernard
11
concordou, adoraria ver isso em ação.
helgatheviking

Respostas:

4

Esta é a minha solução e não a solução proposta sugerida nos fóruns do WordPress. Acontece que é bastante fácil, mas envolve algumas etapas.

1) Vá para wp-admin-> Configurações-> Discussão e desative os comentários encadeados. Isso desativará o encadeamento, o que queremos, mas também removerá a capacidade de "responder" a um comentário específico. Temos que colocar isso de volta.

2) Adicione o script abaixo ao functions.php do seu tema ou a um 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) A impressão dos comentários é tratada por um retorno de chamada para wp_list_comments . TwentyEleven usa a função twentyeleven_comment()em seu functions.php. Se o seu tema não tiver um retorno de chamada, você precisará criar um. Por padrão, o conteúdo do método start_el da classe Walker_Comment em "wp-includes / comment-template.php" é usado. Copie isso ou copie o retorno de chamada do tema e renomeie a função para fake_threaded_comment.

3) Encontre a função wp_list_comments no seu tema comments.phpe altere o retorno de chamada. Deve parecer com:

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

4) Agora vamos trapacear um pouco. Nesse retorno de chamada, 'fake_threaded_comment', deve haver uma chamada para a função comment_reply_link . Precisamos editá-lo para que passemos os argumentos codificados 'depth' e 'max_depth'. Estamos definindo 'depth' como 1 e max_depth como 2. Isso fará com que nosso botão / link "Responder" volte.

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

5) Configure o link para o comentário principal. No lado da função de retorno de chamada, você deve ter notado referências $comment. $comment->comment_parenté o ID do comentário respondido e get_comment_link($comment->comment_parent)fornece o URL do comentário pai (não a marcação completa da âncora). get_comment($comment->comment_parent)obterá os dados do comentário pai. Então, algo 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>';

É isso aí. Agora você pode comentar comentários específicos, mas uma vez publicado, o comentário será exibido no final ou no início da lista de comentários, dependendo da ordem de carregamento.

Testado com TwentyEleven no WordPress 3.4.1 (um pouco desatualizado, mas já está no meu servidor de desenvolvimento). Estou certo de que existem coisas que temas ou plug-ins poderiam fazer para resolver isso, mas não acho que um tema ou plug-in bem comportado possa quebrá-lo.

Essa é a minha boa ação do dia. Informe-me se algo der errado.

s_ha_dum
fonte