Apakah mungkin untuk membuat paginasi posting dengan benar yang dipesan secara acak?

30

Saya menemukan masalah ini pada Dukungan Wordpress dan sayangnya topiknya sekarang ditutup. Saya memiliki masalah yang sama ... (baca di bawah)


Kami telah membuat situs di mana anggota dapat merekomendasikan hal-hal seperti buku favorit, film, lagu, dll. Untuk masalah ini saya akan menggunakan halaman Film sebagai contoh.

Halaman "Movies" pada akhirnya adalah templat halaman kustom yang meminta wordpress untuk menampilkan daftar acak dari SEMUA posting yang telah diberi kategori "film" (kategori 31). Ini menampilkan judul film-film ini secara acak menggunakan kode di bawah ini.

<?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; ?>

Masalahnya adalah daftarnya semakin panjang dan saya ingin membaginya menjadi dua atau lebih halaman masing-masing sekitar 10 film. Untuk mencapai ini, saya telah menggunakan kode di bawah ini.

<?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; ?>

Tetapi ada masalah karena meskipun membagi data menjadi 10 halaman masing-masing (paginates), ia gagal untuk memasukkan 10 posting baru di halaman 2 dan seterusnya. Dengan kata lain, karena daftar hal-hal dalam urutan acak, hanya keluar dan mendapat 10 posting acak (atau dalam hal ini judul film). Akibatnya, kami memiliki beberapa posting judul film yang diulang alih-alih satu set baru 10 judul film acak di halaman 2, dll.

Pertanyaan saya adalah - apa yang bisa saya tambahkan ke kode ini untuk membuat wordpress menjadi "ingat" yang mana 10 tulisan acak itu dimasukkan pada halaman 1, dan kemudian dapatkan 10 set posting baru untuk diletakkan di halaman 2, 3, dll hingga semua posting ditampilkan. Saya ingin hanya ada satu kejadian posting per halaman ketika diurutkan secara acak dalam set 10.

pengguna9604
sumber

Jawaban:

38

Anda dapat menggunakan filter untuk mengubah pernyataan ORDER BY WP_query.

Dengan begitu Anda bisa secara manual mengatur kueri untuk menggunakan ORDER BY RAND ($ seed);

Mysql RAND () menerima seed sebagai argumen opsional. Dengan menggunakan seed, ia akan mengembalikan hasil acak yang sama yang ditetapkan setiap kali.

Jadi Anda dapat menghasilkan nomor acak pada pemuatan halaman pertama kemudian menyimpannya dalam variabel SESSION dan menggunakannya sebagai $ seed untuk permintaan paginasi lebih lanjut.

Misalnya, jika Anda mencoba mencapainya di loop utama, Anda dapat menambahkan yang berikut ini ke file functions.php Anda.

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;
}
Nick Ryall
sumber
solusi sempurna. terima kasih banyak
Faisal Ramzan
4

Sejak WordPress versi terakhir, Anda sekarang dapat menambahkan seed ke nilai orderbyparameter WP_Query:

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

$seedadalah angka acak. Anda harus menyimpannya sebagai variabel sesi PHP. Jangan lupa untuk mengaktifkan sesi PHP di WordPress dengan memanggil session_start()Anda functions.php:

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

Dengan sintaks ini Anda tidak perlu menggunakan posts_orderbyfilter. Selain itu, Anda tidak perlu memastikan bahwa filter hanya diterapkan ke WP_Query yang ditargetkan.

Untuk informasi lebih lanjut silakan baca tiket ini di WordPress Core.

Guicara
sumber
jawabannya mungkin secara teknis benar, tetapi itu menyebalkan. tolong edit dan jelaskan alasannya alih-alih mengirim orang ke RTFM
Mark Kaplun
Saya telah mengedit jawaban saya untuk menjelaskan mengapa ini bisa menjadi pilihan yang lebih baik daripada menggunakan filter dalam kasus khusus ini.
Guicara
terlambat +1, tetapi cookie harus digunakan sebagai ganti sesi. pada dasarnya sesi tidak boleh digunakan karena terlalu bermasalah dalam segala hal.
Mark Kaplun
banyak membantu .. terima kasih
Faisal Ramzan