Ответы без резьбы в комментариях со ссылкой на оригинальный комментарий

10

Я объясню, что я пытаюсь сделать.

Я хотел бы иметь регулярные непоточные (плоские / классические) комментарии с ответной ссылкой на каждый комментарий. Когда кто-то отвечает на комментарий, ответный комментарий будет заканчиваться вверху (или снизу) как последний комментарий, так же, как это было бы в комментариях по умолчанию, но в отличие от комментария по умолчанию в ответе должна отображаться ссылка на Оригинальный комментарий / автор.

На WordPress форуме есть предложенное решение:

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

Я просто не заставляю его работать. Я не уверен, в каких файлах постер размещает разные куски кода. Я попытался использовать код и подключить функцию к 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 );
    } 
  }
}

Это вернуло пустую страницу с «в ответ на имя автора ». После перезагрузки сообщения ответный комментарий отображается корректно, но без ссылки на исходный комментарий

Мои навыки кодирования действительно очень просты, поэтому я понятия не имею, как мне поступить. Был бы очень признателен за любую помощь.

Сарыташ
источник
Каково содержание hrefв aтом , что следует «в ответ в` согласно„инструмент Осмотреть элемент“в Chrome (или аналогичный в вашем браузере выбора)?
mor7ifer
Я решил проблему после большого количества проб и ошибок. Хитрость заключалась в том, чтобы привести части кода в правильном порядке и расположить в файлах комментариев и функций. Значение sin %1$sозначает, что аргумент обрабатывается как и представляется как строка. Это подробно объясняется в руководстве по php для функции sprintf: php.net/manual/en/function.sprintf.php
sarytash
3
Вы должны представить то, что вы сделали, в качестве решения, чтобы помочь организовать сайт и помочь всем, кто придет за вами с той же проблемой, быстро и эффективно преодолеть ее.
mor7ifer
Да, если бы вы могли опубликовать рабочее решение, которое было бы здорово.
Борек Бернард
1
согласился, хотел бы увидеть это в действии.
Helgatheviking

Ответы:

4

Это мое решение, а не предложенное решение, предложенное на форумах WordPress. Оказывается, это довольно легко, но включает в себя несколько шагов.

1) Зайдите в wp-admin-> Настройки-> Обсуждение и отключите комментарии. Это отключит многопоточность, которую мы хотим, но также лишит нас возможности «отвечать» на определенный комментарий. Мы должны это вернуть.

2) Добавьте скрипт ниже в файл functions.php вашей темы или в плагин.

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) Печать комментариев обрабатывается обратным вызовом wp_list_comments . TwentyEleven использует функцию twentyeleven_comment()в своем functions.php. Если ваша тема не имеет обратного вызова, вам нужно будет создать его. По умолчанию используется содержимое метода start_el класса Walker_Comment в «wp-includes / comment-template.php». Скопируйте это или скопируйте обратный вызов темы и переименуйте функцию в fake_threaded_comment.

3) Найдите функцию wp_list_comments в вашей теме comments.phpи измените обратный вызов. Это должно выглядеть так:

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

4) Теперь собираемся немного обмануть. В этом обратном вызове, 'fake_threaded_comment', должен быть вызов функции comment_reply_link . Нам нужно отредактировать его так, чтобы мы передавали жестко закодированные аргументы глубины и max_depth. Мы устанавливаем «глубину» на 1 и max_depth на 2. Это вернет нашу кнопку «Ответить» / ссылку.

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

5) Настройте ссылку на родительский комментарий. В функции обратного вызова вы могли заметить ссылки $comment. $comment->comment_parentявляется идентификатором комментария с ответом и get_comment_link($comment->comment_parent)дает URL родительского комментария (не полную разметку привязки). get_comment($comment->comment_parent)получит данные родительского комментария. Итак, что-то вроде ...

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

Вот и все. Теперь вы можете комментировать отдельные комментарии, но после публикации комментарий будет отображаться в конце или в начале списка комментариев в зависимости от порядка загрузки.

Протестировано с TwentyEleven на WordPress 3.4.1 (немного устарело, но уже на моем сервере разработки). Я уверен, что есть вещи, которые темы или плагины могут сделать, чтобы сломать это, но я не думаю, что хорошо продуманная тема или плагин сломали бы это.

Это мое доброе дело на сегодня. Пожалуйста, дайте мне знать, если что-то пойдет не так.

s_ha_dum
источник