Получение записей get_posts, привязанных к определенному термину пользовательской таксономии, без дочерних терминов
Допустим, у меня есть следующие термины таксономии:
Термин 1
Термин 1.1
Термин 1.2
Термин 2
Термин 2.1
Как мне получить только записи, которые привязаны к Термину 1, не включая те, что привязаны к Термину 1.1 или Термину 1.2?
Например:
$pages = get_posts(array(
'post_type' => 'page',
'numberposts' => -1,
'tax_query' => array(
array(
'taxonomy' => 'taxonomy-name',
'field' => 'id',
'terms' => 1 // Где term_id Термина 1 равен "1"
)
)
);
также возвращает мне записи, к которым привязаны Термины 1.1 и 1.2.
Спасибо.

Изучая класс WP_Tax_Query в файле /wp-includes/taxonomy.php, я обнаружил параметр 'include_children', который по умолчанию имеет значение true. Я изменил свой исходный вызов get_posts() следующим образом, и это отлично сработало:
$pages = get_posts(array(
'post_type' => 'page',
'numberposts' => -1,
'tax_query' => array(
array(
'taxonomy' => 'taxonomy-name',
'field' => 'term_id',
'terms' => 1, /// Где term_id термина 1 равен "1".
'include_children' => false
)
)
));
Список дополнительных параметров запроса: https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters

Читая на связанной странице Codex, я думаю, что значение 'field' в массиве tax_query должно быть 'term_id', а не 'id': "Возможные значения: 'term_id', 'name' и 'slug'. Значение по умолчанию: 'term_id'." Предполагаю, что 'id' работает только потому, что вызывает возврат к значению по умолчанию.

На днях наткнулся на такой код:
$tax = 'music';
$oterm = 'pop';
$term = get_term_by('slug', $oterm, $tax);
$termChildren = get_term_children($term->term_id, $tax);
$wp_query = new WP_Query();
$wp_query->query(
array(
'posts_per_page' => '5',
'tax_query' => array(
array(
'taxonomy' => $tax,
'field' => 'slug',
'terms' => $oterm
),
array(
'taxonomy' => $tax,
'field' => 'id',
'terms' => $termChildren,
'operator' => 'NOT IN'
)
)
)
);

Вот полный код, надеюсь, он поможет. Спасибо
<?php
$terms_array = array(
'taxonomy' => 'services', // вы можете изменить это в соответствии с вашей таксономией
'parent' => 0 // Если указано parent => 0, будут возвращены только термины верхнего уровня
);
$services_terms = get_terms($terms_array);
foreach($services_terms as $service): ?>
<h4><?php echo $service->name; ?></h4>
<?php
$post_args = array(
'posts_per_page' => -1,
'post_type' => 'service', // вы можете изменить это в соответствии с вашим пользовательским типом записи
'tax_query' => array(
array(
'taxonomy' => 'services', // вы можете изменить это в соответствии с вашей таксономией
'field' => 'term_id', // может быть 'term_id', 'slug' или 'name'
'terms' => $service->term_id,
)
)
);
$myposts = get_posts($post_args); ?>
<ul>
<?php foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endforeach; // Цикл по записям термина ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php endforeach; // Конец цикла по терминам; ?>
