Помощь в отображении текущих категорий и тегов поста

Вопрос или проблема

Я использую шорткод, чтобы попробовать отобразить теги и категории поста. Конкретно, это пост в портфолио, поэтому, когда пользователь посещает пост, он видит связанные категории и теги. пример здесь

Мой шорткод выдает все категории портфолио или теги портфолио, а не только те, которые относятся к текущему посту.

<?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-позиции, так как посетители будут иметь доступ к более релевантной информации о записи.

Оцените материал
Добавить комментарий

Капча загружается...