7GIT
@7GIT

Как создать структуру постоянных ссылок для произвольных типов записей и таксономий (вложенные термы)?

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

Что я сделал:
Создал произвольный тип записи и зарегистрировал
px_product - тип записи - товары.
px_product_cat - таксономия - категории товаров (термы таксономии имеют иерархическую структуру, вложенность).

Мне нужно, чтобы ссылки имели следующий вид:
mysite.com/products/category1/child-category-1/grandchild-category-1/product-name
mysite.com/Товары/Мебель/Мягкая мебель/Диваны/Диван
mysite.com/products/category-1/category-1.1/category-1.1.1/product-name


Вот часть моего functions.php файла
/**
 * CPT - Создание произвольного типа записи.
 */
add_action( 'init', 'cpt_product', 0 );
function cpt_product() {
	// Тип записи
	register_post_type( 'px_product', array( 
	    'labels'             => array( 'name' => __( 'Товары' ) ),
	    'public'              => true,
	    'show_ui'             => true,
	    'capability_type'     => 'post',
	    'publicly_queryable'  => true,
	    'exclude_from_search' => false,
	    'hierarchical'        => true,
	    '_builtin'            => false,
	    'query_var'           => true,
	    'rewrite'             => array( 'slug' => 'products/%px_product_cat%', 'with_front' => true ),
	    'supports'            => array( 'title', 'editor', 'author', 'excerpt', 'trackbacks', 'custom-fields' )
	) );
	// Таксономия
	register_taxonomy( 'px_product_cat', array( 'px_product' ), array(
		'labels'             => array( 'name' => __( 'Категории' ) ),
	    'hierarchical'        => true,
	    'show_ui'             => true,
	    'query_var'           => true,
	    'rewrite'             => array( 'slug' => 'products', 'with_front' => true )
	) );
}

/**
 * PermaLink - Внедрение терма таксономии в структуру постоянных ссылок для произвольного типа записи.
 */
add_filter( 'post_type_link', 'permalink_cpt_product', 10, 2 );
function permalink_cpt_product( $link, $post ) {
    if ( $post->post_type === 'px_product' ) {
        if ( $terms = get_the_terms( $post->ID, 'px_product_cat' ) )
            $link = str_replace( '%px_product_cat%', current( $terms )->slug, $link );
    }
    return $link;
}


Далее, я создаю в админ панели WordPress три терма (категории), которые имею вложенность:
1. Мебель
2. Мягкая
3. Диваны

Далее создаю новый товар - Диван, и присваиваю ему категорию Диваны.

В теме Astra путь хлебных крошек такой:
Главная/Мебель/Мягкая/Диваны/Диван

Ссылка выглядит так:
http://a.ru/products/диваны/диван/

Помогите, что мне сделать, чтобы моя ссылка выводила полный путь, как в крошках
http://a.ru/products/мебель/мягкая/диваны/диван
  • Вопрос задан
  • 383 просмотра
Решения вопроса 1
7GIT
@7GIT Автор вопроса
Решение ниже, но есть проблема (не критично): Ошибка 404 при переходе на страницу таксономии с ярлыком на кириллице, что не так?

<?php
/*
* Plugin Name: MOD
* Description: DEV
*/

/**
* Создание произвольного типа записи
* - register_post_types()
*/
add_action('init', 'register_post_types', 0);
function register_post_types()
{
// тип записи
    register_post_type('mod_services', array(
        'labels' => array('name' => __('Товары')),
        'public' => true,
        'show_in_menu' => true,
        'show_in_rest' => null,
        'rest_base' => null,
        'hierarchical' => false,
        'supports' => array('title', 'editor', 'thumbnail'),
        'has_archive' => true,
        'rewrite' => array('slug' => 'catalog', 'with_front' => false),
        'query_var' => true,
    ));
// таксономия
    register_taxonomy('mod_services_catalog', array('mod_services'), array(
        'labels' => array('name' => __('Категории')),
        'public' => true,
        'hierarchical' => true,
        'rewrite' => array('slug' => 'catalog', 'hierarchical' => true, 'with_front' => false),
        'capabilities' => array(),
        'meta_box_cb' => null,
        'show_admin_column' => false,
        'show_in_rest' => null,
        'rest_base' => null,
    ));
}

/**
* Изменяем структуру ссылок записей
* - products_permalink()
*/
add_filter('post_type_link', 'products_permalink', 1, 2);
function products_permalink($permalink, $post)
{
    if (strpos($permalink, 'catalog') === false) return $permalink;
    $terms = get_the_terms($post, 'mod_services_catalog');
    if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
        $taxonomy_slug = get_term_parents_list($terms[0]->term_id, 'mod_services_catalog', array(
            'separator' => '/', 'format' => 'slug', 'link' => false, 'inclusive' => true
        ));
        $taxonomy_slug = trim($taxonomy_slug, '/');
    } else {
        $taxonomy_slug = 'categories';
    }
    return str_replace('catalog', 'catalog/' . $taxonomy_slug, $permalink);
}

/**
* Создаём новые правила перезаписи +
* - taxonomy_slug_rewrite()
*/
add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite');
function taxonomy_slug_rewrite($wp_rewrite)
{
    $rules = array();
    $taxonomies = get_terms(array(
        'taxonomy' => 'mod_services_catalog', 'hide_empty' => false
    ));
    foreach ($taxonomies as $taxonomy) {
        $taxonomy_slug = get_term_parents_list($taxonomy->term_id, 'mod_services_catalog', array(
            'separator' => '/', 'format' => 'slug', 'link' => false, 'inclusive' => true
        ));
        $rules['^catalog/' . $taxonomy_slug . '?$'] = 'index.php?' . $taxonomy->taxonomy . '=' . $taxonomy->slug;
    }
    $rules['^catalog/([^/]*)/?$'] = 'index.php?mod_services_catalog=$matches[1]';
    $rules['^catalog/(.+?)/page/?([0-9]{1,})/?$'] = 'index.php?mod_services_catalog=$matches[1]&paged=$matches[2]';
    $rules['^catalog/(.+?)/([^/]*)/?$'] = 'index.php?mod_services=$matches[2]';
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
}

/**
* Обновляем правила перезаписи при создании/удалении/изменении таксономий
* - hc_reset_rewrite_rules()
*/
add_action('created_mod_services_catalog', 'hc_reset_rewrite_rules');
add_action('delete_mod_services_catalog', 'hc_reset_rewrite_rules');
add_action('edited_mod_services_catalog', 'hc_reset_rewrite_rules');
function hc_reset_rewrite_rules()
{
    flush_rewrite_rules();
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы