Получение записей из дочерних категорий по ID родительской категории

25 нояб. 2014 г., 14:26:07
Просмотры: 20.9K
Голосов: 3

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

Надеюсь, это тот фрагмент кода, который нужно изменить, но я не уверен.

Буду благодарен, если кто-то сможет помочь.

<ul>

<?php 
   query_posts(array(
      'post_type' => 'post', // тип записи
      'category__in' => $text, // ID категории 
      'orderby' => 'meta_value_num', // сортировка по числовому значению мета-поля
      'meta_key' => 'rankk', // ключ мета-поля для сортировки
      'order' => 'DESC', // порядок сортировки по убыванию
      'posts_per_page' => 100 // количество записей на странице
   )); 
?>
5
Комментарии

Плохо написанные плагины всегда рано или поздно приводят к катастрофе. На мой взгляд, лучше удалить этот плагин и написать собственный код или найти правильно написанный плагин. Нет смысла менять повреждённую шину, когда вся машина — полная развалина :-)

Pieter Goosen Pieter Goosen
25 нояб. 2014 г. 14:30:26

Хотел бы я уметь это делать ;-)

nanonano nanonano
25 нояб. 2014 г. 14:35:30

Честно говоря, изменять код в плагине — плохая практика. Когда ты говоришь о выборе родительской категории, тебе нужны записи из родительской категории и записи из её дочерних категорий?

Pieter Goosen Pieter Goosen
25 нояб. 2014 г. 14:45:13

точно! Их родители все равно пустые.´

nanonano nanonano
25 нояб. 2014 г. 15:00:45

Насколько я знаю, 'category__in' не показывает дочерние элементы из родительских категорий. Но я также не знаю, что еще использовать.

nanonano nanonano
25 нояб. 2014 г. 16:15:33
Все ответы на вопрос 2
6
11

Как я уже писал в комментариях к вашему вопросу

Плохо написанные плагины всегда приводят к катастрофе рано или поздно. На мой взгляд, удалите этот плагин и напишите свой код или найдите правильно написанный плагин. Нет смысла менять повреждённую шину, когда вся машина — полная потеря :-)

Для начала, никогда не используйте query_posts

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

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

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

То, что вы хотите сделать, невозможно с текущими параметрами категорий. Лучшим решением здесь будет использование tax_query с WP_Query. В tax_query по умолчанию включаются дочерние термины для указанного термина, и это именно то, что вам нужно.

Вы можете попробовать следующий код (ВАЖНО: требует PHP 5.4+)

$args = [
      'post_type' => 'post', 
      'orderby' => 'meta_value_num', 
      'meta_key' => 'rankk', 
      'order' => 'DESC', 
      'posts_per_page' => 100,
      'tax_query' => [
            [
                'taxonomy' => 'category',
                'field'    => 'term_id',
                'terms'    => 'ID РОДИТЕЛЬСКОЙ КАТЕГОРИИ',
            ],
        ],
];

$q = new WP_Query( $args );

if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        the_title();
    }
    wp_reset_postdata();
} 

Для версий PHP ниже 5.4 попробуйте этот вариант

$args = array(
      'post_type' => 'post', 
      'orderby' => 'meta_value_num', 
      'meta_key' => 'rankk', 
      'order' => 'DESC', 
      'posts_per_page' => 100,
      'tax_query' => array(
            array(
                'taxonomy' => 'category',
                'field'    => 'term_id',
                'terms'    => 'ID РОДИТЕЛЬСКОЙ КАТЕГОРИИ',
            ),
        ),
);

$q = new WP_Query( $args );

if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
        $q->the_post();
        the_title();
    }
    wp_reset_postdata();
} 
25 нояб. 2014 г. 16:52:51
Комментарии

Я попытался использовать ваш совет. Но у меня нет знаний PHP :/. Могу я оплатить вам исправление? (жаль, что здесь нет личных сообщений)

nanonano nanonano
25 нояб. 2014 г. 17:26:34

Извините, в моем коде была небольшая синтаксическая ошибка. Смотрите обновленную версию

Pieter Goosen Pieter Goosen
25 нояб. 2014 г. 17:32:26

Я получаю фатальную ошибку (у меня есть резервные копии на всякий случай). Нужно ли заменить 'YOUR PARENT CATEGORY ID' на $text?

nanonano nanonano
25 нояб. 2014 г. 17:46:14

Ну, если вы решили остаться с этим плагином и модифицировать его (что я настоятельно не рекомендую), тогда да

Pieter Goosen Pieter Goosen
25 нояб. 2014 г. 17:52:13

У меня получилось! Я отредактировал ваш код.

nanonano nanonano
26 нояб. 2014 г. 01:28:50

Спасибо за предложенное исправление. Теперь я вижу, в чем была ваша проблема, и мне следовало добавить примечание: синтаксис в моем коде поддерживается только php версии 5.4 и выше. В более ранних версиях вы получите фатальную ошибку. В ранних версиях следует использовать array(), тогда как в 5.4+ можно просто использовать [] :-)

Pieter Goosen Pieter Goosen
26 нояб. 2014 г. 05:55:02
Показать остальные 1 комментариев
0
-3

вы можете использовать этот способ:

    <?php
$category_id = get_cat_ID('Название категории');
 <!-- Начало цикла. -->
 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

 <!-- Проверяем, относится ли текущая запись к категории "Название категории". -->
 <!-- Если да, div-блок получает CSS-класс "post-cat-special". -->
 <!-- В противном случае div-блок получает CSS-класс "post". -->

 <?php if ( in_category($category_id) ) { ?>
           <div class="post-cat-special">
 <?php } else { ?>
           <div class="post">
 <?php } ?>
</div>
 <!-- Остановка цикла (но обратите внимание на "else:" - см. следующую строку). -->

 <?php endwhile; else: ?>


 <!-- Первое условие "if" проверяло наличие записей для -->
 <!-- отображения. Эта часть "else" указывает что делать, если записей нет. -->
 <p>Извините, нет записей, соответствующих вашему критерию.</p>


 <!-- Полная остановка цикла. -->
 <?php endif; ?>

используйте этот волшебный код везде, где вам нужно отобразить....

25 нояб. 2014 г. 16:40:31