Rastgele sıralanan gönderileri doğru şekilde sayfalandırmak mümkün mü?


30

Bu sorunu Wordpress Destek'te buldum ve ne yazık ki konu kapandı. Bu aynı sorun var ... (aşağıda okuyun)


Üyelerin favori kitaplar, filmler, şarkılar vb. Gibi şeyleri önerebilecekleri bir site oluşturduk. Bu problem için örnek olarak Filmler sayfasını kullanacağım.

"Filmler" sayfası, sonuçta, "filmler" kategorisi (kategori 31) verilen TÜM mesajların rastgele bir listesini görüntülemesini isteyen özel bir sayfa şablonudur. Aşağıdaki kodu kullanarak bu filmlerin başlığını rastgele sırada görüntüler.

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

Sorun şu ki, liste oldukça uzuyor ve her birini yaklaşık 10 filmlik iki veya daha fazla sayfaya ayırmak istiyorum. Bunu başarmak için aşağıdaki kodu kullandım.

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

Ancak bir sorun var, çünkü verileri her biri 10 gönderiye (sayfalar halinde) ekleyen sayfalara ayırsa da, sayfa 2'de vb. Yeni bir 10 yazı dizisi içermiyor. Başka bir deyişle, şeyleri rastgele bir sıraya göre sıraladığından, sadece dışarı çıkar ve 10 rastgele gönderiyi alır (veya bu durumda film başlıkları). Sonuç olarak, sayfa 2'deki vb. Yeni 10 rasgele film başlığı yerine bazı tekrarlanan film başlıkları var.

Sorum şu - bu koda ne ekleyebilirim, sayfa 1’de hangi rastgele 10 yazıyı ekleyeceğimi "hatırla" ya da daha sonra sayfa 2, 3’e kadar ekleyeceğimiz 10 yazıdan oluşan yeni bir yazı dizisi alabilmek için. tüm gönderiler görüntülenir. 10 küme rasgele sıralandığında sayfa başına yalnızca bir yayın oluşumu olmasını istiyorum.

Yanıtlar:


38

WP_query ORDER BY deyimini değiştirmek için bir filtre kullanabilirsiniz.

Bu şekilde, ORDER BY RAND ($ seed);

Mysql RAND (), bir tohumu isteğe bağlı bir argüman olarak kabul eder. Bir tohum kullanarak, her seferinde ayarlanan aynı rasgele sonucu döndürür.

Böylece ilk sayfa yükünde rastgele bir sayı oluşturabilir, daha sonra onu bir SESSION değişkeninde saklayabilir ve daha fazla sayfalandırılmış istekler için $ tohumu olarak kullanabilirsiniz.

Örneğin, bunu ana döngünüzde tutmaya çalışıyorsanız, functions.php dosyanıza aşağıdakileri ekleyebilirsiniz.

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

mükemmel çözüm. çok teşekkür ederim
Faisal Ramzan

4

WordPress'in son sürümlerinden bu yana, artık orderbyparametresinin değerine bir tohum ekleyebilirsiniz WP_Query:

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

$seedrastgele bir sayıdır. Bir PHP oturum değişkeni olarak saklamalısınız. WordPress'te PHP oturumunu session_start()sizi arayarak etkinleştirmeyi unutmayın functions.php:

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

Bu sözdizimi ile posts_orderbyfiltreyi kullanmanıza gerek yoktur . Ayrıca, filtrenin yalnızca hedeflenen WP_Query'ye uygulandığından emin olmanız gerekmez.

Daha fazla bilgi için lütfen bu bileti WordPress Çekirdeğinde okuyun .


Cevap teknik olarak doğru olabilir ama berbat. Lütfen insanları
RTFM'ye

Bu özel durumda bir filtre kullanmak yerine neden daha iyi bir seçenek olabileceğini açıklamak için cevabımı düzenlemiştim.
Guicara

+1 geç, ancak oturumlar yerine çerezler kullanılmalıdır. Temel olarak, oturumlar asla her türlü şekilde çok sorunlu oldukları için kullanılmamalıdır.
Mark Kaplun

çok yardımcı
oldum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.