Запрос WordPress: групповые сообщения по годам DES C, затем сообщения по месяцам AS C в каждой группе - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь настроить запрос WordPress и l oop так, чтобы события группировались по годам в порядке по убыванию , с заголовком для каждого года, а затем упорядочивались по месяцам в * 1003. * по возрастанию порядок для каждой группы года, например:

2020

  • 1 января 2020 года
  • 1 февраля 2020 года
  • 1 марта 2020 года

2019

  • 1 января 2019
  • 1 февраля 2019
  • 1 марта 2019

Я нашел несколько полезных потоков, которые указывают в правильном направлении, например this , который использует прямой запрос SQL для получения сообщений по годам, а затем запускает обычно l oop на WP_Query для группировки и сортировки сообщений в каждой группе. Однако в моем случае вместо использования post_date у меня есть настраиваемое поле (с использованием расширенных настраиваемых полей) для event_end_date, которое должно определять порядок публикаций и определения групп.

Запрос SQL в связанном примере:

$sql = "SELECT DISTINCT(YEAR(`post_date`)) as years FROM $posts WHERE post_type = 'testimonials' ORDER BY years DESC"; //Get all post year list by DESC

$result = $wpdb->get_results($sql);

foreach($result as $rs) {
    echo '<h2>'.$rs->years.'</h2>';
    $args = array(
        'post_type' => 'event',
        'post_per_page'=> -1,
        'post_status' => 'publish',
        'orderby'   => 'date',
        'order' => 'DESC',
        'date_query' => array(array(
            'year'=> $rs->years,
        ),),

    );

     $loop = new WP_Query($args);

     if($loop->have_posts()) {

        while($loop->have_posts()) : $loop->the_post();

            echo '<a href="'.get_permalink().'">'.get_the_date().'</a>';
        endwhile;

     }
}

И я не совсем уверен, как изменить его так, чтобы я мог запросить пользовательское поле event_end_date и создать группы по годам, в пределах которых я могу затем перечислить сообщения, отсортированные по месяцам AS C.

Я предполагаю, что мне нужно , чтобы использовать ручной запрос SQL здесь, в котором типичный WP_Query не позволил бы сортировку двумя разными способами, как я описал? Я могу легко выводить события в группы с заголовками для каждого года, но только в одном установленном порядке, то есть AS C или DES C. Спасибо за любую помощь здесь, и, пожалуйста, дайте мне знать, если это неясно в любом случае.

1 Ответ

0 голосов
/ 10 апреля 2020

Если вы используете «Выбор даты» в расширенных настраиваемых полях, вот как вы сортируете по настраиваемому полю сообщений WP_Query:

<?php 
$year = '';
$args = array(
    'posts_per_page'    => -1,
    'meta_key'          => 'event_end_date',
    'orderby'           => 'meta_value_num',
    'order'             => 'DESC',
);
$the_query = new WP_Query( $args );
?>      
<?php if ( $the_query->have_posts() ) : ?>
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

        <?php

        // create the date variables
        $event_date_string = get_field('event_end_date');
        $event_date = DateTime::createFromFormat('Ymd', $event_date_string);
        $event_year = $event_date->format('Y');

        // add header for each year
        if ($year != $event_year) :
           echo '<div><b>' . $event_year . '</b></div>';
           $year = $event_year;
        endif;

        // echo out current post
        echo '<div>' . $event_date . ': ' . get_the_title() . '</div>';

        ?>

    <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>
<?php endif; ?>

Объяснение:

  1. Создайте переменную $ year для отслеживания текущего года
  2. Получите все сообщения с WP_Query и сортируйте по 'event_end_date' в DES C порядке
  3. L oop через сообщения и получить год события для каждого сообщения, которое мы используем для обновления переменной $ year

Более подробная информация здесь: https://www.advancedcustomfields.com/resources/date-picker/

...