Поддержка Проблемы и решения Сортировка записей по произвольному полю

  • Всем привет. Необходимо отсортировать список вывода новостей в определенной категории (id 106) по дате которая в дополнительном поле плагина ACF (date).
    Нашел кусочек кода в интернете:

    <?php 
        // задаем параметры выборки в массиве
        $args = array(
        'cat' => array(106), // ID рубрики
        'posts_per_page' => 8, // выводить по 8
        'meta_key' => 'date',
        'orderby' => 'meta_value_num date',
        'order' => 'ASC',
        'meta_type' => 'DATETIME',
        'meta_query' => array(
            array(
                'key' => 'date',
                'value' => date('d.m.Y'),
                'compare' => '>=',
                'type' => 'DATETIME'
            )
            ),
        );
    // запрос
    $query = new WP_Query( $args ); 
    ?>
    <?php if ( $query->have_posts() ) : ?>
      <!-- цикл -->
      <?php while ( $query->have_posts() ) : $query->the_post(); ?>
        <h1><?php the_title(); ?></h1>
      <?php endwhile; ?>
      <!-- конец цикла -->
      <?php wp_reset_postdata(); //очищаем результат запроса?>
    <?php else : ?>
      <p><?php esc_html_e( 'Ничего не найдено.' ); ?></p>
    <?php endif; ?>	

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

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Типы DATE и DATETIME работают с mysql-форматом даты, то есть ‘Y-m-d’.
    Матчасть: https://developer.wordpress.org/reference/classes/wp_meta_query/

    https://imgur.com/crfLbWa
    так разве в этом плагине не этот формат? d.m.Y
    на скрине формат даты

    • Ответ изменён 10 месяцев, 4 недели назад пользователем devero8524.

    так разве в этом плагине не этот формат? d.m.Y

    В плагине можете ставить что угодно. В mysql без дополнительных преобразований сравниваются только даты в т.н. шведском формате Y-m-d.

    Если плагин по-умному сохраняет метаданные типа «дата», то будет достаточно
    'value' => date('d.m.Y'),
    заменить на
    'value' => date('Y-m-d'),

    Если сохраняет, как задано для ввода-вывода, то придется шаманить с запросом.

    • Ответ изменён 10 месяцев, 4 недели назад пользователем Юрий.

    Я конечно не имею права просить такое, у вас скорее всего нету времени и желания делать мне готовый вариант, но все же, может вы сможете помочь мне написать код что бы оно работало корректно? У меня нету нужных знаний и я скорее всего не смогу их получить, а решения в общем то всегда ищу в интернете, но тут увы, не нашел. Могу если что оплатить ваш труд.

    Для начала попробуйте с 'value' => date('Y-m-d'),

    Предложения оплаты и т.п. допустимы (в качестве исключения) только в разделе «Поиск специалистов».

    Понял, извините.
    По поводу кода, возможно мне вообще вот этот массив не нужен?

    array(
                'key' => 'date',
                'value' => date('d.m.Y'),
                'compare' => '>=',
                'type' => 'DATETIME'
            )
            ),

    Так как — compare выводит только те записи, у которых дата и время больше или равны текущей дате. А мне необходимо просто отсортировать.

    Сделал так

    <?php 
        // задаем параметры выборки в массиве
        $args = array(
        'cat' => array(106), // ID рубрики
        'posts_per_page' => 8, // выводить по 8
        'meta_key' => 'date',
        'orderby' => 'meta_value_num date',
        'order' => 'ASC',
        'meta_type' => 'DATETIME',
        'meta_query' => array(
            array(
                'key' => 'date',
                'value' => date('Y-m-d'),
                'compare' => '>=',
                'type' => 'DATETIME'
            )
            ),
        );
    // запрос
    $query = new WP_Query( $args ); 
    ?>
    <?php if ( $query->have_posts() ) : ?>
      <!-- цикл -->
      <?php while ( $query->have_posts() ) : $query->the_post(); ?>
        <h1><?php the_title(); ?></h1>
      <?php endwhile; ?>
      <!-- конец цикла -->
      <?php wp_reset_postdata(); //очищаем результат запроса?>
    <?php else : ?>
      <p><?php esc_html_e( 'Ничего не найдено.' ); ?></p>
    <?php endif; ?>	

    Не работает.

    • Ответ изменён 10 месяцев, 4 недели назад пользователем devero8524.

    А мне необходимо просто отсортировать.

    Тогда meta_query не нужно.

    Попробуйте так

    $args = array(
        'cat' => array(106), // ID рубрики
        'posts_per_page' => 8, // выводить по 8
        'meta_key' => 'date',
        'meta_type' => 'DATETIME',
        'orderby' => 'meta_value_datetime',
        'order' => 'ASC',
    );
    

    остальной код как есть

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Тема «Сортировка записей по произвольному полю» закрыта для новых ответов.