WP_Query последующая обработка результатов

177
08 сентября 2018, 20:40

На странице вывожу произвольные посты циклом WP_Query.
Необходимо получить все посты с определенными параметрами, а уже потом выполнить подсчет через $query->found_posts; Но тут особенность, надо посчитать:
сколько постов с 'comment_status' => 'open'
сколько с 'comment_status' => 'closed'.

А для вывода сами постов еще раз результат первого запроса отфильтровать и вывести только, например, с 'comment_status' => 'open'.

Это можно сделать в рамках одного цикла? Конечно, можно по простому наплодить циклов, но так себе решение.

<div class="cases_counts">
    <?php 
        $current_user = wp_get_current_user();
        $current_user_id = $current_user->ID;
        // Запрос к БД
        $args = array(
            'posts_per_page' => '-1',
            'post_type' => 'cases',
            'author' => $current_user_id,
        );
        $query = new WP_Query( $args );

    ?>

    <div class="cases_count">Открытые: <?php echo $query->found_posts; ?></div>
    <div class="cases_count">Закрытые: </div>
</div>
<div class="sidebar">
<!-- тут боковая панель -->
</div>
<div class="content">

    <div class="case_list">
        <?php if ( $query->have_posts() ) {
            while ( $query->have_posts() ) {
                $query->the_post();
                if ( 'open' == $post->comment_status ) { // если комментарии открыты
                echo $query->found_posts;
                    echo '<div class="case_item">
                                <a href="' . get_the_permalink() . '">
                                    <span class="case_item_title">' . get_the_title() . '</span>
                                    <span class="case_item_id">Идентификатор: ' . get_the_ID() . '</span>
                                </a>
                            </div>';
                }
            }
        } else {
            $item = '<div class="nocases">Обращений нет.</div>';
        } ?>
    </div>
</div>
<?php wp_reset_postdata(); ?>
Answer 1

Используйте rewind_posts(). Постройте первый цикл как обычно, потом rewind и снова цикл. Всё будет в памяти, никаких лишних обращений к базе.

Выглядеть код должен примерно так:

<div class="cases_counts">
    <?php
    global $post;
    $current_user    = wp_get_current_user();
    $current_user_id = $current_user->ID;
    // Запрос к БД
    $args = array(
        'posts_per_page' => '-1',
        'post_type'      => 'cases',
        'author'         => $current_user_id,
    );
    $query = new WP_Query( $args );
    $open   = 0;
    $closed = 0;
    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            $check = ( 'open' === $post->comment_status );
            if ( $check ) {
                $open ++;
            } else {
                $closed ++;
            }
        }
    }
    rewind_posts();
    ?>
    <div class="cases_count">Открытые: <?php echo $open; ?></div>
    <div class="cases_count">Закрытые: <?php echo $closed; ?></div>
</div>
<div class="sidebar">
    <!-- тут боковая панель -->
</div>
<div class="content">
    <div class="case_list">
        <?php
        if ( $query->have_posts() ) {
            while ( $query->have_posts() ) {
                $query->the_post();
                if ( 'open' === $post->comment_status ) { // если комментарии открыты
                    echo '<div class="case_item">
                                <a href="' . get_the_permalink() . '">
                                    <span class="case_item_title">' . get_the_title() . '</span>
                                    <span class="case_item_id">Идентификатор: ' . get_the_ID() . '</span>
                                </a>
                            </div>';
                }
            }
        } else {
            $item = '<div class="nocases">Обращений нет.</div>';
        }
        ?>
    </div>
</div>
<?php
wp_reset_postdata();
READ ALSO
спарсить рейтинг wta (php)

спарсить рейтинг wta (php)

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

209
Преобразовать br в p

Преобразовать br в p

Как с помощи php переносимую строку преобразовать в параграф

167
WP_Query в аргументах мета поле с массивом

WP_Query в аргументах мета поле с массивом

Речь о произвольном типе постовЕсть переменная, содержащая некое число, например

237