Возможно ли правильно упорядочить столбцы сообщений, упорядоченные по произвольному порядку?

Я нашел эту проблему в Wordpress Support, и к сожалению, эта тема закрыта. У меня такая же проблема ... (читайте ниже)


Мы создали сайт, на котором участники могут рекомендовать такие вещи, как любимые книги, фильмы, песни и т. д. Для этой проблемы я буду использовать страницу «Фильмы» в качестве примера.

Страница «Фильмы» - это, в конечном счете, настраиваемый шаблон страницы, который просит 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 сообщений каждый (paginates), он не может включить новый набор из 10 сообщений на странице 2 и так далее. Другими словами, поскольку он перечисляет вещи в произвольном порядке, он просто гаснет и получает еще 10 случайных сообщений (или в этом случае названия фильмов). В результате у нас есть несколько повторных заголовков видеозаписей вместо нового набора из 10 случайных названий фильмов на стр. 2 и т. Д.

Мой вопрос: что я могу добавить к этому коду, чтобы заставить Wordpress «помнить», какие случайные 10 сообщений, включенных в него на стр. 1, а затем получить новый набор из 10 сообщений для размещения на страницах 2, 3, и т. д., пока не будут показаны все сообщения. Я бы хотел, чтобы было только одно появление сообщения на странице при сортировке случайным образом в наборах из 10.

27 голосов | спросил user9604 20 +04002011-10-20T22:59:44+04:00312011bEurope/MoscowThu, 20 Oct 2011 22:59:44 +0400 2011, 22:59:44

2 ответа


36

Вы можете использовать фильтр для изменения инструкции ORDER BY WP_query.

Таким образом, вы можете вручную задать запрос для использования ORDER BY RAND ($ seed);

Mysql RAND () принимает семя в качестве необязательного аргумента. Используя семя, он будет возвращать тот же рандомизированный результирующий набор каждый раз.

Таким образом, вы можете сгенерировать случайное число при загрузке первой страницы, а затем сохранить его в переменной 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;
}
ответил Nick Ryall 9 32011vEurope/Moscow11bEurope/MoscowWed, 09 Nov 2011 12:35:53 +0400 2011, 12:35:53
2

Начиная с последних версий 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.

ответил Guicara 21 J000000Friday17 2017, 16:31:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132