Получите все категории и сообщения в тех категориях

Я ищу решение, которое позволяет мне печатать следующее:

Cat 1        Cat 2        Cat 3
 Post 1       Post 1       Post 1
 Post 2       Post 2       Post 2
 Post 3                    Post 3
                           Post 4

Править

Я ищу что-то, что только потребует одного запроса базы данных! Таким образом, если у Вас есть a foreach в Вашем коде, сопровождаемом a new WP_Query затем это не то, что я ищу (я планирую поместить это на домашнюю страницу своего веб-сайта).

7
28.08.2014, 20:59
5 ответов

Я имею, создают что-то для меня, что я использую довольно много, вот код, можно использовать краткие заголовки, идентификаторы или термин объект в $categories массив, если Вы хотите получить все категории, можно использовать get_terms(), и канал с набором объектов термина, но быть осторожным, нет никакой обработки для иерархии на этом коде.

$categories = array( 1, 'slug', 3 );
echo '<ul>';
foreach($categories as $category) {
    $term = ( is_numeric($category) || is_object($category) ? get_term( $category, 'category' ) : get_term_by( 'slug', $category, 'category' ) );
    $args = array(
        'cat' => $term->term_id
        // Add any other arguments to fit your needs
    );
    $q = new WP_Query( $args );
    if( $q->have_posts() ) {
        echo '<li><a href="' . get_term_link( $term->term_id, 'category' ) . '">' . $term->name . '</a><ul>';
        while( $q->have_posts() ) {
            $q->the_post();
            echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        echo '</ul></li>';
    } else {

    }
}
echo '</ul>';
-1
19.02.2020, 22:03

Непротестированный, все же один из самых простых подходов, которые я попробовал бы, следующий:

<?php
    $category_ids = get_all_category_ids();
    foreach ($category_ids as $values) {
        $args = array('category' => $value);
        $posts_array = get_posts( $args );
        foreach ($posts_array as $post) : setup_postdata($post);
?> 
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
        endforeach;
        wp_reset_query();
    }
?>
-1
19.02.2020, 22:03
  • 1
    Та же проблема как –  Ben 25.02.2012, 01:13
  • 2
    хорошо. Нет никакого способа сделать единый запрос. Загрузка любой страницы для Wordpress имеет несколько запросов, как это перед добавляющим пользовательским кодом. Все встроенные запросы используют класс WPDB. Единственный способ сделать это в едином запросе с Вашим собственным, проводят sql или путем создания WPDB родительским классом к другому классу с этой целью и называния этого тем путем. –  Neil Davidson 04.03.2012, 02:14
  • 3
    Nota это get_all_category_ids(); теперь обесценивается –  Pieter Goosen 06.01.2015, 10:16
  • 4
    O (n) неэффективный –  S.. 29.04.2018, 20:47

Можно использовать это... Установите сумму сообщений, в которых Вы нуждаетесь...

Также я поместил все это в отделении, таким образом, можно сделать структуру и разработать поиск.

<?php  
    $allcats = get_categories('child_of=0'); 

    foreach ($allcats as $cat) :
        $args = array(
            'posts_per_page' => 3, // set number of post per category here
            'category__in' => array($cat->term_id)
        );

        $customInCatQuery = new WP_Query($args);

        if ($customInCatQuery->have_posts()) :
            echo '<div>';
            echo '<h3>'.$cat->name.'</h3>';
            echo '<ul>';
            while ($customInCatQuery->have_posts()) : $customInCatQuery->the_post(); ?>

            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php
            endwhile; 
            echo '</ul></div>'; 
        ?>

<?php
        else :
            echo 'No post published in:'.$cat->name;                
        endif; 
        wp_reset_query();
    endforeach; 
?>

Надеюсь, это поможет.

-1
19.02.2020, 22:03
  • 1
    Спасибо, но берут пример, говорят 10 категорий. В этом случае Ваш код вызывает 11 SQL-запросов. Я ищу 1 SQL-запрос. Лучшая вещь состояла бы в том, чтобы, вероятно, получить все сообщения, заказанные по категориям, но я не знаю, как сделать это (я не нашел order_by = cat в кодексе)!? –  Ben 25.02.2012, 01:12
  • 2
    кода Sagive, я не думаю, что один бит имеет значение, если его 10 категорий или 20... (попробовал его 20), если Вы не пытаетесь загрузить огромное количество сообщения, которые в любом случае могли бы замедлить загрузку страницы.. попробуйте его - Вы найдете, что это реальный свежий - пытающийся перестроить, после того, как загружено через категории означало бы создавать огромный и главным образом бесполезный код (к моему скромному мнению :)) –  Sagive SEO 25.02.2012, 01:33
  • 3
    Нет это не делает, просто необходимо изменить вывод немного (т.е. список конца для кошки n и запустить список для кошки n+1), каждый раз, сообщение имеет категорию, которая отличается от категории предыдущего сообщения... Намного более простой, чем бомбардировка Вашей плохой базы данных с 20 + запрашивает на pageload... (к моему скромному мнению :) –  Ben 25.02.2012, 02:04
  • 4
    я думаю, что он был бы мы спрашивающий базу данных тот же вопрос, но просто заказывающий материал по-другому на выходном конце.. я не вижу различия..., кроме того - это - логический запрос.. "дайте мне, первые * от этой категории"... дают мне, первые * от той категории" вместо дают мне что сообщение, снова, снова, снова.. это - тот же путь, но я хныкаю данные в способе, которым мне нужен он..., если я не ошибаюсь.. –  Sagive SEO 25.02.2012, 02:37
  • 5
    Различием является количество запросов дб. Одно большое по сравнению со многими маленькими... ;) –  Ben 25.02.2012, 03:11

при поиске плагина Сообщения Категории Списка могли бы работать на Вас.

Нос запрос, смотрите на get_posts

-2
19.02.2020, 22:03

РЕДАКТИРОВАНИЕ ПЕРЕСМАТРИВАЕТ № 2

Я никогда не касался Переходного процесса API, до сих пор когда я видел ответ @MikeSchinkel в этом сообщении. Это вдохновило меня пересматривать это сообщение еще раз. После некоторого тестирования я придумал следующее:

  • Время для выполнения перешло по сравнению с ~0.07 секундами к ~0.002seconds

  • Время запроса базы данных понизилось, приблизительно сокращаются наполовину

  • С переходным процессом выполняются запросы только на 2 дб

Как код работает (Просто собирающийся обсуждать изменения из исходного кода от, ПЕРЕСМАТРИВАЮТ):

ШАГ 1

Мы должны сохранить значение $q переходному процессу это - значение, которое содержит список категории с заголовками сообщения.

ШАГ 2

Мы сначала должны проверить, существует ли переходный процесс, и если ни один не существует, создайте переходный процесс. Если переходный процесс существует, получите его информацию

ШАГ 3

Эта информация теперь пройтись a foreach цикл для печати списка с названиями категории и заголовков сообщения.

ШАГ 4

В настоящий момент переходный процесс будет обновляться каждые двенадцать часов. Это может быть установлено на комплект Ваши потребности. Однако переходный процесс должен будет быть удален и воссоздал каждый раз изменения состояния сообщения. Это могло бы быть из проекта для публикации, новое опубликованное сообщение или сообщение, это повреждается. Чтобы сделать это, необходимо использовать delete_transient который будет сцеплен с transition_post_status который будет инициирован каждый раз изменения состояния сообщения

Вот полный код:

В Вашем functions.php

add_action( 'transition_post_status', 'publish_new_post', 10, 3 );

function publish_new_post() {
   delete_transient( 'category_list' );
}

В Вашем шаблоне, где необходимо отобразить список

<?php
if ( false === ( $q = get_transient( 'category_list' ) ) ) {

    $args = array( 
        'posts_per_page' => -1
    );

    $query = new WP_Query($args); 

    $q = array();

    while ( $query->have_posts() ) { 

        $query->the_post(); 

        $a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';

        $categories = get_the_category();

        foreach ( $categories as $key=>$category ) {

            $b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';    

        }

        $q[$b][] = $a; // Create an array with the category names and post titles
    }


    /* Restore original Post Data */
    wp_reset_postdata();

set_transient( 'category_list', $q, 12 * HOUR_IN_SECONDS );
}

foreach ($q as $key=>$values) {
        echo $key;

        echo '<ul>';
            foreach ($values as $value){
                echo '<li>' . $value . '</li>';
            }
        echo '</ul>';
    }


?>

ПЕРЕСМОТРЕТЬ

Я недавно предложил очень легкое решение, которое является путем намного быстрее, чем другие данные возможные решения. На моей испытательной площадке я получаю общее время поколения только ~0.07 секунд и запросов только на 6 дб согласно Монитору Запроса, в то время как другие методы дают мне время поколения ~0.35 секунд и 50 дополнительных запросов дб.

Вот разбивка моего метода

ШАГ 1

Сначала необходимо создать пользовательский запрос с WP_Query получать все опубликованные сообщения

$args = array( 
        'posts_per_page' => -1
    );

    $query = new WP_Query($args);   
    $q = array();

    while ( $query->have_posts() ) { 

    }

    /* Restore original Post Data */
    wp_reset_postdata();

Шаг 2

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

$categories = get_the_category();

        foreach ( $categories as $key=>$category ) {

            $b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';    

        }

ШАГ 3

Присвойте переменные заголовку сообщения и категориям сообщения

$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';

и

$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';    

ШАГ 4

Объедините эти две переменные для формирования многомерного массива

$q[$b][] = $a;

Для наблюдения, что происходит в массиве, просто сделайте a var_dump

?><pre><?php var_dump($q); ?></pre><?php

ШАГ 5

Используя foreach циклы, создайте свой список сообщения, отсортированный по категориям

foreach ($q as $key=>$values) {
    echo $key;

    echo '<ul>';
        foreach ($values as $value){
            echo '<li>' . $value . '</li>';
        }
    echo '</ul>';
}

ВСЕ ВМЕСТЕ ТЕПЕРЬ!

Вот полный код

<?php

    $args = array( 
        'posts_per_page' => -1
    );

    $query = new WP_Query($args);   
    $q = array();

    while ( $query->have_posts() ) { 

        $query->the_post(); 

        $a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';

        $categories = get_the_category();

        foreach ( $categories as $key=>$category ) {

            $b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';    

        }

        $q[$b][] = $a; // Create an array with the category names and post titles
    }

    /* Restore original Post Data */
    wp_reset_postdata();

    foreach ($q as $key=>$values) {
        echo $key;

        echo '<ul>';
            foreach ($values as $value){
                echo '<li>' . $value . '</li>';
            }
        echo '</ul>';
    }

?>
14
19.02.2020, 22:03

Теги

Похожие вопросы