У меня есть серия сообщений с датами в настраиваемых полях, например:
02/12/1978
01/11/1987
Это настоящие строки, а не даты.
Затем я запускаю следующее, где я пытаюсь отсортировать по датам, а также прикрепляю идентификатор публикации каждой даты, чтобы они запускали упорядоченные сообщения:
$dateOrdered = [];
while ( $queryPosts->have_posts() ) : $queryPosts->the_post();
$id = $post->ID;
$date = usp_get_meta(false, 'usp-custom-80');
array_push($postOrdered, $id);
$dateOrdered[] = array("date"=>$date, "id"=>$id);
endwhile;
endif;
function custom_sort_dt($b, $a) {
return strtotime($a['date']) - strtotime($b['date']);
}
usort($dateOrdered, "custom_sort_dt");
$dateOrdered = implode(',', array_column($dateOrdered, 'id'));
Но это показывает даты, не заказанные.
custom_sort_dt($b, $a) должен быть custom_sort_dt($a, $b)Согласно это ваш формат даты не распознается strtotime
@IslamElshobokshy, это просто какая-то функция WordPress для обработки цикла
@IslamElshobokshy это действительно. Не обычный, но действительный. См. здесь
@FedericoklezCulloca, как я могу динамически преобразовать его во что-то узнаваемое?
Если первое число — это день, а второе — месяц, вы можете просто поменять местами . на /.
Динамически? Вы имеете в виду, что существует более одного формата?
@FedericoklezCulloca может предоставить пример кода на основе приведенного выше кода, пожалуйста?
@Андреас Андреас нет, я имею в виду преобразовать эти строки в даты, чтобы сделать их действительными и применить логику упорядочения
@rob.m str_replace('/', '.', $a['date']) должен помочь
попробовал это, но не заказал function custom_sort_dt($a, $b) { return str_replace('/', '.', $a['date']) - str_replace('/', '.', $a['date']); } @FedericoklezCulloca
ты сравниваешь $a сам с собой?
@FedericoklezCulloca LOL, подождите, я попробую еще раз, спасибо
@FedericoklezCulloca ничего, еще не заказано function custom_sort_dt($a, $b) { return str_replace('/', '.', $a['date']) - str_replace('/', '.', $b[ 'Дата']); }






предполагая, что у вас есть какой-то тип класса "Post", например
class Post {
public $date;
}
и вы сохраняете их в массиве с именем $posts, вы можете выполнить следующий код:
$dates = array_map(function($p) { return DateTime::createFromFormat('d/m/yy', $p->date)->getTimestamp(); }, $posts);
asort($dates);
и иметь отсортированный массив $dates. значения являются временными метками unix.
Редактировать:
даты указаны в формате дд-мм-гггг, поэтому нам нужно использовать «д-м-гг».
Нам также необходимо полностью квалифицировать DateTime, добавив перед ним \.
$postOrdered[] = [];
while ($queryPosts->have_posts()) {
$queryPosts->the_post();
$id = get_the_ID();
$postOrdered[$id] = \DateTime::createFromFormat('d-m-yy', usp_get_meta(false,'usp-custom-80'))->getTimestamp();
}
asort($postOrdered);
$ids = array_keys($postOrdered)
чтобы повторить содержимое сообщения, затем используйте
foreach($postOrdered as $id=>$date) {
echo get_post($id)->post_content . '<br />';
}
в цикле я устанавливаю $date, $date = usp_get_meta(false, 'usp-custom-80');. Думаю, мне нужно преобразовать это в формат даты оттуда. как?
@rob.m эта часть делает DateTime::createFromFormat('d/m/yy', $p->date)
@rob.m usp_get_meta возвращает дату? тогда вам нужно адаптировать код, как сказал @Andreas DateTime::createFromFormat('d/m/yy', usp_get_meta(false,'usp-custom-80')
@Isitar, что строки ломаются
хорошо, спасибо, теперь я считаю, что он преобразует его как дату, но не упорядочивает $id = $post->ID; $date = DateTime::createFromFormat('д/м/гг', usp_get_meta(false,'usp-custom-80')); array_push($postOrdered, $id); $dateOrdered[] = array("date"=>$date, "id"=>$id); конец; конец; function custom_sort_dt($a, $b) { return strtotime($a['date']) - strtotime($b['date']); } usort($dateOrdered, "custom_sort_dt"); $dateOrdered = implode(',', array_column($dateOrdered, 'id'));
Что это за синтаксис?