Loại bỏ post mới nhất khỏi vòng lặp WordPress

3 giờ ago, WordPress Themes, Views
Loại bỏ post mới nhất khỏi vòng lặp WordPress

Giới thiệu: Tại sao cần loại bỏ bài viết mới nhất khỏi vòng lặp WordPress?

Vòng lặp WordPress (WordPress Loop) là trái tim của nhiều theme WordPress, chịu trách nhiệm hiển thị các bài viết trên trang chủ, trang lưu trữ, và các trang khác. Nó lặp đi lặp lại qua từng bài viết để hiển thị tiêu đề, nội dung, meta data, và các thông tin khác. Tuy nhiên, đôi khi bạn cần loại bỏ bài viết mới nhất ra khỏi vòng lặp này, đặc biệt là trong các trường hợp:

  • Thiết kế trang chủ đặc biệt: Bạn muốn bài viết mới nhất được hiển thị ở một vị trí nổi bật, riêng biệt, không phải trong vòng lặp chuẩn.
  • Ngăn trùng lặp: Bài viết mới nhất đã được hiển thị ở một slider hoặc một khối nội dung hero trên trang chủ, và bạn không muốn nó lặp lại trong vòng lặp.
  • Tùy biến giao diện: Bạn muốn tạo một trang chủ tĩnh, hiển thị nội dung cụ thể, và không muốn bài viết mới nhất ảnh hưởng đến thiết kế.

Có nhiều cách để loại bỏ bài viết mới nhất khỏi vòng lặp WordPress, từ sử dụng truy vấn tùy chỉnh (custom query) đến chỉnh sửa trực tiếp tệp tin theme. Bài viết này sẽ hướng dẫn bạn một số phương pháp phổ biến và hiệu quả nhất.

Phương pháp 1: Sử dụng `pre_get_posts` hook để loại bỏ bài viết mới nhất

Hook `pre_get_posts` là một công cụ mạnh mẽ trong WordPress, cho phép bạn sửa đổi truy vấn chính (main query) trước khi nó được thực thi. Điều này có nghĩa là bạn có thể thay đổi các tham số của truy vấn để loại bỏ bài viết mới nhất.

Để sử dụng `pre_get_posts`, bạn cần thêm một hàm vào tệp tin `functions.php` của theme hoặc một plugin tùy chỉnh. Hàm này sẽ được gọi mỗi khi một truy vấn được thực hiện.

Đây là một ví dụ về cách sử dụng `pre_get_posts` để loại bỏ bài viết mới nhất khỏi vòng lặp trên trang chủ:


function exclude_latest_post( $query ) {
  if ( $query->is_home() && $query->is_main_query() ) {
    $latest_post = wp_get_recent_posts( array( 'numberposts' => 1 ) );
    if ( $latest_post ) {
      $latest_post_id = $latest_post[0]['ID'];
      $query->set( 'post__not_in', array( $latest_post_id ) );
    }
  }
}
add_action( 'pre_get_posts', 'exclude_latest_post' );
  

Giải thích đoạn code:

  • `exclude_latest_post( $query )`: Đây là hàm được gọi bởi hook `pre_get_posts`. `$query` là đối tượng truy vấn mà bạn có thể sửa đổi.
  • `if ( $query->is_home() && $query->is_main_query() )`: Điều kiện này đảm bảo rằng đoạn code chỉ được thực thi trên trang chủ và cho truy vấn chính. Điều này quan trọng để tránh ảnh hưởng đến các truy vấn khác trên website.
  • `$latest_post = wp_get_recent_posts( array( ‘numberposts’ => 1 ) )`: Lấy bài viết mới nhất sử dụng hàm `wp_get_recent_posts`. Tham số `numberposts` được đặt thành 1 để chỉ lấy một bài viết.
  • `if ( $latest_post )`: Kiểm tra xem có bài viết nào được trả về hay không.
  • `$latest_post_id = $latest_post[0][‘ID’]`: Lấy ID của bài viết mới nhất.
  • `$query->set( ‘post__not_in’, array( $latest_post_id ) )`: Sử dụng hàm `set()` để thay đổi tham số của truy vấn. Tham số `post__not_in` cho phép bạn loại trừ các bài viết dựa trên ID của chúng.
  • `add_action( ‘pre_get_posts’, ‘exclude_latest_post’ )`: Thêm hàm `exclude_latest_post` vào hook `pre_get_posts`.

Sau khi thêm đoạn code này vào tệp tin `functions.php`, hãy kiểm tra trang chủ của bạn. Bài viết mới nhất sẽ không còn hiển thị trong vòng lặp nữa.

Phương pháp 2: Sử dụng truy vấn tùy chỉnh (Custom Query)

Nếu bạn không muốn chỉnh sửa truy vấn chính, bạn có thể sử dụng truy vấn tùy chỉnh để hiển thị các bài viết. Truy vấn tùy chỉnh cho phép bạn tạo một truy vấn riêng biệt, không ảnh hưởng đến truy vấn chính của WordPress.

Để sử dụng truy vấn tùy chỉnh, bạn cần sử dụng lớp `WP_Query`. Đây là một ví dụ về cách sử dụng truy vấn tùy chỉnh để loại bỏ bài viết mới nhất:


<?php
$latest_post = wp_get_recent_posts( array( 'numberposts' => 1 ) );
if ( $latest_post ) {
  $latest_post_id = $latest_post[0]['ID'];
} else {
  $latest_post_id = 0;
}

$args = array(
  'post__not_in' => array( $latest_post_id ),
);

$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) {
  while ( $the_query->have_posts() ) {
    $the_query->the_post();
    ?>
    <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    <?php the_excerpt(); ?>
    <?php
  }
  wp_reset_postdata();
} else {
  echo '<p>Không có bài viết nào.</p>';
}
?>
  

Giải thích đoạn code:

  • `$latest_post = wp_get_recent_posts( array( ‘numberposts’ => 1 ) )`: Lấy bài viết mới nhất, tương tự như phương pháp 1.
  • `$latest_post_id = $latest_post[0][‘ID’]`: Lấy ID của bài viết mới nhất.
  • `$args = array( ‘post__not_in’ => array( $latest_post_id ) )`: Tạo một mảng các tham số cho truy vấn. Tham số `post__not_in` được sử dụng để loại trừ bài viết mới nhất.
  • `$the_query = new WP_Query( $args )`: Tạo một đối tượng `WP_Query` mới với các tham số đã được xác định.
  • `if ( $the_query->have_posts() )`: Kiểm tra xem có bài viết nào được trả về bởi truy vấn hay không.
  • `while ( $the_query->have_posts() )`: Vòng lặp qua từng bài viết được trả về bởi truy vấn.
  • `$the_query->the_post()`: Thiết lập bài viết hiện tại cho vòng lặp.
  • `the_title()`: Hiển thị tiêu đề của bài viết.
  • `the_excerpt()`: Hiển thị trích đoạn của bài viết.
  • `wp_reset_postdata()`: Khôi phục dữ liệu bài viết toàn cục sau khi kết thúc vòng lặp. Điều này quan trọng để tránh xung đột với các vòng lặp khác trên trang.

Bạn có thể đặt đoạn code này vào bất kỳ tệp tin template nào trong theme của bạn, nơi bạn muốn hiển thị các bài viết (ngoại trừ bài viết mới nhất).

Phương pháp 3: Sử dụng Plugin để quản lý hiển thị bài viết

Nếu bạn không muốn viết code, bạn có thể sử dụng một plugin để quản lý hiển thị bài viết trên trang web của bạn. Có rất nhiều plugin WordPress cung cấp các tính năng để lọc và sắp xếp các bài viết, bao gồm cả khả năng loại bỏ bài viết mới nhất khỏi vòng lặp.

Một số plugin phổ biến bao gồm:

  • Display Posts
  • Content Views
  • Advanced Post Queries

Những plugin này thường cung cấp giao diện trực quan để bạn có thể dễ dàng chọn các bài viết muốn hiển thị, loại trừ các bài viết cụ thể, và sắp xếp chúng theo nhiều tiêu chí khác nhau. Hãy tìm hiểu và lựa chọn plugin phù hợp với nhu cầu của bạn.

Kết luận

Việc loại bỏ bài viết mới nhất khỏi vòng lặp WordPress có thể giúp bạn tạo ra một thiết kế trang chủ độc đáo và hấp dẫn hơn. Bài viết này đã giới thiệu ba phương pháp phổ biến để thực hiện việc này: sử dụng `pre_get_posts` hook, sử dụng truy vấn tùy chỉnh (custom query), và sử dụng plugin. Hãy lựa chọn phương pháp phù hợp nhất với kỹ năng và nhu cầu của bạn. Chúc bạn thành công!