Добавить категорию к URL настраиваемого поста

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

Я пытаюсь создать пользовательский пост с пользовательской таксономией и категориями. Структура выглядит следующим образом:

Продукт:

  • Имеет категории
  • Имеет таксономию

Создание пользовательского типа поста:

function create_alco_custom_post() {
    $review_slug = 'reviews';

    $labels = array( 
        'name' => __( 'Рецензии' ),
        'singular_name' => __( 'Рецензия' ),
        'add_new' => __( 'Новая рецензия' ),
        'add_new_item' => __( 'Добавить новую рецензию' ),
        'edit_item' => __( 'Редактировать рецензию' ),
        'new_item' => __( 'Новая рецензия' ),
        'view_item' => __( 'Посмотреть рецензию' ),
        'search_items' => __( 'Искать в рецензиях' ),
        'not_found' =>  __( 'Рецензии не найдены' ),
        'not_found_in_trash' => __( 'Рецензии не найдены в корзине' ),
    );
    $args = array(
        'labels' => $labels,
        'menu_icon' => 'dashicons-format-quote',
        'public' => true,
        'has_archive' => true,
    'rewrite' => array('slug' => '%review-category%','with_front' => true),
        'hierarchical'  => true,
        'menu_position' => 0,
        'exclude_from_search' => false,
        'supports' => array(
            'title', 
            'editor',
            'thumbnail'
        ),
        'taxonomies' => array('category')
    );
    register_post_type( 'review', $args );
} 
add_action( 'init', 'create_alco_custom_post' );

Затем я добавляю таксономию:

$labels = array(
    'name'                          => __( 'Производители', 'alkowiki' ),
    'singular_name'                 => __( 'Производитель', 'alkowiki' ),
    'search_items'                  => __( 'Искать среди производителей', 'alkowiki' ),
    'popular_items'                 => __( 'Популярные производители', 'alkowiki' ),
    'all_items'                     => __( 'Все производители', 'alkowiki' ),
    'parent_item'                   => __( 'Родительский производитель', 'alkowiki' ),
    'edit_item'                     => __( 'Редактировать производителя', 'alkowiki' ),
    'update_item'                   => __( 'Обновить производителя', 'alkowiki' ),
    'add_new_item'                  => __( 'Добавить нового производителя', 'alkowiki' ),
    'new_item_name'                 => __( 'Новый производитель', 'alkowiki' ),
    'separate_items_with_commas'    => __( 'Отделяйте производителей запятыми', 'alkowiki' ),
    'add_or_remove_items'           => __( 'Добавить или удалить производителей', 'alkowiki' ),
    'choose_from_most_used'         => __( 'Выберите из наиболее используемых производителей', 'alkowiki' )
);

$args = array(
    'labels'                        => $labels,
    'public'                        => true,
    'hierarchical'                  => true,
    'show_ui'                       => true,
    'show_in_nav_menus'             => true,
    'query_var'                     => true
);

register_taxonomy( 'producents', 'review', $args );

И наконец, я изменяю структуру ссылок:

add_filter('post_link', 'category_permalink', 1, 3);
add_filter('post_type_link', 'category_permalink', 1, 3);

function category_permalink($permalink, $post_id, $leavename) {
    if (strpos($permalink, '%review-category%') === FALSE) return $permalink;
        // Получаем пост
        $post = get_post($post_id);
        if (!$post) return $permalink;

        // Получаем термины таксономии
        $terms = wp_get_object_terms($post->ID, 'category');
        if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
            $taxonomy_slug = $terms[0]->slug;
        else $taxonomy_slug = 'некатегоризированное';

    return str_replace('%review-category%', $taxonomy_slug, $permalink);
}

Моя структура поста в настройках WP /%category%/%postname%/

И URL-адреса постов создаются правильно, архивы категорий отображают посты должным образом, постоянные ссылки создаются так, как я хотел, но когда я перехожу на сайт продукта (структура URL site/category/product-name), я получаю 404. Когда я посещаю URL с таксономией вместо категории (site/taxonomy/product-name), меня перенаправляет на /category/product-name, и это также заканчивается на 404.

Я борюсь с этим уже несколько дней, есть идеи?

ИЗМЕНЕНИЕ:

К сожалению, мне пришлось вернуть постоянные ссылки к значениям по умолчанию (%postname%) – я хочу, чтобы стандартные посты WP имели структуру URL следующего вида. Я также изменил стандартную категорию (которая связана с обычными постами) на пользовательскую таксономию под названием “my-category” и зарегистрировал ее для моего пользовательского типа постов. Теперь существует 2 таксономии (так же, как первая вставленная). Архивные страницы для них выдают 404, а страница продукта также все еще выдает 404. Как мне настроить структуру перезаписи?

Я уточню, что хочу достичь:

  • site.com/%taxonomy1%/ – архив для пользовательского поста с этой таксономией
  • site.com/%taxonomy2%/ – архив для пользовательского поста с этой таксономией
  • site.com/%taxonomy1%/custom-post-name/ – страница пользовательского поста (ссылка только с первой таксономией)

Вы можете следовать трем шагам для решения

1) Перейдите в настройки > постоянные ссылки и измените постоянные ссылки на простые или по умолчанию, затем сохраните их.

2) Теперь перейдите на главную страницу вашего сайта и обновите ее. Теперь проверьте страницы категорий.

3) Теперь снова перейдите в настройки > постоянные ссылки и измените их на /%category%/%postname%/

Теперь перейдите на главную страницу, обновите её и проверьте страницы категорий

Надеюсь, это поможет вам.

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

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

1. Создание пользовательского типа записи и таксономии

Сначала создадим пользовательский тип записи (например, "отзывы") и добавим две таксономии: одну по умолчанию (категории) и вторую (производители). Ваш код для этих шагов выглядит корректно, но я позволю себе небольшие рекомендации.

Код для пользовательского типа записи:

function create_alco_custom_post() {
    $labels = array(
        'name' => __('Отзывы'),
        'singular_name' => __('Отзыв'),
        'add_new' => __('Добавить новый отзыв'),
        'add_new_item' => __('Добавить новый отзыв'),
        // остальные метки...
    );

    $args = array(
        'labels' => $labels,
        'menu_icon' => 'dashicons-format-quote',
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => '%review-category%', 'with_front' => true),
        'hierarchical' => true,
        'supports' => array('title', 'editor', 'thumbnail'),
        'taxonomies' => array('category') // вывод категорий по умолчанию
    );

    register_post_type('review', $args);
}
add_action('init', 'create_alco_custom_post');

Код для добавления таксономии:

function create_producers_taxonomy() {
    $labels = array(
        'name' => __('Производители'),
        'singular_name' => __('Производитель'),
        // остальные метки...
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'hierarchical' => true,
        'show_ui' => true,
        'show_in_nav_menus' => true,
        'query_var' => true
    );

    register_taxonomy('producers', 'review', $args);
}
add_action('init', 'create_producers_taxonomy');

2. Настройка структуры ссылок

Поскольку вы хотите, чтобы структура ваших URL включала категории таксономии, необходимо использовать фильтры для замены плейсхолдера %review-category%.

Код для изменения ссылки:

add_filter('post_type_link', 'category_permalink', 1, 3);
function category_permalink($permalink, $post_id, $leavename) {
    if (strpos($permalink, '%review-category%') === false) return $permalink;

    $post = get_post($post_id);
    if (!$post) return $permalink;

    // Получаем термины таксономии
    $terms = wp_get_object_terms($post->ID, 'category');
    if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
        $taxonomy_slug = $terms[0]->slug;
    } else {
        $taxonomy_slug = 'uncategorized';
    }

    return str_replace('%review-category%', $taxonomy_slug, $permalink);
}

3. Проблемы с 404 ошибками

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

  1. Сброс настроек постоянных ссылок: Перейдите в админку WordPress в Настройки > Постоянные ссылки и выберите простой или стандартный формат, сохраните изменения. Затем вернитесь и выберите желаемую структуру, снова сохраните.

  2. Кэширование: После изменения настроек постоянных ссылок, очистите кэш вашего сайта, если используете плагин кэширования.

  3. Проверка правил перезаписи: Убедитесь, что ваша таксономия и пользовательский тип записи правильно регистрируются и связаны между собой.

4. Использование ваших таксономий в URL

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

function custom_rewrite_rules() {
    add_rewrite_rule(
        '^producers/([^/]+)/?$',
        'index.php?producers=$matches[1]',
        'top'
    );
}
add_action('init', 'custom_rewrite_rules');

Итог

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

Если после всех действий проблема не решится, рассмотрите дополнительные проверки конфликта с другими плагинами или темами, которые могут вмешиваться в структуру URL.

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

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