Сортировать WP_Query по ACF Datepicker

У меня есть страница «Предстоящие события» и страница «Прошедшие события». Каждое событие имеет настраиваемое поле с именем «event_date».

Я хочу создать цикл, который отображает все события больше, чем сегодня. Я просмотрел эти статьи, но не смог заставить его работать:
http://support.advancedcustomfields.com/forums/topic/how-do-i-filter-and-sort-event-posts-with-start-and-end-date/

https://wordpress.org/support/topic/plugin-advanced-custom-fields-sorting-by-date-picker

WordPress расширенные настраиваемые поля упорядочить сообщения по дате выбора

Из того, что я собрал в трех ссылках выше, я бы поместил это в мой файл functions.php:

    // CREATE UNIX TIME STAMP FROM DATE PICKER
function custom_unixtimesamp ( $post_id ) {
if ( get_post_type( $post_id ) == 'event_type' ) {
$event_date = get_post_meta($post_id, 'event_date', true);

if($event_date) {
$dateparts = explode('/', $event_date);
$newdate1 = strtotime(date('d.m.Y H:i:s', strtotime($dateparts[1].'/'.$dateparts[0].'/'.$dateparts[2])));
update_post_meta($post_id, 'unixstartdate', $newdate1  );
}
}
}
add_action( 'save_post', 'custom_unixtimesamp', 100, 2);

Затем я хотел бы добавить что-то вроде этого в мой шаблон страницы:

<?php
$today = time();
$args = array(
'post_type' => 'event_type',
'posts_per_page' => 5,
'meta_query' => array(
array(
'key' => 'unixstartdate',
'compare' => '>=',
'value' => $today,
)
),
'meta_key' => 'event_date',
'orderby' => 'meta_value',
'order' => 'ASC',
);

$query = new WP_Query( $args );
$event_type = $query->posts;
?>

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

Прямо сейчас это не дает никаких результатов. Мой пост-тип называется «event_type», а ключ — «event_date».

Есть мысли о том, где я иду не так?

2

Решение

Я нашел решение здесь благодаря svsdnb.

https://wordpress.org/support/topic/query-date-array-to-display-future-events-only

Вместо того, чтобы преобразовывать метку времени в functions.php, есть способ сделать это специально с ACF, где вы используете

current_time('Ymd')

вместо

 $today = date ('Ymd')

Вот что я закончил (и, похоже, работает, и включает события, которые происходят сегодня):

<?php
$today = current_time('Ymd');
$args = array(
'post_type' => 'event_type',
'post_status' => 'publish',
'posts_per_page' => '0',
'meta_query' => array(
array(
'key' => 'event_date',
'compare' => '>=', // Upcoming Events - Greater than or equal to today
'value' => $today,
)
),
'meta_key' => 'event_date',
'orderby' => 'meta_value',
'order' => 'ASC',
);

$query = new WP_Query( $args );
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
?>
4

Другие решения

Похоже, у вас есть несколько проблем с вашим кодом. Ваш анализ даты также кажется неправильным, хотя трудно сказать без дополнительной информации. С помощью strtotime в обеих функциях, чтобы установить unixstarttime и ваш код запроса был бы хорош. Ваш код использует time() который будет включать в себя секунды и пропустить события на «сегодня». У вас нет часового пояса, поэтому все будет рассматриваться как время по Гринвичу, и это хорошо, если вы помните это.

Ничего страшного, но вы указываете два параметра для вашего обратного вызова в add_action но функция принимает только один аргумент.

Следующая проблема заключается в have_posts() цикл — вам нужно указать пользовательский запрос $query зацикливаться на этом.

<?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>

Я также реализовал это немного по-другому, используя updated_{type}_meta действие, чтобы активировать только соответствующий мета-ключ, а затем проверить тип записи. Он должен запускаться только при обновлении мета-значения, а не при каждом сохранении сообщения. Я также рекомендовал бы сортировку по unixstarttime мета-значение, поскольку оно является числовым.

functions.php

// create/update unixstartdate based on event_type.event_date update
add_action( 'updated_post_meta', 'my_updated_post_meta', 20, 4 );
function my_updated_post_meta( $meta_id, $object_id, $meta_key, $_meta_value ){
if ( $meta_key == 'event_date' && 'event_type' == get_post_type( $object_id ) ){
$unixstartdate = strtotime( $_meta_value );
update_post_meta( $object_id, 'unixstartdate', $unixstartdate );
}
}

страница шаблона

$args = array(
'post_type' => 'event_type',
'posts_per_page' => 5,
'meta_query' => array(
array(
'key' => 'unixstartdate',
'compare' => '>=',
'value' => strtotime('m/d/Y', time()),
)
),
'meta_key' => 'unixstartdate',
'orderby' => 'meta_value',
'order' => 'ASC',
);

$query = new WP_Query( $args );
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
the_title(); // whatever you want to use from $post
endwhile; endif;
2

<div class="row">

<?php
$today = current_time('Ymd');
$args = array(
'post_type' => 'your-custom-post-type',
'post_status' => 'publish',
'posts_per_page' => '-1',
'meta_query' => array(
array(
'key' => 'event_date',//your date picker field name
'compare' => '>=', // Upcoming Events - Greater than or equal to today
'value' => $today,
)
),
'meta_key' => 'event_date',
'orderby' => 'meta_value',
'order' => 'Desc',
);

$query = new WP_Query( $args );
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
?>
<?php  $dateformatstring = "F d, Y";

$unixtimestamp = strtotime(get_field('event_date')); ?>

<div class="post">

<a href="<?php the_permalink; ?>"><?php the_title(); ?></a>
<?php echo date_i18n($dateformatstring, $unixtimestamp); ?>

</div>

<?php
endwhile;
endif;
wp_reset_query();  // Restore global post data stomped by the_post().
?>

</div>
-1
По вопросам рекламы [email protected]