Một số cách sử dụng pre_get_posts thay đổi lại tham số của truy vấn (ok)

https://developer.wordpress.org/reference/hooks/pre_get_posts/

Các tham số lấy trong https://developer.wordpress.org/reference/classes/wp_query

C:\xampp\htdocs\wordpress\wp-includes\class-wp-query.php

Tham số $query là đối tượng WP_Query. Trong đối tượng này chứa sẵn một số hàm template tag cho bạn kiểm tra điều kiện của dữ liệu hiện tại. Dựa vào đó bạn có thể lọc posts/page/post type theo ý muốn.

Đây là hook mà bạn sẽ sử dụng nếu như bạn cần thay đổi lại tham số của truy vấn ở một trang nào đó bằng hàm callback của mình. Hook này được gọi ra sau khi truy vấn mặc định của WordPress được tạo ra nhưng trước khi truy vấn được chạy. Hook này thường được sử dụng kèm với đối tượng $query để sửa lại tham số của truy vấn hay làm việc gì đó để thao tác với truy vấn mặc định.

Ví dụ mình muốn ở trang lưu trữ của WordPress sẽ có truy vấn lấy bài viết ngẫu nhiên thì mình sẽ kết hợp với các hàm điều kiện của WordPress và phương thức $query->set() trong hook này.

Các hàm điều kiện khi dùng trong hook này sẽ phải viết dưới dạng phương thức của $query. Ví dụ: $query->is_home().

function thachpham_modify_archive_query($query) {
  // khai báo biến cần sử dụng trong callback
  if ($query->is_archive() && $query->is_main_query()): // is_main_query được sử dụng để tránh nó can thiệp vào truy vấn không phải mặc định
    $query->set('orderby', 'rand'); // orderby=rand => sắp xếp bài ngẫu nhiên
    $query->set('posts_per_page', '1'); // posts_per_page=1 => hiển thị 1 bài mỗi trang
  endif;
}
add_action('pre_get_posts', 'thachpham_modify_archive_query');

Ví dụ đã hoàn thành :)

C:\xampp\htdocs\wordpress\wp-content\themes\twentytwentyone\functions.php

Đọc WP_Query::set ở https://developer.wordpress.org/reference/classes/wp_query/set

function thachpham_modify_archive_query($query) {
  if ($query->is_archive() && $query->is_main_query()):
    $query->set('orderby', 'rand');
    $query->set('posts_per_page', 2);
  endif;
}
add_action('pre_get_posts', 'thachpham_modify_archive_query');
Hoặc có thể thay tham số :) $query->set('posts_per_page', 2); bởi $query->query_vars['posts_per_page'] = 2;

C:\xampp\htdocs\wordpress\wp-content\themes\twentytwentyone\archive.php

<?php if ( have_posts() ) : ?>
	<?php while ( have_posts() ) : ?>
		<?php the_post(); ?>
		<?php 
			the_title();  
			echo "<br />";
		?>
	<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>

Last updated