it-swarm-vi.tech

Liên kết đến trang Chỉ hiển thị bình luận mà không có bài đăng của phụ huynh

Tôi muốn hiển thị bình luận bài viết trên trang riêng của họ mà không cần bài đăng của phụ huynh. Tôi biết tôi có thể sử dụng wp_list_comments () trên trang bài đăng duy nhất và chuyển một hàm gọi lại để sử dụng đánh dấu hiển thị bình luận của riêng tôi. Tôi dự định làm điều này để tôi có thể bao gồm một liên kết với mỗi bình luận sẽ hiển thị bình luận đó trên trang của chính nó.

Nếu đây không phải là WordPress, tôi sẽ sử dụng:

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

... và lấy $ comment_id từ chuỗi truy vấn.

Liên kết đó sẽ trông như thế nào trong WordPress? tức là: chuỗi nào tôi sẽ bao gồm để trực tiếp đến, giả sử, my_comments.php nơi tôi gọi get_comment ($ comment_id) và comment_template ()?

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

Bạn có thể chỉ cần tạo một trang mới trong WordPress và cung cấp cho trang đó một mẫu tùy chỉnh. Sau đó, url sẽ là bất cứ điều gì thông thường sẽ được đến trang đó. Sự khác biệt duy nhất là mẫu tùy chỉnh bạn đang sử dụng sẽ được thiết lập để chấp nhận comment_id thông qua chuỗi truy vấn, sau đó chỉ cần lấy chi tiết cho nhận xét cụ thể và trong mã mẫu sẽ hiển thị chi tiết của nhận xét.

Vì vậy, nếu bạn có một trang trong wordpress có tên là "Chi tiết bình luận" mà bạn tạo, bạn có thể truy cập trang đó thông qua http://www.domain.com/comment-details (giả sử bạn đã bật permalinks). Vì vậy, liên kết của bạn sẽ trông như thế này:

<a href = "<?php bloginfo('url');?>/comment-details?comment_id=$comment_id">View single comment</a>

Trang "Nhận xét chi tiết" sẽ được thiết lập để sử dụng một mẫu tùy chỉnh có chứa mã để nhổ các chi tiết.

2
Todd Perkins

Có rất nhiều cách khác nhau để thực hiện điều này, một số cách đánh bóng hơn những cách khác và thực tế tất cả chúng đều có khả năng xung đột với các plugin khác, nhưng bỏ qua tất cả những cách đó gần giống với những gì bạn yêu cầu. :)

Giải pháp này sẽ hỗ trợ định dạng URL như sau trong đó %comment_id% là ID số của nhận xét của bạn từ bảng wp_comments:

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

Trước tiên, bạn sẽ cần định cấu hình viết lại URL của mình bằng mã sau. Hy vọng rằng nó là tự giải thích hợp lý nhưng đừng ngần ngại hỏi:

$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.

Bạn cũng cần phải gọi mã này trong móc kích hoạt plugin để xóa quy tắc hoặc nếu đó là trang web của bạn, bạn chỉ có thể lưu permalinks trong khu vực cài đặt của bảng điều khiển quản trị> Cài đặt Permalinks :

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

Tiếp theo thêm móc lọc parse_query. Điều này sẽ được gọi sau khi WordPress đã kiểm tra truy vấn. Nó kiểm tra xem liệu comment_id query_var của bạn đã được đặt hay chưa và nếu vậy nó sẽ kiểm tra xem bạn có ở trên URL mong muốn không. Nếu có thì nó tải mảng bình luận bằng cách sử dụng get_comment() để đặt tham số 'p' (nên được đặt thành ID bài đăng) cho bài đăng có liên quan đến nhận xét. Theo cách đó, khi WordPress chạy truy vấn rằng nó sẽ chạy bất kể ít nhất , nó sẽ tải thứ gì đó bạn cần trong tệp mẫu chủ đề comment.php bên dưới và bạn sẽ không phải chạy một truy vấn khác sau này khi bạn cần nó. Mã này cũng yêu cầu WordPress bỏ qua các bài đăng dính bằng cách sử dụng tùy chọn caller_get_posts có tên kỳ quặc:

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.
    }
}

Vẫn tiếp theo, bạn sẽ cần nối mã trong /wp-includes/template-loader.php bằng bộ lọc template_include. Điều này sẽ được gọi sau khi WordPress vừa kiểm tra truy vấn vừa tải bài đăng để bình luận. Tại đây, trước tiên bạn sẽ kiểm tra lại comment_id trong query_var và URL cũng là URL bạn muốn. Nếu vậy, chúng tôi thay thế trang mẫu /index.php bằng /comment.php là tệp mẫu chủ đề bạn sẽ cần tạo:

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;
}

Cuối cùng, bây giờ bạn cần tạo tệp mẫu chủ đề mà tôi đã chọn để gọi /comment.php. Vì đó là chủ đề của bạn, bạn sẽ muốn làm cho nó trông giống như bạn muốn nhưng đây là một ví dụ để bạn bắt đầu:

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

Có câu hỏi nào không? Chỉ hỏi thôi.

P.S. Tất cả các mã tôi mô tả ở trên có thể đi vào tệp functions.php của chủ đề của bạn và/hoặc trong một plugin của riêng bạn. Một cảnh báo dành cho các quy tắc xóa lại URL sẽ xuất hiện trong hook kích hoạt plugin nếu bạn định đưa nó vào thay vì chúng tôi chỉ xóa chúng theo cách thủ công trong phần permalinks của bảng điều khiển quản trị. Tôi đã không chỉ ra cách đăng ký hook kích hoạt nhưng nếu bạn muốn tìm hiểu thêm, bạn có thể đọc về nó tại đây .

15
MikeSchinkel