เป็นไปได้หรือไม่ที่จะให้เลขหน้าอย่างถูกต้องว่ามีการเรียงลำดับแบบสุ่ม?


30

ฉันพบปัญหานี้ในการสนับสนุน Wordpress และหัวข้อน่าเสียดายที่ตอนนี้ปิด ฉันมีปัญหาเดียวกันนี้ ... (อ่านด้านล่าง)


เราได้สร้างเว็บไซต์ที่สมาชิกสามารถแนะนำสิ่งต่าง ๆ เช่นหนังสือเล่มโปรดภาพยนตร์เพลง ฯลฯ สำหรับปัญหานี้ฉันจะใช้หน้าภาพยนตร์เป็นตัวอย่าง

ในที่สุดหน้า "ภาพยนตร์" เป็นเทมเพลตหน้าแบบกำหนดเองที่ขอให้ wordpress แสดงรายการแบบสุ่มของโพสต์ทั้งหมดที่ได้รับหมวดหมู่ "ภาพยนตร์" (หมวด 31) จะแสดงชื่อของภาพยนตร์เหล่านี้ตามลำดับแบบสุ่มโดยใช้รหัสด้านล่าง

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

ปัญหาคือรายการเริ่มค่อนข้างยาวและฉันต้องการแยกมันออกเป็นสองหน้าหรือมากกว่าประมาณ 10 เรื่องต่อภาพยนตร์ เพื่อให้บรรลุนี้ฉันได้ใช้รหัสด้านล่าง

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

แต่มีปัญหาเพราะถึงแม้ว่ามันจะแยกข้อมูลออกเป็นหน้า 10 โพสต์ในแต่ละครั้ง (หน้า) มันล้มเหลวในการรวม 10 โพสต์ใหม่ในหน้า 2 และอื่น ๆ กล่าวอีกนัยหนึ่งเพราะมันแสดงรายการตามลำดับแบบสุ่มมันเพิ่งจะออกและได้รับ 10 โพสต์แบบสุ่ม (หรือในกรณีนี้ชื่อภาพยนตร์) ด้วยเหตุนี้เราจึงมีโพสต์ชื่อภาพยนตร์ซ้ำหลายรายการแทนที่จะเป็นชื่อภาพยนตร์สุ่ม 10 เรื่องใหม่ในหน้า 2 เป็นต้น

คำถามของฉันคือ - ฉันจะเพิ่มอะไรในรหัสนี้เพื่อให้ wordpress "จดจำ" ซึ่งมีการโพสต์แบบสุ่ม 10 โพสต์ไว้ในหน้า 1 จากนั้นให้มี 10 โพสต์ใหม่ที่จะใส่ในหน้า 2, 3 เป็นต้น โพสต์ทั้งหมดจะปรากฏขึ้น ฉันต้องการให้มีเพียงหนึ่งโพสต์ต่อหน้าเมื่อมีการเรียงลำดับแบบสุ่มในชุด 10

คำตอบ:


38

คุณสามารถใช้ตัวกรองเพื่อแก้ไขคำสั่ง ORDER BY ของ WP_query

ด้วยวิธีนี้คุณสามารถตั้งค่าแบบสอบถามให้ใช้ ORDER BY RAND ($ seed) ด้วยตนเอง;

Mysql RAND () ยอมรับ seed เป็นอาร์กิวเมนต์ที่เป็นทางเลือก การใช้เมล็ดนั้นจะส่งกลับชุดผลลัพธ์แบบสุ่มที่เหมือนกันทุกครั้ง

ดังนั้นคุณสามารถสร้างตัวเลขสุ่มในการโหลดหน้าแรกจากนั้นเก็บไว้ในตัวแปร SESSION และใช้มันเป็น $ seed สำหรับการขอเลขหน้าเพิ่มเติม

หากคุณพยายามที่จะบรรลุผลนี้ในวงหลักของคุณเช่นคุณสามารถเพิ่มต่อไปนี้ไปยังไฟล์ functions.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;
}

โซลูชั่นที่สมบูรณ์แบบ ขอบคุณมาก
Faisal Ramzan

4

ตั้งแต่ WordPress เวอร์ชันสุดท้ายตอนนี้คุณสามารถเพิ่ม seed เข้ากับค่าของorderbyพารามิเตอร์ของWP_Query:

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

$seedเป็นตัวเลขสุ่ม คุณควรเก็บไว้เป็นตัวแปรเซสชัน PHP อย่าลืมเปิดใช้งานเซสชัน PHP ใน WordPress โดยโทรหาsession_start()คุณfunctions.php:

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

ด้วยไวยากรณ์นี้คุณไม่จำเป็นต้องใช้posts_orderbyตัวกรอง ยิ่งกว่านั้นคุณไม่จำเป็นต้องตรวจสอบให้แน่ใจว่าตัวกรองนั้นจะใช้กับ WP_Query เป้าหมายเท่านั้น

สำหรับข้อมูลเพิ่มเติมโปรดอ่านตั๋วนี้บน WordPress Core


คำตอบอาจถูกต้องในทางเทคนิค แต่มันแย่มาก โปรดแก้ไขและอธิบายสาเหตุของมันแทนที่จะส่งผู้คนไปที่ RTFM
Mark Kaplun

ฉันได้แก้ไขคำตอบของฉันเพื่ออธิบายว่าทำไมจึงเป็นทางเลือกที่ดีกว่าแทนที่จะใช้ตัวกรองในกรณีนี้
Guicara

+1 ล่าช้า แต่ควรใช้คุกกี้แทนเซสชัน โดยทั่วไปไม่ควรใช้เซสชันเนื่องจากมีปัญหามากเกินไปในวิธีการทุกประเภท
Mark Kaplun

ช่วยได้มาก .. ขอบคุณ
Faisal Ramzan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.