Thêm sắp xếp sản phẩm ngẫu nhiên trong danh mục woocommerce

Khi khách chọn “Sắp xếp theo thứ tự ngẫu nhiên” - các sản phẩm sẽ được hiển thị ngẫu nhiên và mỗi khi trang Shop được tải, các sản phẩm sẽ được chọn ngẫu nhiên NHƯNG khi khách nhấp vào các liên kết phân trang, thứ tự sản phẩm vẫn được giữ nguyên! Vì vậy, sẽ không có sản phẩm nào được lặp lại hai lần.

Bước 1. Thêm một tùy chọn sắp xếp mới

add_filter( 'woocommerce_catalog_orderby', 'aznet_random_sorting_option' );

function aznet_random_sorting_option( $options ){

	$options['rand'] = 'Sắp xếp theo thứ tự ngẫu nhiên';
	return $options;

}

Thêm sắp xếp theo một tùy chọn thứ tự ngẫu nhiên

Khi chúng tôi thêm các tùy chọn sắp xếp trong hướng dẫn ban đầu, chúng tôi cũng sử dụng một móc lọc woocommerce_get_catalog_ordering_args để làm cho việc sắp xếp hoạt động, nhưng trong ví dụ này, chúng tôi không cần nó, bởi vì việc sắp xếp của chúng tôi sẽ diễn ra ở một cấp độ khác, với hook posts_orderby.

Bước 2. Sắp xếp các sản phẩm theo thứ tự ngẫu nhiên hỗ trợ phân trang

Trước hết - chỉ là một giới thiệu nhỏ về cú pháp SQL RAND(). Vấn đề là RAND() chấp nhận tham số duy nhất, khi được cung cấp RAND( N ) sẽ trả về cùng một giá trị mỗi lần.

Tất nhiên, WordPress orderby hoạt động trên cơ sở RAND() và có một số móc lọc cho phép bạn sửa đổi các câu lệnh SQL trong WordPress trước khi thực thi chúng. Những móc này là posts_orderby (đó là những gì chúng ta cần) posts_where , posts_join v.v.

session_start();

add_filter( 'posts_orderby', 'aznet_rand_order_with_seed' );

function aznet_rand_order_with_seed( $orderby ){

	if( !is_shop() ) return $orderby;

	// do the magic only when "Sort in a random order" is selected
	if( isset( $_GET['orderby'] ) && 'rand' === $_GET['orderby'] ) {

		// reset the order each time the 1st page is visited
		if( ! is_paged() && isset( $_SESSION['seed'] ) ) {
			unset( $_SESSION['seed'] );
		}

		$seed = false;
		if( isset( $_SESSION['seed'] ) ) {
			$seed = $_SESSION['seed'];
		}

		// Set a new seed if not exists
		if ( ! $seed ) {
			$seed = rand();
			$_SESSION['seed'] = $seed;
		}

		// pass it to an SQL query
		$orderby = 'RAND(' . $seed . ')';

	}

	return $orderby;

}

Hãy nhớ rằng posts_orderby được kích hoạt ở mọi nơi, ngay cả trong quản trị viên WordPress, vì vậy đừng quên các câu lệnh điều kiện, tôi sử dụng is_shop() có nghĩa là trang Shop, đối với WooCommerce, bạn cũng có thể sử dụng is_product_category() hoặc is_product_tag() tùy thuộc vào trang mà bạn sẽ thực hiện thứ tự các bài đăng ngẫu nhiên. .

Và mã có thể được sử dụng không chỉ cho các sản phẩm WooCommerce mà cho bất kỳ loại bài đăng nào khác.