Intereting Posts
Справка с раскрывающимся меню get_categories () – я хочу, чтобы он показывался в хирахиальной форме 14 000 пользователей WordPress. Как они туда попали? Shortcode вставляет абзацы до и после выполнения короткого кода Какой файл отображает страницу настроек «Редактировать галерею»? Как отобразить список сообщений в макете таблицы (несколько запросов в одном цикле) Отображать миниатюру ребенка, родителя и предка с использованием эскизов Основной вопрос PHP (отображение заголовка сообщения над миниатюрами) связанные сообщения – вытягивание тегов из определенного типа сообщения как проверить, существует ли столбец пользовательского столбца? Первая установка WordPress. Cant Access Как использовать is_admin в содержании страницы? Получить размер изображений вложений вложений и использовать их в коде для встраивания настраиваемое поле всегда для .get_the_title ()? wp_editor некоторая функциональность, не работающая над настраиваемой темой Как использовать персонализированный архив типа публикации в качестве главной страницы?

Показать сообщения за месяц

Я хочу добиться чего-то подобного, я не знаю, возможно ли это и как лучше всего это сделать:

введите описание изображения здесь

То, как я запрашиваю сообщения, выглядит следующим образом:

<div class="post"> <?php global $wp_query; query_posts( array('post_type' => array( 'lecturas-post' ),'showposts' => 15, 'paged'=>$paged, 'order' => 'DESC' ));?> <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?> <div><?php the_title() ?></a> <?php endwhile; // end of the loop. ?> </div> 

Кто-нибудь может дать мне подсказку о том, как и как это сделать?

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

ПОСЛЕДНИЕ ПРИМЕЧАНИЯ

Прежде чем начать, несколько примечаний:

  • Никогда не используйте query_posts , за исключением случаев, когда вам действительно нужно разбить все на странице. Он не просто перезапускает основной запрос, а также разбивает его, он испортит разбиение на страницы и ваши глобальные значения, а также беспорядок с вашими запрошенными функциями объекта. Если вам действительно нужно запустить пользовательский запрос, используйте WP_Query или get_posts

  • showposts был showposts лет назад в пользу posts_per_page

  • Не нужно использовать глобальную $wp_query . query_posts беспорядки, что в любом случае

ПЛАН

Сообщение отправляется в хронологическом порядке с первым постом, а самое старое сообщение – последним, поэтому они уже в правильном порядке. Это просто вопрос отображения даты в соответствующем месте.

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

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

Для этого вам необходимо:

  • Получите месяц с даты публикации текущего сообщения. Для этого используйте get_the_date( 'F' )

  • Получите предыдущую запись в цикле с $wp_query->posts['this will be current post -1 ']->post .

  • Получите и сравните месяцы между двумя сообщениями

  • Отображать или не отображать дату в соответствии со сравнением

КОД

Этот код входит в ваш цикл сразу после вашего while() .

 $current_month = get_the_date('F'); if( $wp_query->current_post === 0 ) { the_date( 'FY' ); }else{ $f = $wp_query->current_post - 1; $old_date = mysql2date( 'F', $wp_query->posts[$f]->post_date ); if($current_month != $old_date) { the_date( 'FY' );; } } 

ТАМОЖЕННЫЙ ВОПРОС

Если вам нужно запустить пользовательский запрос, попробуйте это

 $q = new WP_Query( array('post_type' => array( 'lecturas-post' ),'posts_per_page' => 15, 'paged'=>$paged, 'order' => 'DESC' )); if( $q->have_posts() ) { while( $q->have_posts() ) { $q->the_post(); $current_month = get_the_date('F'); if( $q->current_post === 0 ) { the_date( 'FY' ); }else{ $f = $q->current_post - 1; $old_date = mysql2date( 'F', $q->posts[$f]->post_date ); if($current_month != $old_date) { the_date( 'FY' );; } } the_title(); } } 

Обновленный ответ

Ознакомившись с комментарием от @PieterGoosen ниже, я добавил метод достижения вашей цели, используя один запрос.

Я сравнивал методы, и один запрос выполняется быстрее, а метод множественных запросов примерно на 15% медленнее . Не грамотность, но каждый маленький помогает, и, честно говоря, метод, вероятно, может быть уточнен дальше.

Я оставил метод множественных запросов в ответе за процветание, но я рекомендую использовать метод одиночных запросов.

Метод одиночного запроса

 $time_start = microtime(true); /** Set up a date interval object for 6 monts ago (you can change as required) */ $interval = new DateInterval('P6M'); $interval->invert = 1; /** Grab the date as it was 6 months ago */ $date = new DateTime(date('Ym-d')); $date->add($interval); /** Query the database for all posts newer than the the given date interval */ $args = array( 'nopaging' => true, 'posts_per_page' => -1, 'post_type' => 'post', 'post_status' => 'publish', 'order_by' => 'date', 'date_query' => array( 'after' => $date->format('Ym-d') ) ); $month_query = new WP_Query($args); /** Check to ensure that there are articles for this month... */ if($month_query->have_posts()) : $month_titles = array(); $close_ul = false; //echo '<ul style="padding-left: 250px;" id="monthly-posts">'; /** Set the attributes for displaying the title as an attribute */ $title_attribute_args = array( 'before' => 'Visit article \'', 'after' => '\' ', 'echo' => false ); /** Loop through each post for this month... */ while($month_query->have_posts()) : $month_query->the_post(); /** Check the month/year of the current post */ $month_title = date('F Y', strtotime(get_the_date('Ymd H:i:s'))); /** Maybe output a human friendly date, if it's not already been output */ if(!in_array($month_title, $month_titles)) : if($close_ul) echo '</ul>'; // Check if the unordered list of posts should be closed (it shouldn't for the first '$monthe_title') echo '<h1 style="padding-left: 250px;" id="monthly-title">' . $month_title . '</h1>'; // Output the '$month_title' echo '<ul style="padding-left: 250px;" id="monthly-posts">'; // Open an unordered lists for the posts that are to come $month_titles[] = $month_title; // Add this `$month_title' to the array of `$month_titles` so that it is not repeated $close_ul = true; // Indicate that the unordered list should be closed at the next oppurtunity endif; /** Output each article for this month */ printf( '<li id="monthly-post-%1$s">%2$s <a href="%3$s" title="%4$s">%3$s</a></li>', get_the_ID(), /** %1$s - The ID of the post */ get_the_title(), /** %2$s - The article title */ get_permalink(get_the_ID()), /** %3$s - The article link */ the_title_attribute($title_attribute_args) /** %4$s - The title for use as an attribute */ ); endwhile; if($close_ul) echo '</ul>'; // Close the last unordered list of posts (if there are any shown) endif; /** Reset the query so that WP doesn't do funky stuff */ wp_reset_query(); - $time_start = microtime(true); /** Set up a date interval object for 6 monts ago (you can change as required) */ $interval = new DateInterval('P6M'); $interval->invert = 1; /** Grab the date as it was 6 months ago */ $date = new DateTime(date('Ym-d')); $date->add($interval); /** Query the database for all posts newer than the the given date interval */ $args = array( 'nopaging' => true, 'posts_per_page' => -1, 'post_type' => 'post', 'post_status' => 'publish', 'order_by' => 'date', 'date_query' => array( 'after' => $date->format('Ym-d') ) ); $month_query = new WP_Query($args); /** Check to ensure that there are articles for this month... */ if($month_query->have_posts()) : $month_titles = array(); $close_ul = false; //echo '<ul style="padding-left: 250px;" id="monthly-posts">'; /** Set the attributes for displaying the title as an attribute */ $title_attribute_args = array( 'before' => 'Visit article \'', 'after' => '\' ', 'echo' => false ); /** Loop through each post for this month... */ while($month_query->have_posts()) : $month_query->the_post(); /** Check the month/year of the current post */ $month_title = date('F Y', strtotime(get_the_date('Ymd H:i:s'))); /** Maybe output a human friendly date, if it's not already been output */ if(!in_array($month_title, $month_titles)) : if($close_ul) echo '</ul>'; // Check if the unordered list of posts should be closed (it shouldn't for the first '$monthe_title') echo '<h1 style="padding-left: 250px;" id="monthly-title">' . $month_title . '</h1>'; // Output the '$month_title' echo '<ul style="padding-left: 250px;" id="monthly-posts">'; // Open an unordered lists for the posts that are to come $month_titles[] = $month_title; // Add this `$month_title' to the array of `$month_titles` so that it is not repeated $close_ul = true; // Indicate that the unordered list should be closed at the next oppurtunity endif; /** Output each article for this month */ printf( '<li id="monthly-post-%1$s">%2$s <a href="%3$s" title="%4$s">%3$s</a></li>', get_the_ID(), /** %1$s - The ID of the post */ get_the_title(), /** %2$s - The article title */ get_permalink(get_the_ID()), /** %3$s - The article link */ the_title_attribute($title_attribute_args) /** %4$s - The title for use as an attribute */ ); endwhile; if($close_ul) echo '</ul>'; // Close the last unordered list of posts (if there are any shown) endif; /** Reset the query so that WP doesn't do funky stuff */ wp_reset_query(); 

Оригинальный ответ

Попробуй. Я настроил его так, чтобы были выбраны только последние 6 месяцев и только последние 5 сообщений за каждый месяц, но вы можете изменить это, как вам будет угодно.

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

Метод множественных запросов

 global $wpdb, $wp_locale; /** Query the individual months to display (I've chosen the last 6 months) */ $query = $wpdb->prepare(' SELECT DISTINCT YEAR(`%1$s`.`post_date`) AS year, MONTH(`%1$s`.`post_date`) AS month FROM `%1$s` WHERE `%1$s`.`post_type` = "post" ORDER BY `%1$s`.`post_date` DESC LIMIT 6', $wpdb->posts ); $months = $wpdb->get_results($query); /** Count the number of months */ $month_count = count($months); /** Ensure that there are months to display... */ if($month_count || ($month_count === 1 && $months[0]->month > 0)) : /** Loop through each month... */ foreach($months as $month) : if($month->year === 0) : continue; endif; /** Grab the individual month and year, and construct a human friendly date (for the title) */ $m = zeroise($month->month, 2); $y = $month->year; $human_date = sprintf(__('%1$s %2$d'), $wp_locale->get_month($m), $y); /** Grab any posts for this month (I've chosedn only the last 5 posts) */ $args = array( 'nopaging' => true, 'posts_per_page' => 5, 'post_type' => 'post', 'post_status' => 'publish', 'order_by' => 'date', 'year' => $y, 'monthnum' => $m ); $month_query = new WP_Query($args); /** Check to ensure that there are articles for this month... */ if($month_query->have_posts()) : /** Output a human friendly date */ echo '<h1 id="monthly-title">' . $human_date . '</h1>'; echo '<ul id="monthly-posts">'; /** Set the attributes for displaying the title as an attribute */ $title_attribute_args = array( 'before' => 'Visit article \'', 'after' => '\' ', 'echo' => false ); /** Loop through each post for this month... */ while($month_query->have_posts()) : $month_query->the_post(); /** Output each article for this month */ printf( '<li id="monthly-post-%1$s">%2$s <a href="%3$s" title="%4$s">%3$s</a></li>', get_the_ID(), /** %1$s - The ID of the post */ get_the_title(), /** %2$s - The article title */ get_permalink(get_the_ID()), /** %3$s - The article link */ the_title_attribute($title_attribute_args) /** %4$s - The title for use as an attribute */ ); endwhile; echo '</ul>'; endif; /** Reset the query so that WP doesn't do funky stuff */ wp_reset_query(); endforeach; endif; 

Это функция, которую я использовал для общих нужд, для получения данных post или custom post типов до или после определенного года / месяца или текущего года в зависимости от того, какой порядок вам нужен:

 // you could change the name in case it collides with some other plugin function get_posts_by_date($user_options = array()){ $options = array( 'year_limit' => '1980' ,'month_limit' => '01' ,'operator' => '>=' // date comparison operator ,'current_year' => true // limit data to current year ,'post_type' => 'post' ,'year_order' => 'DESC' ,'month_order' => 'DESC' ,'post_ids_order' => 'DESC' ,'raw_output' => false ); extract(array_merge($options, $user_options)); global $wpdb; if($operator == '>=' || $operator == '=='){ $day = "01"; } elseif($mode == '<='){ $day = "31"; } if($current_year){ // will be after [previous year]/12/31 $year_limit = date('Y', strtotime('-1 year')); $month_limit = '12'; $day = "31"; $operator == '>='; } // warning: if your parameters come from user input/forms, // pass them using $wpdb::prepare() // https://developer.wordpress.org/reference/classes/wpdb/prepare/ $results = $wpdb->get_results(" SELECT tbl.y year, group_concat(month_posts ORDER BY tbl.m " . $month_order . " SEPARATOR '-') months FROM ( SELECT YEAR(p.post_date) y, MONTH(p.post_date) m, concat(MONTH(p.post_date), ':', group_concat(p.id ORDER BY p.post_date " . $post_ids_order . " )) month_posts FROM $wpdb->posts p WHERE (p.post_status = 'publish' OR p.post_status = 'future') AND p.post_type = '" . $post_type . "' AND p.post_date " . $operator . " DATE('" . $year_limit . "-" . $month_limit . "-" . $day . " 00:00:00') GROUP BY y, m ) tbl GROUP BY tbl.y ORDER BY tbl.y " . $year_order ); if($raw_output) return $results; global $wp_locale; foreach ($results as $data){ $months_data = explode('-',$data->months); $months = array(); $data->count = 0; // year count foreach ($months_data as $month_data){ $month_obj = new stdClass; $splitted = explode(':',$month_data); $raw_month = $splitted[0]; $month_obj->number = $raw_month; $month_obj->name = $wp_locale->get_month($raw_month); $month_obj->posts = array(); $post_ids = explode(',',$splitted[1]); $data->count += count($post_ids); foreach($post_ids as $post_id){ $month_obj->posts[] = get_post($post_id); $months[$raw_month] = $month_obj; }// foreach }// foreach $data->months = $months; }// foreach return $results; }// get_posts_by_date 

Пример использования:

 $posts_by_date = get_posts_by_date(array( 'year_limit' => '2016' ,'operator' => '<=' ,'current_year' => false ,'post_type' => 'product' ,'month_order' => 'ASC' ,'raw_output' => true )); 

Если параметр raw_output равен true, выход по умолчанию будет выглядеть примерно так:

 array(2) { [0]=> object(stdClass)#6645 (2) { ["year"]=> string(4) "2017" ["months"]=> string(65) "8:386,401-7:406,373,380,377,408,399,362-6:1,391,404-5:367,397,394" } [1]=> object(stdClass)#6644 (2) { ["year"]=> string(4) "2016" ["months"]=> string(5) "6:429" } } 

Строка «месяцев» содержит значения, отформатированные как:

 month:[post ids]-month:[post ids]-ecc 

Если параметр raw_output равен false, вы получите список сообщений, подобных этому:

 array (array of objects) object -> year (ex. '2017') -> count (total year's posts) -> months (array of objects) month -> number (of month) -> name (localized) -> posts (array of post objects) 

Счастливое кодирование … 🙂