У меня есть настраиваемое поле для сообщений с именем «сортировать по дате». Я хочу иметь возможность сортировать свою настраиваемую сетку по дате создания сообщения, если только это пользовательское поле «сортировка по дате» не имеет значения... другими словами, если пользовательское поле имеет значение, я хочу, чтобы WordPress взял эту дату и использовал ее. для целей сортировки.
Прямо сейчас у меня есть переменные, определенные как
$fields['customDate'] = get_field('updated_date', $post->ID);
if (!empty($fields['customDate'])) {
$fields['orderDate'] = $fields['customDate'];
} else {
$fields['orderDate'] = get_the_date('Ymd', $post);
}
Для отображения дат на странице это отлично работает <?php echo date('F j, Y', strtotime($fields['orderDate']));?>
Для моего запроса у меня есть
$posts = get_posts(array(
'post_type' => 'post',
'numberposts' => $numberposts,
'tax_query' => $taxQueries,
'post__not_in' => $exclusions,
'orderby' => array(
'orderDate' => 'DESC'
)
));
Однако я понимаю, что отсутствие значений в моем пользовательском поле для всех других сообщений в базе данных не сработает.
Есть ли способ сортировки путем объединения двух полей (дата создания и настраиваемое поле), чтобы, если настраиваемое поле имеет значение, использовать его для сортировки, если не использовать дату создания публикации?
Заранее спасибо!
Вам нужно будет захватить сообщения, затем отсортировать их самостоятельно, а затем передать это запросу через параметр post__in.
Определите функцию сортировки
function my_sort($a,$b){
$t1 = strtotime($a['date']);
$t2 = strtotime($b['date']);
return $t1 - $t2;
}
Получить все идентификаторы сообщений
$post_ids = get_posts(array(
'fields' => 'ids',
'post_type' => 'post',
'numberposts' => $numberposts,
'tax_query' => $taxQueries,
'post__not_in' => $exclusions,
));
Установите массив для последующего использования
$get_posts = $post_ids = array();
Прокрутите идентификаторы и проверьте, установлено ли мета-значение и сохранено ли оно в новом массиве.
foreach($post_ids as $id){
$updated_date = get_field('updated_date', $id);
$date = $updated_date ? $updated_date : get_the_date('Ymd', $id);
$get_posts[] = array('id' => $id, 'date' => $date );
}
Сортировка нового массива записей
usort($get_posts, 'my_sort');
Перебрать отсортированный массив и получить идентификаторы
foreach($get_posts as $p ){
$post_ids[] = $p['id'];
}
И, наконец, получить сообщения из отсортированного массива, упорядоченного нашей сортировкой
$posts = get_post(array(
'posts_per_page' => -1,
'post_type' => 'post',
'post__in' => $post_ids,
'order' => 'DESC',
'orderby'=> 'post__in',
));
Я ответил на ваш вопрос. В целом гораздо лучше сохранять даты в формате mysql и преобразовывать их при отображении. может лучше сортировать и т. д.