Thay đổi các bài đăng trên mỗi trang trên trang đầu tiên mà không phá vỡ phân trang trong WordPress

Mỗi trang (các trang được phân trang đầu tiên và tiếp theo) của trang Bài đăng trong WordPress hiển thị cùng một số lượng bài đăng như được đặt cho cài đặt “Các trang blog hiển thị nhiều nhất”. Nếu bạn muốn hiển thị một số lượng bài đăng khác nhau trên trang đầu tiên, điều này có thể được thực hiện bằng cách chỉ định posts_per_page cho (các) trang không được phân trang / phân trang trong một hàm được kết nối với pre_get_posts hành động. Tuy nhiên, điều này ảnh hưởng đến việc phân trang và dẫn đến thiếu (các) bài đăng.

Việc thêm phần sau vào functions.php của chủ đề con sẽ khắc phục sự cố phân trang khi có phần bù cho trang đầu tiên.

add_action( 'pre_get_posts', 'sk_query_offset', 1 );
function sk_query_offset( &$query ) {

	// Before anything else, make sure this is the right query...
	if ( ! ( $query->is_home() || is_main_query() ) ) {
		return;
	}

	// First, define your desired offset...
	$offset = -1;

	// Next, determine how many posts per page you want (we'll use WordPress's settings)
	$ppp = get_option( 'posts_per_page' );

	// Next, detect and handle pagination...
	if ( $query->is_paged ) {

		// Manually determine page query offset (offset + current page (minus one) x posts per page)
		$page_offset = $offset + ( ( $query->query_vars['paged']-1 ) * $ppp );

		// Apply adjust page offset
		$query->set( 'offset', $page_offset );

	}
	else {

		// This is the first page. Set a different number for posts per page
		$query->set( 'posts_per_page', $offset + $ppp );

	}
}

add_filter( 'found_posts', 'sk_adjust_offset_pagination', 1, 2 );
function sk_adjust_offset_pagination( $found_posts, $query ) {

	// Define our offset again...
	$offset = -1;

	// Ensure we're modifying the right query object...
	if ( $query->is_home() && is_main_query() ) {
		// Reduce WordPress's found_posts count by the offset...
		return $found_posts - $offset;
	}
	return $found_posts;
}

Đặt giá trị của độ lệch mong muốn của bạn trong cả hai trường hợp. Trong đoạn mã trên, nó được đặt thành -1 nghĩa là trang đầu tiên sẽ hiển thị ít hơn 1 bài đăng so với những gì được đặt trong Cài đặt> Đọc.