Выводим список всех тегов и категорий WordPress

Статьи 25.06.2022 (обновлено)

Разберемся как отобразить на страницах сайта WordPress все теги в виде одного списка, реализуем это с категориями, таксономиями, типами записей.

Структуру сайта на базе Системы Управления WordPress можно сделать разными способами. Можно сделать много рубрик и распределять все записи по ним, а можно сделать одну рубрику, но много тегов, которые добавляются к разным записям.

Если у нас второй вариант как на этом сайте, когда все записи в одной рубрике, но с разными тегами, то иногда может понадобиться отображать список всех тегов в виде списка или меню.

Пример с этого моего сайта, где под меню мы видим список всех тегов:

Выводим список всех тегов и категорий WordPress

Сделать это не сложно, но нужно ориентироваться в темах WordPress и понимать какой файл темы за что отвечает, чтобы вывести теги так где нужно.

Итак, выводим все теги списком. Функция get_tags( ) извлекает массив объектов для каждого термина в таксономии post_tag.

echo "Все теги:<br/>";

$args = array( 
    'orderby'                  => 'name',
    'order'                    => 'ASC',
    'public'                   => true,
); 

$tags = get_tags( $args );

foreach ( $tags as $tag ) {
     echo '<a href="' . get_tag_link( $tag ) . '">' . $tag->name . '</a><br/>';
}

Категории. Функция get_categories( ) возвращает массив объектов категорий, соответствующих параметрам запроса.

echo "Категории:<br/>";

$args = array( 
    'orderby'                  => 'name',
    'order'                    => 'ASC', 
    'public'                   => true,
); 

$categories = get_categories( $args );

foreach ( $categories as $category ) {
     echo '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a><br/>';
}

echo "<hr>"; // разделитель

Таксономии. Функция get_taxonomies( ) получает список зарегистрированных объектов таксономии.

echo "Taxonomies:<br/>";

$args = array(  
    '_builtin'                 => false, 
    'public'                   => true,
); 

$taxonomies = get_taxonomies( $args, 'objects' ); 

foreach ( $taxonomies as $taxonomy ) {
    echo '<p>' . $taxonomy->labels->name . '</p>';
}

Типы постов. Функция get_post_types( ) возвращает зарегистрированные типы постов, найденные в $wp_post_types. Функция get_posts( ) создает массив постов на основе набора параметров, поэтому используйте ее со списком post_type_list.

echo "Типы постов:<br/>";

$args = array(
    'public'   => true,
    '_builtin' => false,
);
$output = 'names'; // names or objects, note names is the default
$operator = 'and'; // 'and' or 'or'
$post_types = get_post_types($args, $output, $operator);

// get all the posts for all post_types

$posts = get_posts(array(
                           'post_type'   => $post_types,
                           'numberposts' => - 1,
                           'orderby'     => 'post_type',
                           'order'       => 'ASC',
                           'post_status' => array( 'publish' ),
                           'public'      => true,
                       ));

foreach($posts as $post) {

    $link = get_permalink($post);
    $title = $post->post_title;

    if($post_type !== $post->post_type) {
        $post_type = $post->post_type;
        echo '</br/><p>' . $post_type . '</p></br/>';
    }

    // показать ссылку на запись

    echo "<p><a href=\"$link\">$title</a></p>";
}

Временное кэширование. Если вы хотите кэшировать результаты всех этих запросов, рассмотрите API Transients. Это позволит сохранить результат в базе данных на ограниченное время (которое вы ~запросите~). Это не определенное время, потому что такие плагины, как WP Optimize, могут очистить кэш в любое время.

// check if the value exists using the key -- if it fails then we'll generate the content

if(false === ($trans_value = get_transient($trans_key = 'my_transient_key'))) {

    print_r('NO CACHE FOR ' . $trans_key); // (debug output)

    // start the output buffer to capture our generated content

    ob_start();

    // run your expensive operations -- data sent to the screen will be captured

    print_r('This is an expensive operation!');

    // using ob_get_clean we'll store the results and set the value variable.

    // double check the amount of time you want to keep the data cached
    // set to 0 for auto loading on every page hit.

    set_transient($trans_key, $trans_value = ob_get_clean(), 1 * MINUTE_IN_SECONDS);
}
else {
    print_r('THIS IS A CACHED RESULT FOR ' . $trans_key); // (debug output)
}

// value is ready and cached
print_r("<pre>$trans_value</pre>");

Чтобы очистить значение, просто удалите его с помощью ключа.

delete_transient ( $trans_key );

Метаданные термина. Можно получить миниатюры для терминов, используя новые метаданные терминов с версии 4.4. Вам просто также нужно определить их заранее самостоятельно.

add_term_meta( int $term_id, string $meta_key, mixed $meta_value, bool $unique = false )

get_term_meta( int $term_id, string $key = '', bool $single = false )

update_term_meta( int $term_id, string $meta_key, mixed $meta_value, mixed $prev_value = '' )

Описанный выше метод для тегов я использовал на этом сайте, выводя все теги под шапкой на главной странице в виде дополнительного меню.

Сергей Ермилов
Опубликовано 07.02.2022
Категория: Статьи
Теги: ,

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

Ваш адрес email не будет опубликован.