Wordpress: показать комментарий к новой странице?

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

Это возможно?

1
задан Mas Ugn 5 August 2010 в 11:52
поделиться

3 ответа

Это мой 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 &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></small>   -->
            <?php the_content('Read the rest of this entry &raquo;'); ?>
             <hr/>
        </div>

        <?php endwhile; ?>

        <div class="navigation">
            <div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
            <div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></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 &#8220;<?php the_title(); ?>&#8221;</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 &raquo;</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>
0
ответ дан 2 September 2019 в 22:25
поделиться

(Новая отредактированная версия после комментариев 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

0
ответ дан 2 September 2019 в 22:25
поделиться

Я ответил на ваш точный вопрос в ответах WordPress (также является сайтом StackExchange) только вчера. Вы можете найти этот ответ здесь . Он состоял из следующих четырех шагов:

  1. Настройка перезаписи URL путем добавления query_var , rewrite_tag и permastruct ,
  2. Обязательно очистить правила перезаписи в ловушке активации плагина или вручную,
  3. Добавление ловушки фильтра parse_query , чтобы установить сообщение query_vars как сообщение комментария и отключить прикрепленные сообщения для запрос,
  4. Добавление ловушки фильтра template_include для фильтрации имени файла шаблона для загрузки файла шаблона конкретного шаблона для одного комментария и, наконец,
  5. Для создания файла шаблона комментария как / wp-content / themes /% your-theme% / comment.php .

Опять же, вы можете найти ответ здесь .

Надеюсь, это поможет.

-Майк


ОБНОВЛЕНИЕ:

Ниже приводится полный контент, который я также опубликовал в ответах WordPress:


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

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

2
ответ дан 2 September 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: