WordPress : แสดง Post ที่เกี่ยวข้องโดยไม่ใช้ Plugin

Published on

เรื่องที่เกี่ยวข้อง หรือ Related Posts สำหรับผมแล้วถือว่าเป็นสิ่งจำเป็นที่บล็อกทุกบล็อกควรจะมีครับ เพราะมันช่วยให้ผู้อ่านใช้เวลากับบล็อกของเรามากขึ้น (เรียกง่ายๆ ว่าช่วยดักท่านผู้ชมไม่ให้ออกจากบล็อกเรา โดยการเสนอให้อ่านเรื่องอื่นต่อ) .. พอเปลี่ยนธีมแล้วไม่มี Related Posts ก็เลยไปเสิชหา วิธีการเพิ่มโพสต์ที่เกี่ยวข้องโดยไม่ใช้ Plugin ดูครับ เจอจากบล็อก WP Recipe - How to: Show related posts without a plugin ซึ่งผมก็เอาโค้ดมาดัดแปลงต่ออีกหน่อยครับผม

โดยหลักการก็คือ เราจะแสดงโพสต์ที่เกี่ยวข้องโดยค้นหาจาก Tag ที่เหมือนกับเรื่องที่ดูอยู่ ซึ่งเราก็ต้องไปเพิ่มโค้ดใน WordPress Loop ของเราครับ ตรงนี้แล้วแต่ธีมที่ใช้นะครับว่าอยู่ไฟล์ไหน ของผมอยู่ที่ single.php ซึ่งทำหน้าที่แสดงโพสต์แต่ละโพสต์ ผมเพิ่มโค้ดนี้ข้างล่างเนื้อหาของโพสต์

<div class="related-posts">
  <?php
    $tags = wp_get_post_tags($post->ID);
    if ($tags) :
      $first_tag = $tags[0]->term_id;
      $args=array(
      'tag__in' => array($first_tag),
      'post__not_in' => array($post->ID),
      'showposts'=>5,
      'caller_get_posts'=>1
    );

    $my_query = new WP_Query($args);
    if( $my_query->have_posts() ) : ?>
      <h4>Related Posts (beta)</h4>
      <ul>
      <?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <li>
        <a href="<?php the_permalink() ?>" rel="bookmark" title="
        Permanent Link to <?php the_title_attribute(); ?>">
          <?php the_title(); ?></a>
        </li>
      <?php endwhile;  ?>
      </ul>
  <?php  endif;
    endif;
    wp_reset_query();
  ?>
</div>

ถ้าลองอ่านโค้ดดู มันคือการเอา Tag แรกของโพสต์ที่แสดงอยู่ ไปค้นหาโพสต์ที่มี Tag นี้เหมือนกัน เราจะได้ Custom Loop ใน Main Loop อีกที เพราะฉะนั้นเมื่อเราวน Custom Loop เสร็จแล้ว ต้องเรียกใช้ฟังก์ชั่น wp_reset_query(); เพื่อเป็นการ Reset Custom Loop และกลับเข้าสู่ Loop หลักครับ .. ตรงนี้สำคัญ (และโค้ดต้นฉบับไม่ได้ใส่มาให้) เพราะถ้าเราไม่ Reset Query เวลาเรียกใช้ตัวแปร $post หลังจากนี้ มันจะเป็นของ Custom Loop แทนที่จะเป็นของ Main Loop และอาจทำให้ค่าต่างๆ เพี้ยนได้ครับ

อ่านรายละเอียดของ wp_reset_query(); ได้ ที่นี่ ครับ

Share

(Edit on GitHub)