Как вы уже знаете, вордпресс довольно распространенная CMS, и где ее только не пытаются использовать. Выполняя некоторые проекты, порой удивляешься. И задаешь себе вопрос — а здесь то за чем? Ведь проще и производительнее использовать что-то написанное на php фреймворках. Но мода диктует свое — WordPress, там где нужно и часто там где не нужно.
Сегодня речь пойдет не о том что не нужно использовать WP в каких-то проектах. Сегодня вы узнаете как можно сформировать массив или построить хлебные крошки поста. При этом, не важно какой это тип записи (т. е. посты или custom post type) и какая таксономия — встроенные или созданные самостоятельно.
Функция формирования массива терминов поста
Перейдем к делу. Наш код будет состоять из двух частей. Первый оформлен в виде функции. Второй — обычного кода.
function get_hierarchical_terms_post($post_id, $taxonomy) { $terms = get_the_terms($post_id, $taxonomy); if($terms == false || is_wp_error($terms)) { return array(); } $term = array_shift($terms); $array = array($term); $parent_id = $term -> parent; while($parent_id) { $term = get_term_by('id', $parent_id, $term -> taxonomy); $parent_id = $term -> parent; $array[] = $term; } $array = array_reverse($array); return $array; }
Давайте подробнее разберем код. Функция реализована универсально, и в качестве второго параметра принимает название таксономии. Далее идет функция «get_the_terms», возвращающая массив объектов поста. Если результат функции ошибка или false, делаем выход из функции, возвращая пустой массив. Далее — получаем первый элемент из терминов и в дальнейшем строем для него линейное «дерево» в виде массива. В «$parent_id» присваиваем ID родительского термина. И запускаем «while» цикл, в котором циклично вызываем ф-ю «get_term_by». Результатом вызова данной функции является объект термина. При этом, термин будет родитель текущего. Ниже, мы перезаписываем переменную «$parent_id» присваивая ей новое значение родителя. Родителя текущего термина:
$parent_id = $term -> parent;
А в наш массив терминов добавляем новый:
$array[] = $term;
Таким образом, цикл будет выполняться до тех пор, пока переменная «$parent_id» не будет равняться нулю.
Ниже мы вызываем ф-ю «array_reverse», меняя порядок элементов массива на обратный. И завершаем работу ф-и с возвратом массива объектов терминов.
Формируем хлебные крошки для поста
Для этого напишем следующий код:
$Terms = get_hierarchical_terms_post(get_the_ID(), 'category'); $category_link_ar = array(); foreach($Terms as $Term): $category_link_ar[] = '<a href="'.get_term_link($Term -> term_id, 'category').'">'.esc_attr($Term -> name).'</a>'; endforeach; echo join(' » ', $category_link_ar);
Прежде всего, хочу обратить внимание на то, что данный код желательно вызывать внутри контента страницы. Это нужно для красивого формирования слагов категорий.
Выше написанной функции «get_hierarchical_terms_post», в качестве первого параметра передаем ID текущего поста, вторым — таксономию.
Далее, в цикле проходим по массиву терминов, и формируем ссылки. Для определения ссылки термина, используем стандартную ф-ю WordPress «get_term_link».
А хлебные крошки терминов, строим используя функцию php «join» с первым аргументом двойной стрелки вправо, и вторым аргументом — массивом ссылок категорий/терминов.
На этом все!