term_is_ancestor_of() — проверяет, является ли элемент таксономии родительским для другого конкретного элемента

Одним словом функция возвращает true, если первый указанный элемент таксономии $term1 является родительским для второго указанного элемента $term2 (не важно, на каком уровне вложенности он находится), если же это условие не выполняется, данный условный тег возвращает false.

term_is_ancestor_of( $term1, $term2, $taxonomy )
$term1
(целое число|объект) ID или объект родительского элемента таксономии,
$term2
(целое число|объект) ID или объект дочернего элемента,
$taxonomy
(строка) название таксономии, которой принадлежат указанные элементы;

Пример

Пример для рубрик, кстати, для них есть отдельная функция cat_is_ancestor_of().

if ( term_is_ancestor_of( 1, 4, 'category') ){
	echo 'Рубрика с ID = 4 является дочерней для рубрики с ID = 1';
}

Как известно, у меток post_tag нет иерархии (если только вы не модифицировали эту таксономию), а следовательно нет родительских и дочерних элементов, поэтому рассмотрим какую-нибудь произвольную таксономию, например product_cat (буду для удобства называть элементы этой таксономии категориями).

Суть следующего примера в том, чтобы выводить описание категории только для тех элементов, которые не являются дочерними элемента с ID = 4.

// заданный родительский элемент
$term1_id = 4;
 
// теперь нам нужно вытащить ID или объект текущей категории
$term2_obj = get_term_by( 'slug', get_query_var('term'), 'product_cat');
 
if ( !term_is_ancestor_of( $term1_id, $term2_obj, 'product_cat') ){
	term_description( $term2_obj->term_id, 'product_cat' ); // выводим описание
}

Все приведенные в примере функции и их описания вы найдете в документации WordPress на моем сайте.

Комментарии 4

  • Артем17 марта 2016 в 11:03 #

    Добрый день, Миша.

    Помогите с решением задачи.
    Дано:
    Зарегистрировано 4 новых типа данных (post_type) и для каждой по 1 новой таксономии с включенной иерархией.

    Задача:
    Вывести все разделы с подразделами для каждого типа данных. 1 раздел = 1 тип данных.

    Я частично реализовал этот вывод, но не получается сделать вывод иерархическим. (В текущий момент, у меня просто выводятся требуемые мне разделы, списком "не иерархическим")

        $args=array(
            'public'       => true,
            '_builtin'     => false,
            'taxonomies'   => true
        );
        $post_types=get_post_types($args, 'names', 'and');
        foreach ($post_types  as $post_type ) {
            if ($post->post_type == $post_type) {
     
                $page_object = get_post_type_object($post_type);
                $terms = get_terms($page_object->taxonomies[0]);
            }
        }
    	if ($terms) {
            echo '<ul>';
    		foreach ($terms as $term) {
    			echo '<li><a href="' . get_term_link($term) . '">' . $term->name . "</a> ({$term->count})</li>";
    		}
    		echo '</ul>';
         }

    Второй вопрос, подскажите как более правильно написать мой код. Мне хочется развивать свои знания в области wordpress.

    Заранее благодарен.

    • Миша25 марта 2016 в 13:03 #

      Артём, добрый день!

      Прошу прощения за задержку с ответом — был в отъезде с 13-го числа до сегодняшнего дня.

      Не знаю, актуальна ли ещё задача, но я вам отвечу.

      C вашим кодом в принципе всё хорошо, понимание же в общем то прийдёт само со временем.

      Для того, чтобы добиться вложенности, бы порекомендовал вам попробовать функцию wp_list_categories():

      $args=array(
      	'public'       => true,
      	'_builtin'     => false,
      	'taxonomies'   => true
      );
      $post_types=get_post_types($args, 'names', 'and');
      foreach ($post_types as $post_type ) {
      	if ($post->post_type == $post_type) {
       		$page_object = get_post_type_object( $post_type );
      		wp_list_categories( array( 'taxonomy' => $page_object->taxonomies[0], 'title_li' => '' ) );
      		break;
      	}
      }

      Надеюсь после отпуска мои мозги не размякли и я всё правильно вам написал :)

      • Артем30 марта 2016 в 05:03 #

        Спасибо большое, все работает!
        Можно еще пару вопросов по этому коду?
        Смотрите у меня стоит 2 задачи:
        1. На странице категории (привязанной к типу_поста) не определяется текущий тип_поста - соответственно выдает ошибки. Как решить эту проблему?

        $post_types=get_post_types(array('public' => true, '_builtin' => false, 'taxonomies' => true), 'names', 'and');
        foreach ($post_types as $post_type ) { /* тут на странице таксономии "категории" (не архива) выдает ошибку из за того, что $post_type - не существует  */
        	if ($post->post_type == $post_type) {
         		$page_object = get_post_type_object( $post_type );
        		wp_list_categories( array( 'taxonomy' => $page_object->taxonomies[0], 'title_li' => '' ) );
        		break;
        	}
        }

        2. Вопрос. Как вывести активный элемент в этом меню. Не могу понять, как присвоить класс к активным пунктам меню (у меня 2 уровня вложенности категорий).

        • Миша30 марта 2016 в 08:03 #

          1. $post->post_type — в данном случае вы просто пытаетесь получить тип записи из объекта записи.

          Для того, чтобы получить типы постов, привязанные к текущей таксономии, используйте этот код:

          $this_taxonomy = get_query_var('taxonomy'); // получаем название таксономии
          //  $this_taxonomy = 'books'; // можно задать и вручную
           
          $this_taxonomy_obj = get_taxonomy( $this_taxonomy ); // получаем объект таксономии
          $post_type_array = $this_taxonomy_obj->object_type; // массив, содержащий присвоенные к таксономии типы постов

          Соответственно, в вашей проверке это будет выглядеть так:

          if ( in_array( $post_type, $post_type_array ) )  {

          2. Тут я вас отправлю к документации функции wp_list_categories(), там есть.

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.