it-swarm.xyz

Ссылка на страницу с комментариями без родительской записи

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

Возможно, вы могли бы просто создать новую страницу в 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
Todd Perkins

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

Это решение будет поддерживать формат 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.

Вам также нужно будет вызвать этот код в хуке активации плагина, чтобы очистить правила, или, если это ваш сайт, вы можете просто сохранить постоянные ссылки в консоли администратораSettings> Permalinkssettings:

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();

Любые вопросы? Просто спроси.

Постскриптум Весь код, который я описал выше, может быть помещен в файл functions.php вашей темы и/или в собственный плагин. Предостережение относится к правилам очистки перезаписи URL, которые должны включаться в ловушку активации плагина, если вы собираетесь включить его вместо того, чтобы мы просто сбрасывали их вручную в разделе постоянных ссылок консоли администратора. Я не показал, как зарегистрировать хук активации, но если вы хотите узнать больше, вы можете прочитать об этом здесь .

15
MikeSchinkel