Ссылка на Страницу, На Которой Отображаются Только Комментарии Без Родительского Сообщения
Я хотел бы показать комментарии к публикациям на их собственной странице без родительского сообщения. Я знаю, что могу использовать wp_list_comments() на одной странице публикации и передать функцию обратного вызова, чтобы использовать собственную разметку отображения комментариев. Я планирую сделать это, чтобы я мог включить ссылку с каждым комментарием, которая покажет этот комментарий на его собственной странице.
Если бы это был не WordPress, я бы использовал:
<a href = " www.example.com/individual_comment.php?comment_id = $comment_id">View single comment</a>
...и возьмите $comment_id из строки запроса.
Как бы выглядела эта ссылка в WordPress? т.е.: какую строку я бы включил, чтобы перейти непосредственно, скажем, my_comments.php где я вызываю get_comment($comment_id) и comment_template()?
<a href = "<?php bloginfo('url');?>/what/goes/here?comment_id = $comment_id"<View single comment</a>
2 answers
Вероятно, вы могли бы просто создать новую страницу в WordPress и предоставить этой странице пользовательский шаблон. Тогда URL-адрес будет просто таким, каким он обычно был бы, чтобы попасть на эту страницу. Единственное отличие состоит в том, что пользовательский шаблон, который вы используете, будет настроен на прием идентификатора comment_id через строку запроса, а затем просто получите подробную информацию для конкретного комментария, и в коде шаблона отобразятся детали комментария.
Итак, если у вас есть страница в wordpress под названием "Подробности комментариев" что вы создаете, вы можете получить доступ к этой странице через http://www.domain.com/comment-details (при условии, что у вас включены постоянные ссылки). Таким образом, ваша ссылка будет выглядеть так:
<a href = "<?php bloginfo('url');?>/comment-details?comment_id=$comment_id">View single comment</a>
Страница "Подробности комментариев" будет настроена на использование пользовательского шаблона, который будет содержать код для описания деталей.
Существует множество различных способов добиться этого, некоторые из них более отшлифованы, чем другие, и практически все они потенциально могут конфликтовать с другими плагинами, но, игнорируя все это, вот один из способов, который довольно близок к тому, о чем вы просили. :)
Это решение будет поддерживать формат URL, подобный следующему, где %comment_id%
- числовой идентификатор вашего комментария из таблицы wp_comments
:
Сначала вам нужно настроить перезапись URL-адреса с помощью следующего кода. Надеюсь, это разумно объясняет само себя, но не стесняйтесь спрашивать:
$wp->add_query_var('comment_id'); // Add the "behind-the-scenes" query variable that WordPress will use
$wp_rewrite->add_rewrite_tag('%comment_id%', '([0-9]+)','comment_id='); // Define a rewrite tag to match that assigns to the query var
$wp_rewrite->add_permastruct('comment-page', 'comments/%comment_id%'); // Define a URL pattern to match the rewrite tag.
Вам также потребуется либо вызвать этот код в крючке активации плагина, чтобы очистить правила, либо, если это ваш сайт, вы можете просто сохранить постоянные ссылки в Настройках консоли администратора > Постоянные ссылки область настроек:
global $wp_rewrite;
$wp_rewrite->flush_rules(false);
Затем добавьте parse_query
крючок для фильтра. Это будет вызвано после того, как WordPress проверит запрос. Он проверяет, установлен ли ваш добавленный comment_id
query_var, и если да, то проверяет, находитесь ли вы на нужном URL-адресе. Если да, то он загружает массив комментариев с помощью get_comment()
, чтобы установить параметр 'p'
(который должен быть установлен в идентификатор записи) для записи, связанной с комментарием. Таким образом, когда WordPress запускает запрос, который он будет выполнять независимо от того, что по крайней мере, он загружает то, что вам понадобится в вашей теме comment.php
файл шаблона ниже, и вам не придется запускать другой запрос позже, когда он вам понадобится. Этот код также указывает WordPress игнорировать липкие сообщения, используя опцию со странным названием caller_get_posts
:
add_filter( 'parse_query', 'my_parse_query' );
function my_parse_query( $query ) {
global $wp;
if (isset($query->query['comment_id']) && substr($wp->request,0,9)=='comments/') {
$comment = get_comment($query->query['comment_id']);
$query->query_vars['p'] = $comment->comment_post_ID; // Causes the comment's post to be loaded by the query.
$query->query_vars['caller_get_posts'] = true; // Keeps sticky posts from invading into the top of our query.
}
}
Тем не менее, далее вам нужно будет подключить код в /wp-includes/template-loader.php
с помощью фильтра template_include
. Это будет вызвано после того, как WordPress проверит запрос и загрузит сообщение для комментария. Здесь вы сначала снова проверите наличие comment_id
в query_var, а также тот URL, который вам нужен. Если это так, мы заменяем /index.php
страница шаблона с /comment.php
, представляющая собой файл шаблона темы, который вам нужно будет создать:
add_filter( 'template_include', 'my_template_include' );
function my_template_include( $template ) {
global $wp,$wp_query;
if (isset($wp_query->query['comment_id']) && substr($wp->request,0,9)=='comments/') {
$template = str_replace('/index.php','/comment.php',$template);
}
return $template;
}
Наконец, теперь вам нужно создать файл шаблона темы, который я выбрал для вызова /comment.php
. Поскольку это ваша тема, вы захотите, чтобы она выглядела так, как вы хотите, но вот пример, который поможет вам начать:
<?php
/*
* File: /wp-content/themes/my-theme/comment.php
*/
global $wp_query,$post;
$comment_id = $wp_query->query['comment_id'];
$comment = get_comment($comment_id);
$permalink = get_permalink($post->ID);
get_header();
?>
<div id="container">
<div id="comment-<?php echo $comment_id; ?>" class="comment">
<p>Comment by: <span class="comment-author">
<a href="<?php echo $comment->comment_author_url; ?>"><?php echo $comment->comment_author; ?></a></span>
on <span class="comment-date"><?php echo date("D M jS Y", strtotime($comment->comment_date)); ?></span>
at <span class="comment-time"><?php echo date("h:ia", strtotime($comment->comment_date)); ?></span>
</p>
<p>About: <a href="<?php echo $permalink; ?>"><?php echo $post->post_title; ?></a></p>
<blockquote><?php echo $comment->comment_content; ?></blockquote>
</div>
</div>
<?php
get_sidebar();
get_footer();
Есть вопросы? Просто спросите.
P.S. Весь код, который я описал выше, может быть либо помещен в файл вашей темы functions.php
и/или в ваш собственный плагин. Предостережение для правила очистки перезаписи URL-адресов, которые должны быть включены в крючок активации плагина, если вы собираетесь включить его, вместо этого мы просто очистим их вручную в разделе "Постоянные ссылки" консоли администратора. Я не показывал, как зарегистрировать крючок активации, но если вы хотите узнать больше, вы можете прочитать об этом здесь.