Có thể phân trang bài viết chính xác được sắp xếp ngẫu nhiên?


30

Tôi thấy vấn đề này trên Hỗ trợ Wordpress và chủ đề không may hiện đang bị đóng. Tôi có vấn đề tương tự ... (đọc bên dưới)


Chúng tôi đã tạo một trang web nơi các thành viên có thể đề xuất những thứ như sách yêu thích, phim, bài hát, v.v. Đối với vấn đề này, tôi sẽ sử dụng trang Phim làm ví dụ.

Trang "Phim" cuối cùng là một mẫu trang tùy chỉnh yêu cầu wordpress hiển thị danh sách ngẫu nhiên TẤT CẢ các bài đăng đã được đưa ra danh mục "phim" (loại 31). Nó hiển thị tiêu đề của những bộ phim này theo thứ tự ngẫu nhiên bằng cách sử dụng mã dưới đây.

<?php 
$rand = new WP_Query("cat=31&showposts=-1&orderby=rand"); 
while($rand->have_posts()) : $rand->the_post();
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>

Vấn đề là danh sách đang trở nên khá dài và tôi muốn chia nó thành hai hoặc nhiều trang trong khoảng 10 bộ phim. Để đạt được điều này, tôi đã sử dụng mã dưới đây.

<?php 
$page = (get_query_var('paged')) ? get_query_var('paged') : 1; 
query_posts("cat=31&orderby=rand&showposts=10&paged=$page"); 
while ( have_posts() ) : the_post() 
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>

Nhưng có một vấn đề bởi vì mặc dù nó phân chia dữ liệu thành các trang của 10 bài đăng mỗi bài (số trang), nhưng nó không bao gồm một bộ 10 bài đăng mới trên trang 2 và vv. Nói cách khác, vì nó liệt kê mọi thứ theo thứ tự ngẫu nhiên, nó chỉ cần ra ngoài và nhận thêm 10 bài đăng ngẫu nhiên (hoặc trong trường hợp này là tiêu đề phim). Do đó, chúng tôi có một số bài đăng tiêu đề phim lặp đi lặp lại thay vì một bộ 10 tiêu đề phim ngẫu nhiên mới trên trang 2, v.v.

Câu hỏi của tôi là - tôi có thể thêm gì vào mã này để có được wordpress để "nhớ" 10 bài đăng ngẫu nhiên mà nó bao gồm trên trang 1, và sau đó lấy một bộ 10 bài đăng mới để đặt ở trang 2, 3, v.v. tất cả các bài viết được hiển thị. Tôi muốn chỉ có một lần xuất hiện của một bài đăng trên mỗi trang khi được sắp xếp ngẫu nhiên theo bộ 10.

Câu trả lời:


38

Bạn có thể sử dụng bộ lọc để sửa đổi câu lệnh ORDER BY của WP_query.

Bằng cách đó, bạn có thể đặt truy vấn theo cách thủ công để sử dụng ORDER BY RAND ($ seed);

Mysql RAND () chấp nhận một hạt giống như một đối số tùy chọn. Sử dụng một hạt giống, nó sẽ trả về cùng một kết quả được đặt ngẫu nhiên mỗi lần.

Vì vậy, bạn có thể tạo một số ngẫu nhiên trong lần tải trang đầu tiên, sau đó lưu nó vào biến SESSION và sử dụng số đó làm $ seed cho các yêu cầu phân trang tiếp theo.

Ví dụ, nếu bạn đang cố gắng đạt được điều này trên vòng lặp chính của mình, bạn có thể thêm phần sau vào tệp tin.php.

session_start();

add_filter('posts_orderby', 'edit_posts_orderby');

function edit_posts_orderby($orderby_statement) {

    $seed = $_SESSION['seed'];
    if (empty($seed)) {
      $seed = rand();
      $_SESSION['seed'] = $seed;
    }

    $orderby_statement = 'RAND('.$seed.')';
    return $orderby_statement;
}

Giải pháp hoàn hảo. cảm ơn bạn rất nhiều
Faisal Ramzan

4

Kể từ các phiên bản cuối cùng của WordPress, giờ đây bạn có thể thêm hạt giống vào giá trị của orderbytham số WP_Query:

$query = new WP_Query([
    'orderby' => 'RAND($seed)',
    ...
]);

$seedlà một số ngẫu nhiên. Bạn nên lưu trữ nó như một biến phiên PHP. Đừng quên bật phiên PHP trong WordPress bằng cách gọi cho session_start()bạn functions.php:

if (!session_id()) {
    session_start();
}

Với cú pháp này, bạn không cần sử dụng posts_orderbybộ lọc. Hơn nữa, bạn không phải đảm bảo rằng bộ lọc chỉ được áp dụng cho WP_Query được nhắm mục tiêu.

Để biết thêm thông tin xin vui lòng đọc vé này trên WordPress Core.


Câu trả lời có thể đúng về mặt kỹ thuật, nhưng nó thật tệ. vui lòng chỉnh sửa và giải thích lý do tại sao thay vì gửi người đến RTFM
Mark Kaplun

Tôi đã chỉnh sửa câu trả lời của mình để giải thích tại sao nó có thể là lựa chọn tốt hơn thay vì sử dụng bộ lọc trong trường hợp cụ thể này.
Guicara

+1 muộn, nhưng nên sử dụng cookie thay vì phiên. về cơ bản các phiên không bao giờ nên được sử dụng vì chúng quá khó khăn trong tất cả các cách.
Đánh dấu Kaplun

đã giúp đỡ rất nhiều .. cảm ơn
Faisal Ramzan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.