Я создаю сайт для театральной компании, и я создаю индекс всех прошлых, текущих и будущих постановок. Я хотел бы, чтобы индекс «заказывал» конечную дату каждого выпуска (тип поля «дата» ACF; «end_date»).
Вот пример моего запроса:
<?php $futureProd = array( 'post_type' => 'productions', 'posts_per_page' => -1, 'meta_key' => 'ending_date', 'orderby' => 'meta_value', 'order' => 'ASC', ); $slider_posts = new WP_Query($futureProd); $array_rev = array_reverse($slider_posts->posts); $slider_posts->posts = $array_rev; ?>
Также попробовали следующее, добавив альтернативы «meta_value_date», а также «meta_value_num»:
<?php // query posts $futureProd = array( 'post_type' => 'productions', 'posts_per_page' => -1, 'meta_key' => 'ending_date', 'orderby' => 'meta_value_date', 'order' => 'ASC', ); ?>
А ТАКЖЕ
<?php // query posts $futureProd = array( 'post_type' => 'productions', 'posts_per_page' => -1, 'meta_key' => 'ending_date', 'orderby' => 'meta_value_num', 'order' => 'ASC', ); ?>
Независимо от того, что я пытаюсь, сообщения отказываются заказать themselevs по meta_value, а вместо этого предпочитают заказывать себя по дате публикации по умолчанию.
Я уверен, что я пропустил что-то простое.
У кого-нибудь есть идеи?
Вы можете указывать тип данных в порядке, например,
meta_value_*
Возможные значения: «NUMERIC», «BINARY», «CHAR», «DATE», «DATETIME», «DECIMAL», «SIGNED», «TIME», «UNSIGNED».
Попробуй это,
$futureProd = array( 'post_type' => 'productions', 'posts_per_page' => -1, 'meta_key' => 'ending_date', 'orderby' => 'meta_value_date', 'order' => 'ASC', ); $slider_posts = new WP_Query($futureProd);
Обратите внимание: для выполнения вышеуказанного кода вам нужно иметь дату в YYYY-MM-DD
, если у вас есть дата в другом формате, тогда вам нужно создать свой пользовательский фильтр, чтобы posts_orderby
фильтр STR_TO_DATE
с STR_TO_DATE
функции STR_TO_DATE
MySQL.
Добавьте это в свою активную тему. Файл function.php
вашей активной дочерней темы (или темы). Или также в любых плагинах php-файлов.
function text_domain_posts_orderby($orderby, $query) { //Only for custom orderby key if ($query->get('orderby') != 'yyyymmdd_date_format') return $orderby; if (!( $order = $query->get('order') )) $order = 'ASC'; global $wpdb; $fieldName = $wpdb->postmeta . '.meta_value'; return "STR_TO_DATE(" . $fieldName . ", '%Y%m%d') " . $order; } add_filter('posts_orderby', 'text_domain_posts_orderby', 10, 2);
Итак, теперь ваш аргумент WP_Query должен выглядеть так:
$futureProd = array( 'post_type' => 'productions', 'posts_per_page' => -1, 'meta_key' => 'ending_date', 'orderby' => 'yyyymmdd_date_format', //added custom orderby key 'order' => 'ASC', );
Код протестирован и полностью работоспособен.
Справка:
Надеюсь это поможет.