Получение записей из дочерних категорий по ID родительской категории
У меня есть плагин, который показывает записи из выбранной категории. Когда выбраны дочерние категории, он работает отлично. Однако когда я выбираю родительскую категорию, он не отображает записи из дочерних категорий.
Надеюсь, это тот фрагмент кода, который нужно изменить, но я не уверен.
Буду благодарен, если кто-то сможет помочь.
<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 // количество записей на странице
));
?>

Как я уже писал в комментариях к вашему вопросу
Плохо написанные плагины всегда приводят к катастрофе рано или поздно. На мой взгляд, удалите этот плагин и напишите свой код или найдите правильно написанный плагин. Нет смысла менять повреждённую шину, когда вся машина — полная потеря :-)
Для начала, никогда не используйте 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();
}

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

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

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

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

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

вы можете использовать этот способ:
<?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; ?>
используйте этот волшебный код везде, где вам нужно отобразить....
