Создание своей таксономии в WordPress (ЧПУ ссылки)

Admin PHP, WordPress 2 комментария

Создаём свою произвольную таксономию на WordPress к типу записи — post.

В этой статье мы создаём новый список разделов, отличный от уже существующих: Рубрик и Меток.

Имеем следующую задачу. Нужна новая таксономия в разделе «Записи». Она будет называться «Имена». Например, чтобы создать категории для имён актёров в кино.

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

Когда таксономия «Имена» будет введена, при создании новой записи появится новый блок категорий имен актёров.

Новую таксономию можно оформить в виде нового плагина для WordPress. Это решение будет более эстетичным. Однако для удобства описания, чтобы всё не городить в одном месте и не усложнять, инструкция ниже будет дана по изменению файла functions.php.

Для реализации этой задачи, в файл functions.php своей темы нужно добавить следующий блок php кода:

// Регистрация новой таксономии:
add_action( 'init', 'create_taxname', 0 );
function create_taxname () {
$args = array(
    // Название таксономии
    'label' => _x( 'Имена', 'taxonomy general name' ),
   
    // Значения таксономии в админ-панели:
    'labels' => array(
    // Общее название таксономии (множественное число).
    // По умолчанию: 'МеткИ' или 'РубрикИ'
    'name' => _x( 'Имена', 'taxonomy general name' ),
    // Название таксономии (единственное число).
    // По умолчанию: 'МеткА' или 'РубрикА'
    'singular_name' => _x( 'Имена', 'taxonomy singular name' ),
    // Название таксономии в пункте меню.
    'menu_name' => __( 'Имена' ),
    // По умолчанию: 'Все метки' или 'Все рубрики'
    'all_items' => __( 'Все Имена' ),
    // Текст изменения таксономии на странице редактирования.
    // По умолчанию: 'Изменить метку' или 'Изменить рубрику'
    'edit_item' => __( 'Изменить имя' ),
    // Текст в админ-панели на странице редактирования данной таксономии.
    // По умолчанию: 'Просмотреть метку' или 'Просмотреть рубрику'
    'view_item' => __( 'Просмотреть Имена' ),
    // Текст обновления таксономии во вкладке свойства.
    // По умолчанию: 'Обновить метку' или 'Обновить рубрику'
    'update_item' => __( 'Обновить имя' ),
    // Текст добавления новой таксономии при ее создании.
    // По умолчанию: 'Добавить новую метку' или 'Добавить новую рубрику'
    'add_new_item' => __( 'Добавить новое имя' ),
    // Название таксономии при ее создании и редактировании.
    // По умолчанию: 'Название'
    'new_item_name' => __( 'Название' ),
    // Текст родительской таксономии при создании и редактировании.
    // Для древовидных таксономий.
    // По умолчанию: Родительская.
    'parent_item' => __( 'Родительская' ),
    // То же, что и parent_item, но с добавлением двоеточия.
    // По умолчанию: 'Родительская:'
    'parent_item_colon' => __( 'Родительская:' ),
    // Текст в кнопке поиска на странице всех таксономий.
    // По умолчанию: 'Поиск меток' или 'Поиск рубрик'
    'search_items' => __( 'Поиск имени' ),
   
    // ЧЕТЫРЕ НИЖНИХ параметра НЕ используется для древовидных таксономий:
    // Надпись популярных таксономий (на странице всех таксономий).
    // По умолчанию: Популярные метки или null.
    'popular_items' => null,
    // Надпись разделения таксономий запятыми в метабоксе.
    // По умолчанию: Метки разделяются запятыми или null.
    'separate_items_with_commas' => null,
    // Надпись добавления или удаления таксономий в метабоксе когда JavaScript отключен.
    // По умолчанию: Добавить или null.
    'add_or_remove_items' => null,
    // Текст выбора из часто используемых таксономий в метабоксе.
    // По умолчанию: Выбрать из часто используемых или null.
    'choose_from_most_used' => null,
   
    // Текст в случае, если запрашиваемая таксономия не найдена.
    // По умолчанию: 'Меток не найдено. или 'Рубрик не найдено.
    'not_found' => __( 'Имя не найдено.' ),
    ),
    // Если true, то таксономия становится доступной для использования.
    'public' => true,
    // Доступность таксономии для управления в админ-панели, но не показывает ее в меню.
    // По умолчанию: 'public'.
    'show_ui' => true,
    // Показывать таксономию в админ-меню.
    // Значение аргумента 'show_ui' должно быть true.
    // По умолчанию: значение аргумента 'show_ui'.
    'show_in_menu' => true,
    // Добавляет или исключает таксономию в навигации сайта "Внешний вид -> Меню"
    // По умолчанию: 'public'.
    'show_in_nav_menus' => true,
    // Позволяет виджет 'Облако меток' использовать в таксономии.
    // По умолчанию: 'show_ui'.
    'show_tagcloud' => true,
    // Показ таксономии в меню быстрого доступа.
    // По умолчанию: 'show_ui'.
    'show_in_quick_edit' => true,
    // Обеспечивает показ метабокса с таксономией в записи. По умолчанию: null.
    'meta_box_cb' => null,
    // Позволяет автоматическое создание столбцов таксономии в таблице ассоциативных типов постов.
    // По умолчанию: false.
    'show_admin_column' => false,
    // Подключает описание таксономии в таблице со всеми таксономиями. По умолчанию: ''
    'description' => '',
    // Делает таксономию древовидной как рубрики или недревовидной как метки. По умолчанию: false.
    'hierarchical' => true,
    // Название функции, вызываемая после обновления ассоциативных типов объектов записи (поста)
    // Действует во многом как хук.
    // По умолчанию: ''.
    'update_count_callback' => '',
    // Значение запроса. По умолчанию: true.
    'query_var' => true,
   
    // Перезапись URL. По умолчанию: true.
    'rewrite' => array(
    // Текст в ЧПУ. По умолчанию: название таксономии.
    'slug' => 'person',
    // Позволяет ссылку добавить к базовому URL.
    'with_front' => false,
    // Использовать (true) или не использовать (false) древовидную структуру ссылок.
    // По умолчанию: false.
    'hierarchical' => true,
    // Перезаписывает конечное значение таксономии. По умолчанию: EP_NONE.
    'ep_mask' => EP_NONE,
),
   
/*
    // Массив полномочий зарегестрированных пользователей:
    'capabilities' => array(
    'manage_terms' => 'manage_resource',
    'edit_terms'   => 'manage_categories',
    'delete_terms' => 'manage_categories',
    'assign_terms' => 'edit_posts',
),
*/

    // Должна ли таксономия запоминать порядок, в котором посты были созданы.
    // По умолчанию: null.
    'sort' => null,
    // Является ли таксономия собственной или встроенной.
    // Рекомендация: не использовать этот аргумент при регистрации собственной таксономии.
    // По умолчанию: false.
    '_builtin' => false,
);
    // Названия типов записей к которым будет привязана таксономия
    register_taxonomy( 'person', array('post'), $args );
}

Теперь в разделе записи появится новая категория записей с названием Имена. Здесь можно будет добавить новых актёров.

Читабельные ссылки (ЧПУ) в своей произвольной таксономии

Если во вкладке «Настройки постоянных ссылок» (меню навигации в админ панели WordPress: «Настройки» > «Постоянные ссылки») выставлены настройки для показа пользователям «дружественных URL» (т.е. ЧПУ ссылок / человекопонятный урл / friendly url), то для работы новой таксономии обязательно требуется добавить следующий php код:

// НЕОБХОДИМА для ссылок ЧПУ, иначе страница с категорией будет не найдена
// Удаление slug таксономии:
function taxonomy_link( $link, $term, $taxonomy ) {
    if ( $taxonomy !== 'person' )
        return $link;
    return str_replace( 'person/person/', '', $link );
}
add_filter( 'term_link', 'taxonomy_link', 10, 3 );

Кроме того, после внесения изменений в новую таксономию в файле functions.php, обязательно нужно «сохранить изменения» на странице админ панели WordPress: «Настройки» > «Постоянные ссылки». Иначе страница категорий с новой таксономии будет не найдена.

В данном случае таксономия работает при следующей настройке в постоянных ссылках:

http://site_name.ru/%post_id%/

Создание шаблона для таксономии

Для показа новых рубрик таксономии нужно создать следующий файл – taxonomy-person.php. В файле archive.php указываем путь к шаблону для новой рубрики таксономии. В моём случае, шаблон для таксономии, лежит в корневой директории шаблона WordPress:

// категория таксономия
elseif (is_tax(person) ) {
    get_template_part( '/taxonomy-person' );
}

Данный код имеет силу в общем шаблоне вида:

<?php
// Если это конкретные категории
if (is_category(array('102','103','104')) ) {
    get_template_part( '/archives/raitings' );
}

// категория таксономии
elseif (is_tax(person) ) {
    get_template_part( '/taxonomy-person' );
}

// категория поиск
elseif (is_search() ) {
    get_template_part( '/search' );
}
// категория теги и всё другое
else {
    get_template_part( '/archives/tag' );
}
?>

В файл taxonomy-person.php вносим содержимое файла archive.php с нужными изменениями, которые будут присущи новым категориям. Если ничего не меняется, то шаблон можно оставить таким же.

Привет. Ты находишься на моём сайте. Я разработчик. Здесь я делюсь своими наработками и знаниями. Спрашивай в комментариях, если тебе что-то не понятно или пиши, если есть что добавить.

Если вам пригодилась информация, вы можете поблагодарить автора сайта символическим пожертвованием:

Комментарии к статье “Создание своей таксономии в WordPress (ЧПУ ссылки)” (2)

  • Аватар
    Сергей
    23.04.2019 в 21:37

    Привет, хотел пообщаться по кастомных таксономий и Seo, так как встретился с этой проблема является

    Нужно правильное вывода при настройке

    site.com/%category%/%postname%

    А также как правильно забрать слаг таксономии

    • Admin
      Admin
      Автор записи
      05.05.2019 в 07:04

      Слишком обобщенно задан первый вопрос, чтобы ответить что-то конкретное.

      А слаг у таксономии можно получить как-то так:

      $termId = 2;
      $term = get_term($termId);
      $slug = $term->slug;
      echo $slug;

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

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи: "Создание своей таксономии в WordPress (ЧПУ ссылки)".

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Если вам нужно добавить участок кода ставьте его между тегами <code></code>