URL-адреса пользовательских типов записей не работают

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

У меня на сайте реализована функциональность пользовательского типа записи для определенного действия. Это нужно для достижения специфической структуры URL. Я убрал постоянный слаг и заменил его на имя категории и бренда.

Предыдущий URL был:

www.website.com/product/name

Новый URL:

www.website.com/category/brand/name

Как видите, я полностью убрал слаг. Вот код для этого. Теперь проблема в том, что эти URL не работают, и я получаю страницу 404 в ответ. Я также пробовал сбросить постоянные ссылки, но это не помогло.

На мой взгляд, из-за удаления слага запрос ищет в ‘Записи’, а не в ‘Пользовательском типе записи’, но я не знаю, как это исправить. Я буду вам очень признателен за ответ.

// Регистрация нашего пользовательского типа записи как aps-products
public static function register_cpt_aps_products() {
    $permalinks = get_aps_settings('permalinks');
    $slug = (isset($permalinks['product-slug'])) ? $permalinks['product-slug'] : '';

    // Метки для нашего типа записи aps-products
    $labels = array(
        // общее название типа записи
        'name' => __( 'APS Products', 'aps-text' ),
        // единственное название типа записи
        'singular_name' => __( 'APS Product', 'aps-text' ),
        'name_admin_bar' => __( 'APS Product', 'aps-text' ),
        'menu_name' => __( 'APS Products', 'aps-text' ),
        'add_new' => __( 'Добавить новый APS продукт', 'aps-text' ),
        'add_new_item' => __( 'Добавить новый APS продукт', 'aps-text' ),
        'edit_item' => __( 'Изменить APS продукт', 'aps-text' ),
        'new_item' => __( 'Новый APS продукт', 'aps-text' ),
        'view_item' => __( 'Просмотреть APS продукт', 'aps-text' ),
        'archives' => __( 'Архивы APS продуктов', 'aps-text' ),
        'search_items' => __( 'Поиск APS продуктов', 'aps-text' ),
        'insert_into_item' => __( 'Вставить в APS продукт', 'aps-text' ),
        'featured_image' => __( 'Изображение APS продукта', 'aps-text' ),
        'set_featured_image' => __( 'Установить изображение APS продукта', 'aps-text' ),
        'remove_featured_image' => __( 'Удалить изображение APS продукта', 'aps-text' ),
        'use_featured_image' => __( 'Использовать как изображение APS продукта', 'aps-text' ),
        'not_found' =>  __( 'Не найдено продуктов APS', 'aps-text' ),
        'not_found_in_trash' => __( 'Не найдено продуктов APS в корзине', 'aps-text' )
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'show_ui' => true,
        'query_var' => true,
        'publicly_queryable' => true,
        'show_in_nav_menus' => false,
        'menu_icon' => 'dashicons-products',
        'capability_type' => 'aps-products',
        'capabilities' => array(
           'read_post' => 'read_aps_product',
           'edit_post' => 'edit_aps_product',
           'edit_posts' => 'edit_aps_products',
           'delete_posts' => 'delete_aps_products',
           'create_posts' => 'create_aps_products',
           'publish_posts' => 'publish_aps_products',
           'edit_published_posts' => 'edit_published_aps_products',
           'delete_published_posts' => 'delete_published_aps_products',
           'edit_others_posts' => 'edit_others_aps_products',
           'delete_others_posts' => 'delete_others_aps_products',
           'read_private_posts' => 'read_private_aps_products',
           'edit_private_posts' => 'edit_private_aps_products',
           'delete_private_posts' => 'delete_private_aps_products'
        ),
        'map_meta_cap' => true,
        'hierarchical' => true,
        'taxonomies' => array('post_tag','aps-cats', 'aps-brands', 'aps-attributes', 'aps-filters', 'aps-rating-bars'),
        'has_archive' => true,
        'show_in_menu' => 'aps-products',
        'supports' => array( 'publicize','title', 'editor', 'thumbnail', 'comments', 'author', 'excerpt' ),
        'register_meta_box_cb' => array(__CLASS__, 'add_aps_products_metabox'),
        'rewrite' => array('slug' => '/%aps-cats%/%aps-brands%/', 'with_front' => false)
    );

Перейдите в настройки > постоянные ссылки и сохраните их, затем откройте www.website.com/category/brand/name

Дважды проверьте ваш слаг перенаписи. Вы можете попробовать что-то вроде этого.

    add_action('init', 'create_brand');
    function create_brand()
    {

    register_taxonomy
    (
        'sumo-brand-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Буквы', 'общее название таксономии'),
                'singular_name' => _x('Буква', 'единственное название таксономии')
                # И так далее
            ),
            'show_ui' => true,
            'query_var' => 'brand-letter',
            'rewrite' => array(
                'slug' => 'brand',
            ),
        )
    );

    register_post_type
    (
        'sumo-brand-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Термины брендов', 'общее название типа записи'),
                'singular_name' => _x('Термин бренда', 'единственное название типа записи')
                # И так далее …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'brand/%sumo-brand-letter%',
                'with_front' => false

            ),
            'query_var' => 'brand-term',
            'has_archive' => 'brand',
            'taxonomies' => array( 'sumo-brand-letter' ),
        )
    );
    }

    add_filter('post_type_link', 'brand_term_permalink', 10, 4);
    function brand_term_permalink($post_link, $post, $leavename, $sample)
    {
    if ( false !== strpos( $post_link, '%sumo-brand-letter%' ) ) {
        $brand_letter = get_the_terms( $post->ID, 'sumo-brand-letter' );
        $post_link = str_replace( '%sumo-brand-letter%', array_pop( $brand_letter )->slug, $post_link );
    }
    return $post_link;
    }

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

Проблема с неработающими URL для вашего пользовательского типа записей (CPT) может быть связана с несколькими основными моментами. Давайте разберем возможные причины и шаги для того, чтобы исправить ситуацию.

1. Проверка определения пользовательского типа записей

Проверьте ваш код, связанный с регистрацией пользовательского типа записей. В частности, настройка ‘rewrite’ должна быть правильно настроена. Ваш текущий код выглядит следующим образом:

'rewrite' => array('slug' => '/%aps-cats%/%aps-brands%/', 'with_front' => false)

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

'rewrite' => array('slug' => '%aps-cats%/%aps-brands%', 'with_front' => false)

2. Убедитесь, что таксономии зарегистрированы

Вы должны убедиться, что таксономии aps-cats и aps-brands зарегистрированы. Если они не зарегистрированы, WordPress не сможет корректно обрабатывать пути с этими переменными. Пример регистрации таксономии:

function create_aps_taxonomies() {
    register_taxonomy('aps-cats', 'aps-products', array(
        'labels' => array(
            'name' => __('Categories'),
            'singular_name' => __('Category')
        ),
        'hierarchical' => true,
        'rewrite' => array('slug' => 'category'),
        'show_admin_column' => true,
    ));

    register_taxonomy('aps-brands', 'aps-products', array(
        'labels' => array(
            'name' => __('Brands'),
            'singular_name' => __('Brand')
        ),
        'hierarchical' => true,
        'rewrite' => array('slug' => 'brand'),
        'show_admin_column' => true,
    ));
}
add_action('init', 'create_aps_taxonomies');

3. Сохранение пермалинков

Каждый раз после изменения формата URL, вам нужно перезагрузить настройки постоянных ссылок. Перейдите в Настройки > Постоянные ссылки и просто нажмите "Сохранить изменения". Это обновит правила перезаписи.

4. Обработка ссылок

Убедитесь, что вы правильно обрабатываете ссылки на своих страницах. Если вы создаете ссылки в шаблонах, используйте функцию get_permalink() или post_type_link для обеспечения корректной структуры URL.

5. Проверка конфликта с другими записями

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

Пример кода с исправлениями

Собрав все это, ваш код должен выглядеть примерно так:

add_action('init', 'register_cpt_aps_products');
function register_cpt_aps_products() {
    $labels = array(
        'name' => __('APS Products', 'aps-text'),
        'singular_name' => __('APS Product', 'aps-text'),
        'add_new' => __('Add New APS Product', 'aps-text'),
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'rewrite' => array('slug' => '%aps-cats%/%aps-brands%', 'with_front' => false),
        'has_archive' => true,
        'supports' => array('title', 'editor', 'thumbnail'),
        'taxonomies' => array('post_tag', 'aps-cats', 'aps-brands'),
    );

    register_post_type('aps-products', $args);
}

Заключение

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

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

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