Как вы уже знаете, вордпресс довольно распространенная 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» с первым аргументом двойной стрелки вправо, и вторым аргументом — массивом ссылок категорий/терминов.
На этом все!
