Ссылка на Страницу, На Которой Отображаются Только Комментарии Без Родительского Сообщения


Я хотел бы показать комментарии к публикациям на их собственной странице без родительского сообщения. Я знаю, что могу использовать 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>
 5
Author: kevtrout, 2010-08-12

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>

Страница "Подробности комментариев" будет настроена на использование пользовательского шаблона, который будет содержать код для описания деталей.

 2
Author: Todd Perkins, 2010-08-12 22:28:42

Существует множество различных способов добиться этого, некоторые из них более отшлифованы, чем другие, и практически все они потенциально могут конфликтовать с другими плагинами, но, игнорируя все это, вот один из способов, который довольно близок к тому, о чем вы просили. :)

Это решение будет поддерживать формат URL, подобный следующему, где %comment_id% - числовой идентификатор вашего комментария из таблицы wp_comments:

Http://example.com/comments/%comment_id%/

Сначала вам нужно настроить перезапись 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-адресов, которые должны быть включены в крючок активации плагина, если вы собираетесь включить его, вместо этого мы просто очистим их вручную в разделе "Постоянные ссылки" консоли администратора. Я не показывал, как зарегистрировать крючок активации, но если вы хотите узнать больше, вы можете прочитать об этом здесь.

 15
Author: MikeSchinkel, 2010-08-13 00:37:17