Я должен отобразить ссылку после каждого комментария, когда Вы нажимаете на ту ссылку, новые отображения страницы что единственный комментарий на новой странице.
Это возможно?
Это мой functions.php
<?php
if ( ! function_exists( 'twentyten_comment' ) ) :
function my_comment( $comment, $args, $depth ) {
$GLOBALS['comment'] = $comment;
switch ( $comment->comment_type ) :
case '' :
?>
<li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
<div id="comment-<?php comment_ID(); ?>">
<div class="comment-author vcard">
<?php echo get_avatar( $comment, 40 ); ?>
<?php printf( __( '%s <span class="says">says:</span>', 'twentyten' ), sprintf( '<cite class="fn">%s</cite>', get_comment_author_link() ) ); ?>
</div><!-- .comment-author .vcard -->
<?php if ( $comment->comment_approved == '0' ) : ?>
<em><?php _e( 'Your comment is awaiting moderation.', 'twentyten' ); ?></em>
<br />
<?php endif; ?>
<div class="comment-meta commentmetadata"><a href="<?php echo esc_url( get_comment_link( $comment->comment_ID ) ); ?>">
<?php
/* translators: 1: date, 2: time */
printf( __( '%1$s at %2$s', 'twentyten' ), get_comment_date(), get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)', 'twentyten' ), ' ' );
?>
</div><!-- .comment-meta .commentmetadata -->
<div class="comment-body"><?php comment_text(); ?></div>
<a href = "<?php echo get_page_link($page_id).'/?commentID='.comment_ID();?>">View this comment</a>
<div class="reply">
<?php comment_reply_link( array_merge( $args, array( 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
</div><!-- .reply -->
</div><!-- #comment-## -->
<?php
break;
case 'pingback' :
case 'trackback' :
?>
<li class="post pingback">
<p><?php _e( 'Pingback:', 'twentyten' ); ?> <?php comment_author_link(); ?><?php edit_comment_link( __('(Edit)', 'twentyten'), ' ' ); ?></p>
<?php
break;
endswitch;
}
endif;
Это мой comments_page.php
/*Template Name: comments_page*/
<? if(isset($_GET['commentID'])){$commentID = $_GET['commentID'];}
$comment = get_comment($commentID);
?>
<?php get_header(); ?>
<div id="content">
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div class="post">
<!--uncomment for header tags-- <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
<small><b>Posted:</b> <?php the_time('F jS, Y') ?> | <b>Author:</b> <?php the_author_posts_link(); ?> | <b>Filed under:</b> <?php the_category(', ') ?> <?php the_tags(' | <b>Tags:</b> ', ', ', ''); ?> <?php if ( $user_ID ) :
?> | <b>Modify:</b> <?php edit_post_link(); ?> <?php endif; ?>| <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></small> -->
<?php the_content('Read the rest of this entry »'); ?>
<hr/>
</div>
<?php endwhile; ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link('« Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries »') ?></div>
</div>
<?php else : ?>
<h2 class="center">Not Found</h2>
<p class="center">Sorry, but you are looking for something that isn't here.</p>
<?php endif; ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Это мой comments.php
<?php // Do not delete these lines
if (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
die ('Please do not load this page directly. Thanks!');
if (!empty($post->post_password)) { // if there's a password
if ($_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password) { // and it doesn't match the cookie
?>
<p class="nocomments">This post is password protected. Enter the password to view comments.</p>
<?php
return;
}
}
/* This variable is for alternating comment background */
$oddcomment = 'class="alt" ';
?>
<!-- You can start editing here. -->
<div id="comments">
<?php if ($comments) : ?>
<h3><?php comments_number('No Comments', 'One Comment', '% Comments' );?> on “<?php the_title(); ?>”</h3>
<?php wp_list_comments( array('callback'=>'my_comment')); ?>
<?php else : // this is displayed if there are no comments so far ?>
<?php if ('open' == $post->comment_status) : ?>
<!-- If comments are open, but there are no comments. -->
<?php else : // comments are closed ?>
<!-- If comments are closed. -->
<p class="nocomments">Comments are closed.</p>
<?php endif; ?>
<?php endif; ?>
<?php if ('open' == $post->comment_status) : ?>
<hr/>
<h4 class="center">Leave a Reply</h4>
<?php if ( get_option('comment_registration') && !$user_ID ) : ?>
<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php echo urlencode(get_permalink()); ?>">logged in</a> to post a comment.</p>
<?php else : ?>
<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">
<ul class="formlist">
<?php if ( $user_ID ) : ?>
<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Log out »</a></p>
<?php else : ?>
<li><input type="text" name="author" id="author" value="Name <?php if ($req) echo "(required)"; ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> onblur="if(this.value.length == 0) this.value='Name <?php if ($req) echo "(required)"; ?>';" onclick="if(this.value == 'Name <?php if ($req) echo "(required)"; ?>') this.value='';" /></li>
<li><input type="text" name="email" id="email" value="Mail (will not be published) <?php if ($req) echo "(required)"; ?>" size="22" tabindex="2" <?php if ($req) echo "aria-required='true'"; ?> onblur="if(this.value.length == 0) this.value='Mail (will not be published) <?php if ($req) echo "(required)"; ?>';" onclick="if(this.value == 'Mail (will not be published) <?php if ($req) echo "(required)"; ?>') this.value='';" /></li>
<li><input type="text" name="url" id="url" value="Website" size="22" tabindex="3" onblur="if(this.value.length == 0) this.value='Website';" onclick="if(this.value == 'Website') this.value='';" /></li>
<?php endif; ?>
<!--<p><small><strong>XHTML:</strong> You can use these tags: <code><?php echo allowed_tags(); ?></code></small></p>-->
<li><textarea name="comment" id="comment" cols="70%" rows="10" tabindex="4" value="Enter comment here."></textarea></li>
<li class="submitbutton"><input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment" /></li>
<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
<?php do_action('comment_form', $post->ID); ?>
</ul>
</form>
<?php endif; // If registration required and not logged in ?>
<?php endif; // if you delete this the sky will fall on your head ?>
</div>
(Новая отредактированная версия после комментариев OP)
Есть много способов сделать это. Теоретически это самый простой, но, возможно, не самый подходящий способ с точки зрения WordPress. Возьмите это за отправную точку. Я не тестировал его, поэтому вы можете столкнуться с одной или двумя ошибками, которые должны быть решены с помощью некоторых незначительных настроек. Дай мне знать, если ты запутаешься, и я сделаю все, что в моих силах. Итак, концептуально ...
Вы должны скопировать файл шаблона page.php и переименовать его в 'comments_page.php' (или как хотите). Откройте этот файл в редакторе кода и найдите, где появляется следующее: (или создайте его, если он не существует)
/*Template Name: page*/
и измените его на
/*Template Name: comments_page*/
. Теперь откройте админку WordPress и создайте новую страницу. Называйте это как хотите, но не добавляйте никакого содержания. В правом столбце выберите шаблон, который использует страница, из раскрывающегося меню «Шаблон страницы». Выберите «страница комментариев» (или то, что вы указали в качестве имени шаблона). Это говорит WordPress использовать ваш файл для отображения этой конкретной страницы вместо шаблона страницы по умолчанию. Сохраните страницу и обратите внимание на page_id, который генерирует WordPress.
Теперь найдите шаблон комментариев вашей темы, обычно «comments.php». Найдите функцию wp_list_comments ();
. Мы собираемся добавить имя пользовательской функции, которая будет управлять отображением ваших комментариев, в качестве аргумента этой функции. Для примера перейдите к файлам двадцати десяти тем, откройте comments.php, и вы увидите, как это выглядит:
wp_list_comments( array( 'callback' => 'twentyten_comment' ) );
Откройте файл functions.php двадцати десяти тем и найдите
function twentyten_comment()
Скопируйте эту функцию целиком и вставьте в файл функций вашей темы.Измените имя на my_comment () и добавьте его к вызову функции wp_list_comments следующим образом:
wp_list_comments( array('callback'=>'my_comment'));
В вашей недавно созданной функции my_comment () в файле functions.php добавьте ссылку, где вы хотите отдельная страница комментариев (comments_page.php) с использованием get_page_link () и переменной запроса с именем 'commentID' и идентификатора комментария.
<a href = "<?php echo get_page_link($page_id).'/?commentID='.comment_ID();?>">View this comment</a>
Теперь неправильно добавить логику php в файл шаблона. Как только вы поймете, как это работает, вы можете создать функцию в своем файле functions.php, а затем вызвать ее в файле темы ...
В comments_page.php используйте $ _GET ['commentID'] для получения идентификатора комментария. значение из URL-адреса и передайте его get_comment ($ commentID) , чтобы получить отдельный комментарий и отобразить его на отдельной странице.
if(isset($_GET['commentID'])){$commentID = $_GET['commentID'];}
$comment = get_comment($commentID);
Теперь у вас есть вся информация об отдельных комментариях в переменной $ comment в виде объекта.
Вы можете решить, как отображать комментарий, но для начала я рекомендую скопировать содержимое шаблона комментариев вашей темы, чтобы сохранить последовательность. Он покажет то же самое, что и страница сообщения, но похоже, что эта страница больше предназначена для постоянной ссылки на один комментарий, на который вы ссылаетесь откуда-то еще.
Надеюсь, это поможет. Дайте мне знать, если вы столкнетесь с загвоздкой.
Примечание: этот ответ содержит информацию, полученную от Тодда Перкинса на wordpress.stackexchange.com
Я ответил на ваш точный вопрос в ответах WordPress (также является сайтом StackExchange) только вчера. Вы можете найти этот ответ здесь . Он состоял из следующих четырех шагов:
query_var
, rewrite_tag
и permastruct
, parse_query
, чтобы установить сообщение query_vars
как сообщение комментария и отключить прикрепленные сообщения для запрос, template_include
для фильтрации имени файла шаблона для загрузки файла шаблона конкретного шаблона для одного комментария и, наконец, / wp-content / themes /% your-theme% / comment.php
. Опять же, вы можете найти ответ здесь .
Надеюсь, это поможет.
-Майк
Ниже приводится полный контент, который я также опубликовал в ответах WordPress:
Существует множество различных способов сделать это, некоторые из которых более совершенны, чем другие, и практически все они имеют потенциал для конфликта с другими плагинами, но игнорируя все это, вот один способ, который довольно близок к тому, о чем вы просили. :)
Это решение будет поддерживать формат 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-адресов, которые должны быть включены в ловушку активации плагина, если вы собираетесь включить его, вместо этого мы просто сбрасываем их вручную в разделе постоянных ссылок консоли администратора. Я не показал, как зарегистрировать ловушку активации, но если вы хотите узнать больше, вы можете прочитать об этом здесь .