Вопрос или проблема
Я использую шорткод, чтобы попробовать отобразить теги и категории поста. Конкретно, это пост в портфолио, поэтому, когда пользователь посещает пост, он видит связанные категории и теги. пример здесь
Мой шорткод выдает все категории портфолио или теги портфолио, а не только те, которые относятся к текущему посту.
<?php
class ListCategories{
static function list_categories($atts, $content = null) {
$atts = shortcode_atts(
array(
'child_of' => 0,
'current_category' => 0,
'depth' => 0,
'echo' => 1,
'exclude' => '',
'exclude_tree' => '',
'feed' => '',
'feed_image' => '',
'feed_type' => '',
'hide_empty' => 1,
'hide_title_if_empty' => false,
'hierarchical' => 1,
'include' => '',
'number' => null,
'order' => 'ASC',
'orderby' => 'name',
'pad_counts' => 0,
'show_count' => 0,
'show_option_all' => '',
'show_option_none' => __( 'Нет категорий' ),
'style' => 'list',
'taxonomy' => 'category',
'title_li' => __( 'Категории' ),
'use_desc_for_title' => 1,
'walker' => null,
), $atts
);
ob_start();
wp_list_categories($atts);
$output = ob_get_contents();
ob_end_clean();
return $output;
}
}
add_shortcode( 'categories', array('ListCategories', 'list_categories') );
Если вы используете стандартные таксономии category
и post_tag
для своих постов в портфолио, то взгляните на get_the_tags()
и get_the_category()
. Эти функции вернут массивы тегов и категорий для текущего поста. Передавайте ID поста как параметр в функции, когда используете вне цикла.
Если, с другой стороны, у вас есть пользовательские таксономии, тогда используйте get_the_terms()
напрямую, в которую вы можете передать слаг пользовательской таксономии как 2-й параметр, а ID поста как 1-й.
Если вы хотите использовать wp_list_categories()
, тогда вы должны передать include
как один из параметров, чтобы список был ограничен указанными ID терминов. В документации есть хороший пример, как это сделать с помощью wp_get_object_terms()
.
Ответ или решение
Чтобы отобразить категории и теги текущей портфолио-записи в WordPress, важно использовать правильные функции и методы, чтобы избежать извлечения всех категорий и тегов, а не только связанных с конкретным постом. В этом ответе мы рассмотрим основные шаги, которые нужно предпринять для реализации данной задачи с использованием шорткодов.
Шаг 1: Использование встроенных функций WordPress
Если мы используем стандартные таксономии category
и post_tag
, можно воспользоваться функциями get_the_category()
и get_the_tags()
. Эти функции возвращают массивы категорий и тегов для текущего поста. Когда мы работаем с постом вне цикла, необходимо передавать ID поста:
$post_id = get_the_ID(); // Получаем ID текущего поста
// Получаем категории
$categories = get_the_category($post_id);
if (!empty($categories)) {
echo '<ul>';
foreach ($categories as $category) {
echo '<li>' . esc_html($category->name) . '</li>'; // Выводим название категории
}
echo '</ul>';
}
// Получаем теги
$tags = get_the_tags($post_id);
if (!empty($tags)) {
echo '<ul>';
foreach ($tags as $tag) {
echo '<li>' . esc_html($tag->name) . '</li>'; // Выводим название тега
}
echo '</ul>';
}
Шаг 2: Работа с пользовательскими таксономиями
Если для ваших портфолио записей используются пользовательские таксономии, необходимо использовать функцию get_the_terms()
. Эта функция позволяет получить термины по определенной таксономии для конкретного поста:
$portfolio_categories = get_the_terms($post_id, 'portfolio-category'); // Ваша пользовательская таксономия
if (!empty($portfolio_categories) && !is_wp_error($portfolio_categories)) {
echo '<ul>';
foreach ($portfolio_categories as $portfolio_category) {
echo '<li>' . esc_html($portfolio_category->name) . '</li>'; // Выводим название категории
}
echo '</ul>';
}
$portfolio_tags = get_the_terms($post_id, 'portfolio-tag'); // Вторая пользовательская таксономия
if (!empty($portfolio_tags) && !is_wp_error($portfolio_tags)) {
echo '<ul>';
foreach ($portfolio_tags as $portfolio_tag) {
echo '<li>' . esc_html($portfolio_tag->name) . '</li>'; // Выводим название тега
}
echo '</ul>';
}
Шаг 3: Создание шорткода
Теперь мы можем комбинировать приведенные выше примеры в один шорткод, который будет отображать категории и теги текущего поста:
class ListPortfolioTerms {
static function list_terms($atts) {
ob_start();
$post_id = get_the_ID();
// Отображаем категории
$portfolio_categories = get_the_terms($post_id, 'portfolio-category');
if (!empty($portfolio_categories) && !is_wp_error($portfolio_categories)) {
echo '<h3>Категории</h3><ul>';
foreach ($portfolio_categories as $portfolio_category) {
echo '<li>' . esc_html($portfolio_category->name) . '</li>';
}
echo '</ul>';
}
// Отображаем теги
$portfolio_tags = get_the_terms($post_id, 'portfolio-tag');
if (!empty($portfolio_tags) && !is_wp_error($portfolio_tags)) {
echo '<h3>Теги</h3><ul>';
foreach ($portfolio_tags as $portfolio_tag) {
echo '<li>' . esc_html($portfolio_tag->name) . '</li>';
}
echo '</ul>';
}
return ob_get_clean();
}
}
add_shortcode('portfolio_terms', array('ListPortfolioTerms', 'list_terms'));
После добавления этого шорткода в ваш файл функций (файл functions.php
вашей темы), вы сможете использовать [portfolio_terms]
в любом месте вашего контента, чтобы отобразить категории и теги текущего портфолио-поста.
Заключение
Используя приведенный выше код и принципы, вы сможете добиться правильного отображения категорий и тегов для текущего поста, избегая проблемы с выводом всех категорий и тегов. Это не только повысит качество вашего контента, но также улучшит его SEO-позиции, так как посетители будут иметь доступ к более релевантной информации о записи.