Чи можна правильно дописувати дописи, які впорядковані випадковим чином?


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 () приймає насіння як необов'язковий аргумент. Використовуючи насіння, воно буде щоразу повертати однакові рандомізовані результати.

Таким чином, ви можете генерувати випадкове число при завантаженні першої сторінки, а потім зберігати його в змінній SESSION і використовувати це як насіння $ для подальших болючих запитів.

Якщо ви намагаєтеся, наприклад, домогтися цього у своєму головному циклі, ви можете додати наступне у файл function.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 тепер ви можете додати початкове значення у значення 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
Марк Каплун

Я відредагував свою відповідь, щоб пояснити, чому це міг бути кращим вибором замість використання фільтра в даному конкретному випадку.
Гікара

пізній +1, але cookie слід використовувати замість сесій. в основному сеанси ніколи не слід застосовувати, оскільки вони занадто проблематичні у всіх видах.
Марк Каплун

дуже допомогли .. дякую
Файсал Рамзан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.