Удалить слаг произвольного типа записи из URL и добавить слаг таксономии

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

Я испытываю проблему при изменении URL типа записи. Текущий URL типа записи:

http://example.com/product/product-slug

где product является пользовательским типом записи.

Я хочу изменить его на:

http://domain.com/brand/brand-slug/product-slug

где brand является пользовательской таксономией.

Я нашел код, который удаляет /product/ из URL типа записи, и он работает нормально для меня. Я использую следующий код.

function gp_remove_cpt_slug( $post_link, $post, $leavename ) {

    if ( 'product' != $post->post_type || 'publish' != $post->post_status ) {
        return $post_link;
    }

    $post_link = str_replace( "https://wordpress.stackexchange.com/" . $post->post_type . "https://wordpress.stackexchange.com/", "https://wordpress.stackexchange.com/", $post_link );

    return $post_link;
}
add_filter( 'post_type_link', 'gp_remove_cpt_slug', 10, 3 );


function gp_parse_request_trick( $query ) {

    // Только для основного запроса
    if ( ! $query->is_main_query() )
        return;

    // Только для нашего очень специфичного правила переписывания
    if ( 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    // 'name' будет установлен, если постоянные ссылки записи - это просто post_name, в противном случае сработает правило страницы
    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'page', 'product' ) );
    }
}
add_action( 'pre_get_posts', 'gp_parse_request_trick' );

Настройка постоянной ссылки /%postname%/. Но когда я меняю настройку постоянной ссылки на /brand/%brand%/%postname%/, все пользовательские типы записей начинают выдавать ошибку 404.

Пожалуйста, подскажите, какие изменения нужно внести в код выше, чтобы это работало.

Вы можете настроить простые постоянные ссылки таксономии/типа записи с помощью аргумента rewrite при регистрации типа записи:

function wpd_product_brand_types() {

    register_taxonomy(
        'brand',
        'product',
        array(
            'rewrite' => array( 'slug' => 'brand', 'with_front' => false )
        )
    );

    register_post_type(
        'product',
        array(
            'label' => 'Products',
            'public' => true,
            'supports' => array( 'title' ),
            'rewrite' => array( 'slug' => 'brand/%brand%', 'with_front' => false )
        )
    );

}
add_action( 'init','wpd_product_brand_types' );

Затем фильтр post_type_link заменяет слаг %brand%:

function wpd_product_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'product' ){
        $terms = wp_get_object_terms( $post->ID, 'brand' );
        if( $terms ){
            return str_replace( '%brand%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpd_product_permalinks', 1, 2 );

Ответ или решение

Изменение структуры URL для пользовательских типов записей и добавление таксономии требует тщательного подхода и понимания основ работы с пермалинками и таксономией в WordPress. Давайте разберем задачу детально и рассмотрим решение, используя ваши текущие настройки и цели.

Теория:

В WordPress URL для записей определяются пермалинками, в которых вы можете комбинировать типы записей и таксономии. В вашем случае, вы хотите убрать сегмент /product/ из URL и вместо этого использовать структуру /brand/brand-slug/product-slug/, где brand – это таксономия. Это включает использование так называемого "человеческого" читаемого пути, который более интуитивно понятен пользователям и может облегчить работу SEO.

Когда вы регистрируете пользовательский тип записей или таксономию в WordPress, у вас есть возможность указать структуру URL через параметр rewrite. Важно понимать, что изменение структуры URL может повлиять на работу сайта, особенно если определенные правила переписывания URL не соответствуют вашим новым требованиям.

Пример:

Ваш текущий URL выглядит так: http://example.com/product/product-slug, и вы хотите изменить его на http://domain.com/brand/brand-slug/product-slug. Ваша текущая конфигурация предполагает, что вы уже убрали часть /product/ из URL. Однако, при попытке использования нового правила пермалинков /brand/%brand%/%postname%/, возникает проблема 404. Это указывает на то, что правила переписывания URL не соответствуют, и сервер не может правильно обработать запрос.

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

Применение:

  1. Регистрация таксономии и типов записей:

    При регистрации таксономии и пользовательского типа записей убедитесь, что вы правильно задаете параметр rewrite. В вашем случае необходимо, чтобы параметр slug в таксономии соответствовал вашему желаемому URL.

    function wpd_product_brand_types() {
       register_taxonomy(
           'brand',
           'product',
           array(
               'rewrite' => array( 'slug' => 'brand', 'with_front' => false )
           )
       );
    
       register_post_type(
           'product',
           array(
               'label' => 'Products',
               'public' => true,
               'supports' => array( 'title' ),
               'rewrite' => array( 'slug' => 'brand/%brand%', 'with_front' => false )
           )
       );
    }
    add_action( 'init','wpd_product_brand_types' );

    Здесь мы установили, что тип записей product будет иметь структуру URL, включающую таксономию brand.

  2. Фильтр для изменения ссылки типов записей:

    Настроим фильтр, который заменит плейсхолдер %brand% на фактический слаг таксономии.

    function wpd_product_permalinks( $post_link, $post ){
       if ( is_object( $post ) && $post->post_type == 'product' ){
           $terms = wp_get_object_terms( $post->ID, 'brand' );
           if( $terms && !is_wp_error($terms) ){
               return str_replace( '%brand%' , $terms[0]->slug , $post_link );
           }
       }
       return $post_link;
    }
    add_filter( 'post_type_link', 'wpd_product_permalinks', 1, 2 );

    Этот код берет первый термин таксономии brand, связанный с записью, и заменяет им %brand% в URL.

  3. Проверка и обновление правил перезаписи:

    После внесения изменений убедитесь, что вы обновили правила перезаписи. Это можно сделать вручную через интерфейс WordPress или программно вызвать flush_rewrite_rules();, однако это стоит делать только временно, так как постоянный вызов может повлиять на производительность.

    function rewrite_rules_on_activation() {
       wpd_product_brand_types();
       flush_rewrite_rules();
    }
    register_activation_hook( __FILE__, 'rewrite_rules_on_activation' );

    Используйте эту функцию при активации темы или плагина.

Данный подход позволяет вам гибко управлять URL, обеспечивая, что все правила перезаписи корректно обрабатываются WordPress. Не забудьте протестировать изменения в вашей тестовой среде перед тем, как внедрять их на рабочем сайте. Это позволит избежать потенциальных сбоев и проблем с доступом к страницам.

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

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