Вывод списка вложенных термов и записей привязанных к текущему терму.
-
Добрый день.
Только начал осваивать wp и столкнулся с простейшей задачей: вывести список дочерних термов и записей. Благодаря поиску нашел некоторые решения, но хотелось бы разобраться, возможно есть более простые решения.Что имеется:
- собственный тип записей ‘catalog’
- привязанная к типу таксономия ‘catalog-category’ с поддержкой иерархии
[spoiler]
add_action( 'init', 'register_catalog_type' ); add_filter( 'post_type_link', 'catalog_permalink', 1, 2 ); function register_catalog_type() { register_taxonomy( 'catalog-category', array( 'catalog' ), array( 'labels' => array( 'name' => 'Категории', 'singular_name' => 'Категория', 'search_items' => 'Искать категорию', 'all_items' => 'Все категории', 'parent_item' => 'Родительская категория', 'parent_item_colon' => 'Родительская категория:', 'edit_item' => 'Редактировать категорию', 'update_item' => 'Обновить категорию', 'add_new_item' => 'Добавить категорию', 'new_item_name' => 'Новая категория', 'menu_name' => 'Категории', ), 'description' => 'Категории позиций каталога', 'public' => true, 'hierarchical' => true, 'rewrite' => array( 'slug' => 'catalog', 'hierarchical' => false, 'with_front' => false, 'feed' => false ), 'show_admin_column' => true, ) ); register_post_type( 'catalog', array( 'labels' => array( 'name' => 'Каталог', 'singular_name' => 'Товар', 'menu_name' => 'Каталог', 'all_items' => 'Все товары', 'add_new' => 'Добавить товар', 'add_new_item' => 'Добавить новый товар', 'edit' => 'Редактировать', 'edit_item' => 'Редактировать товар', 'new_item' => 'Новый товар', ), 'description' => 'Каталог товаров/позиций', 'public' => true, 'show_in_menu' => true, 'capability_type' => 'post', 'map_meta_cap' => true, 'hierarchical' => false, 'rewrite' => array( 'slug' => 'catalog/%catalog-category%', 'with_front' => false, 'pages' => false, 'feeds' => false, 'feed' => false ), 'has_archive' => 'catalog', 'query_var' => true, 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', ), 'taxonomies' => array( 'catalog-category' ), 'menu_icon' => 'dashicons-book' ) ); } function catalog_permalink( $permalink, $post ) { if ( strpos( $permalink, '%catalog-category%' ) === false ) { return $permalink; } $terms = get_the_terms( $post, 'catalog-category' ); if ( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) { $term_slug = array_pop( $terms )->slug; } else { $term_slug = 'no-catalog-category'; } return str_replace( '%catalog-category%', $term_slug, $permalink ); }
[/spoiler]
Что хочу:- Создать вложенную структуру категорий используя термы таксономии ‘catalog-category’ и привязать записи типа ‘catalog’ к ним. С этой частью проблем нет
- Вывести на странице терма непосредственно его дочерние термы и только те записи которые привязаны к нему. с этим уже проблема
В качестве страницы терма использую файл ‘taxonomy-catalog-category.php’
Список вложенных термов получаю так:$term_slug = get_query_var('term'); $taxonomy = get_query_var('taxonomy'); $term = get_term_by( 'slug', $term_slug, $taxonomy ); $terms = get_terms($taxonomy, array( 'child_of' => $term->term_id ) );
Но среди них оказываются не только дочерние, но и более вложенные термы
Если выводить записи стандартным циклом wp то получаю абсолютно все записи вложенных термов(хочется исключить вывод записей дочерних термов), попытки получить записи через get_posts пока не привели к желаемым результатам. Несколько использованных вариантов(закомментированные):
$posts = get_posts( array( //'numberposts' => 0, //'cat' => $term->term_id, 'orderby' => 'date', 'order' => 'DESC', 'post_type' => 'any', //'catalog', 'suppress_filters' => true, //'tag' => $term_slug, ) );
Документацию по обоим функция get_terms(), get_posts() перечитал по несколько раз, но видимо что-то упускаю…
PS: на данном форуме натыкался на темы с использованием WP_Query с кучей кода, но не уверен что я правильно понимаю их и хочется попробовать разобраться более простыми методами.
- Тема «Вывод списка вложенных термов и записей привязанных к текущему терму.» закрыта для новых ответов.