Как упорядочить страницы и категории по ID или имени в одном запросе?

Вопрос или проблема

Я хотел бы запросить большинство своих страниц и категорий на главной странице. Пока что мне удается получить страницы и категории (посты), но я не могу отсортировать список так, как хочу. Я хочу получить пользовательский порядок, например, страница, посты из категории, другая страница и посты из другой категории.

Я использую следующее:

        <?php
        $args = array( 
            'cat' => $current,
            'post_type' => array( 
                'page', 'post'),
            'orderby' => 'ID' && array(2,4,1),
        );
        query_posts( $args );
        while ( have_posts()) : the_post(); ?>
            <?php // Включить шаблон содержимого страницы.
            if ( is_page() ):
                get_template_part( 'content', 'page' );
            else:
                get_template_part( 'content', 'post' );
            endif;
            ?>
        <?php endwhile;
         ?>

Кстати, я использую twentyfourteen и не хочу создавать множество запросов для этой задачи, если это не создаст нагрузки на веб-сервер. Я хочу сохранить память насколько это возможно.

Прежде всего, никогда не используйте query_posts, никогда. Это очень важно. Его абсолютно не следует использовать, и его нужно удалить в будущих версиях WordPress. В общем, с точки зрения производительности, я бы сказал, что это даже хуже, чем пользовательский запрос. Вам действительно нужно использовать WP_Query для выполнения этой задачи.

Примечание: Эта функция не предназначена для использования плагинами или темами. Как объяснено позже, есть лучшие, более производительные варианты для изменения основного запроса. query_posts() – это чрезмерно простой и проблематичный способ изменить основной запрос страницы, заменив его новой инстанцией запроса. Это неэффективно (перезапускает SQL-запросы) и полностью потерпит неудачу в некоторых обстоятельствах (особенно часто при работе с пагинацией постов).

К сожалению, вы не можете сделать это в одном запросе, так как не можете сортировать внутри цикла, и нет родной функции orderby в WordPress для достижения этого. Кстати, ваше использование orderby некорректно. Ознакомьтесь с параметрами orderby в WP_Query.

Вам нужно будет выполнить как минимум два, возможно, даже больше пользовательских запросов, чтобы достичь желаемого. Как только у вас будут запросы, их необходимо объединить, и именно здесь начинаются ваши настоящие проблемы.

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

Я не думаю, что это действительно вопрос, на который здесь можно ответить, поскольку это потребует много кода и т. д. Мне не нравится отвечать на вопрос в таком стиле, но было бы лучше нанять профессионала, чтобы помочь вам с этим. Также вам нужно будет провести собственное исследование и протестировать некоторый код, чтобы выяснить, что работает, а что — нет.

Спасибо за предыдущий ответ. Возможно, произошла недоразумение. Я не думал, что ваш комментарий был грубым, @Pieter Goosen, и мой не имел намерения тоже. В любом случае. Мне удалось придумать следующие запросы. Я делаю запросы категорий внутри страниц. Не знаю, действительно ли это правильный способ, но он работает для меня. Мне все еще нужно будет больше углубиться, чтобы очистить код и посмотреть, есть ли какие-либо негативные последствия. Но на данный момент я получаю именно то, что мне нужно, и с дополнительными правками я смогу стилизовать свои страницы и категории так, как мне нужно.

                <?php
    $pages = get_pages(array (
        'post_type' => 'page',
        'sort_column' => 'menu_order',
        ));
    foreach ($pages as $page) {
        $apage = $page->post_name; ?>
                <?php if ( $apage =='about') { ?>
                <article id="<?php echo $page->post_name; ?>">
                    <header class="entry-header">
                        <?php if (  (function_exists('has_post_thumbnail')) && (has_post_thumbnail())  ) { the_post_thumbnail(); } ?>
                        <h2 class="entry-title"><?php echo $page->post_title; ?></h2>
                    </header>
                    <div class="entry-summary"><?php echo apply_filters('the_content', $page->post_content); ?></div>
                </article>

 <!-- ## Теперь сохраняем запрос страниц, чтобы ввести категории ## -->

                <?php
                // получить все категории из базы данных
                $cats = get_categories(); 

                // пройтись по категориям
                foreach ($cats as $cat) {
                    // установить ID категории
                    $cat_id= $cat->term_id;
                    // создать заголовок для категории
                    /* if ( in_category('reviews') ) : */
                    echo '<header class="entry-header">'.$cat->name.'</header>';
                    // создать пользовательский запрос WordPress
                    $args = array('cat=$cat_id&posts_per_page=5');
                    $the_query = new WP_Query( $args );
                    // начать цикл WordPress!
                    if ($the_query->have_posts()) : 
                        while ($the_query->have_posts()) : 
                            $the_query->the_post();
                            // создаем нашу ссылку, когда пост настроен ?>
                <?php if ( (in_category('reviews')) /*& ( category_slug == 'reviews' )*/ ) : ?> 
                <article id="cat-reviews">
                    <header class="entry-header">
                        <?php if (  (function_exists('has_post_thumbnail')) && (has_post_thumbnail())  ) { the_post_thumbnail(); } ?>
                        <h2 class="entry-title"><?php the_title(); ?></h2>
                    </header>
                    <div class="entry-summary"><?php the_excerpt(); ?></div>
                    </article><!-- #cat-reviews -->

                    <!-- ## Больше категорий по мере необходимости ## -->

                    <?php endif; ?>
                <?php
                        endwhile;
                    endif; // завершен цикл категорий.
                    /* endif; // завершена конкретная категория */
                } // завершен оператор foreach

                /* 
                 * возвращаемся к нашему запросу страниц 
                 */

            } elseif ( $apage =='contact') { ?>
                <article id="<?php echo $page->post_name; ?>">
                    <header class="entry-header">
                        <h2 class="entry-title"><?php echo $page->post_title; ?></h2>
                    </header>
                    <div class="entry-summary"><?php echo apply_filters('the_content', $page->post_content); ?></div>
                </article>

            <!-- ## Больше страниц по мере необходимости ## -->

                <?php } // конец if
            } // конец foreach ?>

Да, мне нужно будет сбросить запрос!

Ответ или решение

Чтобы упорядочить страницы и категории по ID или имени в одном запросе в WordPress, вы действительно столкнулись с определенными ограничениями. В WordPress нет встроенной функции для сортировки результатов в одном запросе так, как вы этого хотите. Однако, я дам вам подход, который поможет достичь вашего результата, используя несколько запросов и мержируя их вместе. Вам стоит использовать WP_Query вместо query_posts, так как он более эффективен и гибок.

Вот пример подхода, который вы можете применить:

<?php
// Получаем страницы
$pages = get_pages(array(
    'post_type' => 'page',
    'sort_column' => 'menu_order',
));

// Создаем массив для хранения итогового результата
$combined_results = [];

// Заполняем массив страниц
foreach ($pages as $page) {
    $combined_results[] = (object) array(
        'post_type' => 'page',
        'post' => $page,
    );

    // Получаем посты для определенной категории
    // Предположим, у вас есть массив категорий, из которых вы хотите вытянуть посты
    $categories = ['category-slug-1', 'category-slug-2']; // замените на свои слаг-категории

    foreach ($categories as $category_slug) {
        $cat_id = get_cat_ID($category_slug);
        $args = array(
            'cat' => $cat_id,
            'posts_per_page' => 5,
        );

        // Новый WP_Query для категории
        $category_query = new WP_Query($args);

        // Добавляем посты к общему результату
        while ($category_query->have_posts()) {
            $category_query->the_post();
            $combined_results[] = (object) array(
                'post_type' => 'post',
                'post' => get_post(),
            );
        }
        // Сбрасываем посты
        wp_reset_postdata();
    }
}

// Теперь мы можем упорядочить $combined_results по желаемому критерию
usort($combined_results, function($a, $b) {
    // Можно изменить условия сортировки по вашему усмотрению
    return $a->post->ID - $b->post->ID; // сортировка по ID
});

// Вывод результатов
foreach ($combined_results as $result) {
    if ($result->post_type === 'page') {
        // Включаем шаблон для страницы
        setup_postdata($result->post);
        get_template_part('content', 'page');
    } elseif ($result->post_type === 'post') {
        // Включаем шаблон для поста
        setup_postdata($result->post);
        get_template_part('content', 'post');
    }
}

// Восстанавливаем оригинальные данные поста
wp_reset_postdata();
?>

Объяснение кода

  1. Получение страниц: Мы сначала извлекаем все страницы, используя get_pages.

  2. Массив результатов: Создаем массив $combined_results, куда будем помещать результаты всех запросов.

  3. Получение постов из категорий: Внутри цикла для страниц мы запускаем запрос на извлечение постов из каждой категории, используя WP_Query.

  4. Сортировка: После получения всех постов и страниц мы сортируем их в итоговом массиве с помощью функции usort, влияя на порядок отображения.

  5. Вывод: В конце проходимся по массиву и выводим соответствующие шаблоны для страниц и постов.

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

Оцените материал
Добавить комментарий

Капча загружается...