PHP: группировка элементов по дням для отображения результатов - PullRequest
0 голосов
/ 19 февраля 2012

Извините, если это вопрос n00b, так как я скорее дизайнер UX, а не разработчик.Я разместил это на форумах WordPress, и меня направили сюда, вот так ...

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

Я бы хотел, чтобы запрос нашел все даты в meta_value,отобразите их как h3, затем создайте ul для постов, каждый из которых будет li.

Пользовательская мета-дата сохраняется в формате мм / дд / гг чч: мм.Я сделал это таким образом, так как есть связанное поле даты начала, которое мне было нужно в любом случае, и оно позволяет мне использовать порядок WordPress.Я просто форматирую вывод по своему желанию, когда это необходимо.

Кажется, я не могу обернуть голову вокруг 1) где поставить h3 и ul;и 2) группировка предметов по дате.Вот код, который у меня пока есть:

<ul>
<?php
global $post;
$all_args = array(
    'post_type' => 'agenda',
    'category' => the_title,
    'post_status' => 'publish',
    'meta_key' => 'cpt_agenda-event-date',
    'posts_per_page' => 5,
    'orderby' => 'meta_value',
    'order' => 'ASC'
);

$all_agenda_posts = get_posts( $all_args );                         
foreach( $all_agenda_posts as $post ) : setup_postdata($post);
$metas = get_post_meta( get_the_ID( ), 'cpt_agenda-event-date', false );

// If you want to show values
foreach ( $metas as $meta ) {
    $meta;
    $formatted = date("l, F j", strtotime($meta));
    echo '<h3>' . $formatted . '</h3>';
}
?>

    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>

У меня также есть изображения, размещенные в https://wordpress.stackexchange.com/questions/42846/group-posts-by-custom-meta-field-date, которые показывают текущий вывод и желаемый вывод.Пожалуйста, игнорируйте временные поля и стиль, так как CSS должен быть применен после правильной работы.

Спасибо за любую помощь!

ОБНОВЛЕНИЕ: Я получил это работает, и код ниже вВ случае, если это помогает кому-то еще.Мне нужно было использовать tax_query ...

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Использование tax_query мне помогло.Я просто скопировал / вставил код из рабочего примера, чтобы добавить несколько вещей.

<?php
global $post;

$term = get_term_by('name', $event_name, 'agenda_category');


$all_args = array(
    'post_type' => 'agenda',
    'post_status' => 'publish',
    'meta_key' => 'cpt_agenda-event-date',
    'posts_per_page' => -1,
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'tax_query' => array(
        array(
            'taxonomy' => 'agenda_category',
            'field' => 'id',
            'terms' => $term->term_id
        )
    )
);

$all_agenda_posts = new WP_Query($all_args);
$prev_start_date    =   "";

while ( $all_agenda_posts->have_posts() ) : $all_agenda_posts->the_post();
    $agenda_date = get_post_meta( get_the_ID( ), 'cpt_agenda-event-date', true);
    $agenda_end_time = get_post_meta( get_the_ID( ), 'cpt_agenda-end-time', true);

    if($prev_start_date!=date("l, F dS", strtotime($agenda_date))) {
        echo    "<h3>".date("l, F dS", strtotime($agenda_date))."</h3>";
        $prev_start_date    =   date("l, F dS", strtotime($agenda_date));   
    }
 ?>
<div class="schedule">
    <div class="stime"><?php echo date("h:i a", strtotime($agenda_date)); ?>
<?php if ($agenda_end_time){
    echo ' to ';
    echo date("h:i a", strtotime($agenda_end_time));
} else {
    echo '';
}
?>
    </div>
    <div class="stitle">
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </div>
</div>
<?php endwhile;

if ( $agenda_disclaimer ) { ?>
    <p class="change">~ <?php echo $agenda_disclaimer; ?> ~</p>
<?php }
wp_reset_postdata();
?>
0 голосов
/ 19 февраля 2012

Частью вашей проблемы может быть использование переменной $ post.Вы вызываете глобальную переменную $ post и затем используете то же имя переменной в своем foreach:

foreach( $all_agenda_posts as $post ) : setup_postdata($post);

Они конфликтуют, попробуйте изменить на

foreach( $all_agenda_posts as $aa_post ) : setup_postdata($aa_post);

Другая возможная проблема - этов вашем массиве arg.У вас есть:

'category' => the_title,

Я думаю, это должно быть

'category' => the_title(),

Наконец, get_the_ID () возвращает идентификатор текущей / глобальной записи $, которую вы перезаписали из-запервая ошибкаЕсли вы переименуете $ post в foreach в $ aa_post, замените

$metas = get_post_meta( get_the_ID( ), 'cpt_agenda-event-date', false );

на

$metas = get_post_meta( $aa_post->ID, 'cpt_agenda-event-date', false );

Это должно немного приблизить вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...