Intereting Posts
Вставка HTML для закрытия и открытия div в контурах WP_Query Создание настраиваемой формы регистра Категории продуктов не отображаются в качестве опции для создания меню ajax перестала работать, когда не вошла в систему? Используется более одного текстового домена из-за включенных шаблонов для плагинов Два экземпляра WordPress с разными URL-адресами и темами Заказ по первому названию Я использую get_posts неправильно? При изменении страниц на сообщения, как вы настраиваете 301 переадресацию для URL-адресов страниц? Как сделать динамически созданный контент доступным для поиска в WordPress? load-scripts.php загружает неправильные имена файлов Авто сортировать отдельную категорию по новизне (одна категория не всех) Как загрузить пользовательские скрипты и стили для страницы? Как я могу запрашивать пользователей по пользовательской роли? плагины не работают

Показать 4 хронологических сообщения, начиная со случайного сообщения

Я знаю, что я могу отображать 4 случайных сообщения, делая что-то вроде:

get_posts('orderby=rand&numberposts=4'); 

То, что я пытаюсь достичь, начинается с случайного элемента, но затем показывает следующие 3 сообщения, которые находятся в хронологическом порядке.

Я думаю что-то вроде этого:

 $posts = get_posts('orderby=rand&numberposts=1'); foreach($posts as $post) { the_title(); //get next 3 chronological posts and loop } 

Думаю, мне нужно использовать что-то вроде параметра «смещение», но с идентификатором сообщения вместо позиции?

Solutions Collecting From Web of "Показать 4 хронологических сообщения, начиная со случайного сообщения"

Для случайного смещения мы можем попробовать:

 $ppp = 4; $total = wp_count_posts()->publish; $offset = $total < $ppp ? 0 : rand( 0, $total - $ppp ); $posts = get_posts( [ 'posts_per_page' => $ppp, 'offset' => $offset ] ); 

Пример:

Давайте возьмем $ppp как 4 и предположим, что $total – 6.

Тогда есть три возможности для $offset , а именно 0, 1 и 2:

 Nr Offset Selections 1 0 x 2 1 xx 3 2 xxx 4 3 xxx 5 4 xx 6 5 x 

так

 $offset = $total < $ppp ? 0 : rand( 0, $total - $ppp ); 

даст:

 $offset = rand( 0, 6 - 4 ); 

или просто

 $offset = rand( 0, 2 ); 

Вот еще один подход, использующий date_query .

  • Мы получим одно случайное сообщение

  • Затем мы будем использовать date_query чтобы получить другие 3 сообщения, смежные с этой случайной почтой

Вот функция, которую мы будем использовать: ( ПРИМЕЧАНИЕ. Я прокомментировал код, чтобы было легко следовать, а код требует PHP 5.4+)

 function get_random_posts( $args = [], $direction = 'after' ) { /** * Lets first get our random post, then work from there. We will be using the same * exact arguments for all our queries we need to run. We do however need to modify * some a bit. We will save the default args to a another variable and then modify * the args to pass to the first query. * * We will let WP_Query handle the sanitation and validation from the * array of arguments. */ $random_args = $args; $random_args['orderby'] = 'rand'; $random_args['posts_per_page'] = 1; $random_post = get_posts( $random_args ); /** * We will o get the adjacent posts from the random one. We will be * using the default $args again * * We will need to sort out the amount of posts to get from the adjacent * post query first before we go along. We need to deduct one from the amount * of posts to adjust for the random post */ if ( isset( $args['posts_per_page'] ) ) { $args['posts_per_page'] = ( $args['posts_per_page'] - 1 ); } else { $args['posts_per_page'] = ( get_option( 'posts_per_page' ) - 1 ); } // Create our date query to get the adjacent posts $date_query = [ [ $direction => $random_post[0]->post_date, 'inclusive' => false ] ]; $args['date_query'] = $date_query; // Set the order parameter according to direction if ( $direction === 'after' ) { $args['order'] = 'ASC'; } else { $args['order'] = 'DESC'; } $adjacent_query = get_posts( $args ); // Merge and return the posts return array_merge( $random_post, $adjacent_query ); } 

Как вы можете видеть, первым параметром функции является $args . Это будет массив аргументов, которые вы обычно переходите к WP_Query . Второй параметр, $direction будет направлением соседних сообщений, before или after соответствии с потребностями.

Вы должны использовать функцию следующим образом:

 $args = [ 'posts_per_page' => 4 // The amount of posts to get // Any other arguments you might need ]; $q = get_random_posts( $args ); foreach ( $q as $post ) { setup_postdata( $post ); the_title(); } wp_reset_postdata();