web-dev-qa-db-ja.com

親投稿なしでコメントのみを表示するページへのリンク

親の投稿なしで自分のページに投稿のコメントを表示したいのですが。私は、単一の投稿ページでwp_list_comments()を使用し、自分のコメント表示マークアップを使用するためにコールバック関数を渡すことができることを知っています。私はこれをするつもりです、それで私はそれ自身のページの上にそのコメントを示すであろう各コメントとのリンクを含めることができます。

これがWordPressではない場合、私は使用します:

<a href = " www.example.com/individual_comment.php?comment_id = $comment_id">View single comment</a>

...そしてクエリ文字列から$ comment_idを取得します。

そのリンクはWordPressでどのように見えるでしょうか?つまり、直接取得するためにどのような文字列を含めるのでしょうか。たとえば、get_comment($ comment_id)とcomment_template()を呼び出すmy_comments.phpとします。

<a href = "<?php bloginfo('url');?>/what/goes/here?comment_id = $comment_id"<View single comment</a>
5
kevtrout

おそらくWordPressで新しいページを作成し、そのページにカスタムテンプレートを付けることができます。その場合、URLは通常そのページにアクセスするためのものになります。唯一の違いは、使用しているカスタムテンプレートは、クエリ文字列を介してcomment_idを受け取り、特定のコメントの詳細を取得するように設定し、テンプレートコードでコメントの詳細をエコーアウトすることです。

あなたが作成した "コメントの詳細"というワードプレスのページを持っているのであれば、あなたは 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テーブルからのコメントの数値IDです。

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> Permalinksにパーマリンクを保存することもできます。 /設定エリア:

global $wp_rewrite;
$wp_rewrite->flush_rules(false);

次にparse_queryフィルタフックを追加します。これはWordPressがクエリを調べた後に呼び出されます。追加したcomment_id query_varが設定されているかどうかを確認し、設定されている場合は、目的のURLにアクセスしているかどうかを確認します。そうであるならば、それはコメントに関連しているポストに'p'パラメータ(ポストIDに設定されるべきである)を設定するためにget_comment()を使用してコメント配列をロードします。このようにWordPressが少なくともに関係なく実行されるというクエリを実行すると、以下のcomment.phpテーマテンプレートファイルに必要なものがロードされ、あなたが勝ちました後で必要になったときに別のクエリを実行する必要があります。このコードはまた奇妙な名前のcaller_get_postsオプションを使ってスティッキーポストを無視するようにWordPressに指示します。

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がクエリを調べてコメントの投稿を読み込んだ後に呼び出されます。ここでは、最初にquery_varのcomment_idと、必要な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
MikeSchinkel