Что бы создать кастомную таксономию в файл functions.php вашей темы нужно вставить следующий код и подогнать под себя.
add_action('init', 'register_post_types');
function register_post_types(){
//кастомная таксономия
register_taxonomy('objectcat', array('object'), array(
'label' => 'Рубрики объектов',
'labels' => array(
'name' => 'Рубрики объектов',
'singular_name' => 'Рубрики объектов',
'search_items' => 'Искать рубрики',
'all_items' => 'Все рубрики',
'parent_item' => 'Родит. рубрика',
'parent_item_colon' => 'Родит. рубрика:',
'edit_item' => 'Редактировать рубрику',
'update_item' => 'Обновить рубрику',
'add_new_item' => 'Добавить рубрику',
'new_item_name' => 'Заголовок',
'menu_name' => 'Рубрики объектов',
),
'description' => 'Рубрики для объектов',
'public' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => false,
'hierarchical' => true,
'rewrite' => array( 'hierarchical' => false ),//включает или отключает добавление таксономии в url
'show_admin_column' => true,//выводит таксономию в админке
'show_ui' => true,
'query_var' => true,
) );
// Кастомный тип записи
register_post_type('object', array(
'label' => 'Объект',
'labels' => array(
'name' => 'Объекты',
'singular_name' => 'Объект',
'add_new' => 'Добавить новый',
'add_new_item' => 'Введите заголовок',
'edit_item' => 'Редактирование объекта',
'new_item' => 'Новый объект',
'view_item' => 'Посмотреть объект',
'search_items' => 'Искать объект',
'not_found' => 'Объектов не найдено',
'not_found_in_trash' => 'В корзине объектов не найдено',
'parent_item_colon' => '',
'menu_name' => 'Объекты',
),
'description' => 'Объекты',
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'show_ui' => true,
'show_in_menu' => true,
'show_in_admin_bar' => true,
'menu_position' => 23,
'menu_icon' => 'dashicons-plus-alt',
'capability_type' => 'post',
'map_meta_cap' => true,
'hierarchical' => false,
'supports' => array('title','thumbnail'),
'taxonomies' => array('objectcat', 'localcat'),
'has_archive' => true,
'rewrite' => array('slug' => 'objects', 'with_front' => false),
'query_var' => true,
) );
}
// Фильтрация записей по таксономиям
function danilin_add_taxonomy_filters() {
global $typenow;
// таксономии
$taxonomies = array('portfolio_category','portfolio_client');
// пользовательский тип данных
if( $typenow == 'portfolio' ){
foreach ($taxonomies as $tax_slug) {
$tax_obj = get_taxonomy($tax_slug);
$tax_name = $tax_obj->labels->name;
$terms = get_terms($tax_slug);
if(count($terms) > 0) {
echo "<select name='$tax_slug' id='$tax_slug' class='postform'>";
echo "<option value=''>$tax_name</option>";
foreach ($terms as $term) {
echo '<option value='. $term->slug, $_GET[$tax_slug] == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>';
}
echo "</select>";
}
}
}
}
add_action( 'restrict_manage_posts', 'danilin_add_taxonomy_filters' );
Для редактирования в шаблонах сайта нужно создать файлы single-кастомный_тип_записи.php
taxonomy-кастомная_таксономия.php
Убираем слаг ( slug) таксономии
function true_post_type_rewrite()
{
global $wp_rewrite;
// в данном случае мой тип записей был - Услуги (objectcat)
// этот код позволит перезаписать урлы
// параметры add_rewrite_tag('%название_тега%', '%маска_символов%', '%url_параметр%')
$wp_rewrite->add_rewrite_tag("%objectcat%", '([^/]+)', "objectcat=");
$wp_rewrite->add_permastruct('objectcat', '%objectcat%');
}
add_action('init', 'true_post_type_rewrite');
function true_rewrite_conflicts($request)
{
if (!is_admin())
$request['post_type'] = array('objectcat', 'post', 'page'); // перечисляем типы записей с подобной структурой пермалинков
return $request;
}
add_filter('request', 'true_rewrite_conflicts');
После обновляем страницу (пересохраняем) Настройки постоянных ссылок.
Добавление название таксономии в урл кастомной записи
/ЯРЛЫК КАТЕГОРИИ ТОВАРА/ЯРЛЫК ТОВАРА/
//добавляем к урл записи таксономию
add_filter('post_link', 'true_post_type_permalink', 20, 3);
add_filter('post_type_link', 'true_post_type_permalink', 20, 3);
function true_post_type_permalink($permalink, $post_id, $leavename)
{
$post_type_name = 'post_gotovoe_resenie'; // название типа записи, вы можете найти его в админке или в функции register_post_type()
$post_type_slug = 'post_gotovoe_resenie'; // часть URL товаров, не всегда совпадает с названием типа записи!
$tax_name = 'objectcat'; // ну это понятно, название таксономии - категории товаров
$post = get_post($post_id); // получаем объект поста по его ID
if (strpos($permalink, $post_type_slug) === FALSE || $post->post_type != $post_type_name) // не делаем никаких изменений, если тип записи не соответствует или если URL не содержит ярлык tovar
return $permalink;
$termini = wp_get_object_terms($post->ID, $tax_name); // получаем все категории, к которым принадлежит данный товар
if (!is_wp_error($termini) && !empty($termini) && is_object($termini[0])) // и делаем перезапись ссылки, только, если товар находится хотя бы в одной категории, иначе возвращаем ссылку по умолчанию
$permalink = str_replace($post_type_slug, $termini[0]->slug, $permalink);
return $permalink;
}
add_filter('request', 'true_post_type_request', 1, 1);
function true_post_type_request($query)
{
global $wpdb; // нам немного придётся поработать с БД
$post_type_name = 'post_gotovoe_resenie'; // указываем тут название типа записей товара
$tax_name = 'objectcat'; // а также название таксономии - категории товаров
$yarlik = $query['attachment']; // после того, как мы изменили ссылки товаров в предыдущей функции, WordPress начал принимать их за страницы вложений
// а теперь давайте получим ID товара, ярлык которого соответствует запросу на странице
$post_id = $wpdb->get_var(
"
SELECT ID
FROM $wpdb->posts
WHERE post_name = '$yarlik'
AND post_type = '$post_type_name'
"
);
$termini = wp_get_object_terms($post_id, $tax_name); // товар должен находиться в категории (одной или нескольких)
if (isset($yarlik) && $post_id && !is_wp_error($termini) && !empty($termini)): // изменяем запрос, если всё ок
unset($query['attachment']);
$query[$post_type_name] = $yarlik;
$query['post_type'] = $post_type_name;
$query['name'] = $yarlik;
endif;
return $query; // возвращаем результат
}