Вопрос или проблема
Я пытаюсь создать пользовательский пост с пользовательской таксономией и категориями. Структура выглядит следующим образом:
Продукт:
- Имеет категории
- Имеет таксономию
Создание пользовательского типа поста:
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, это может быть связано с тем, что правила перезаписи не обновлены или не настроены правильно. Рекомендуемые шаги для устранения этой проблемы:
-
Сброс настроек постоянных ссылок: Перейдите в админку WordPress в
Настройки > Постоянные ссылки
и выберите простой или стандартный формат, сохраните изменения. Затем вернитесь и выберите желаемую структуру, снова сохраните. -
Кэширование: После изменения настроек постоянных ссылок, очистите кэш вашего сайта, если используете плагин кэширования.
-
Проверка правил перезаписи: Убедитесь, что ваша таксономия и пользовательский тип записи правильно регистрируются и связаны между собой.
4. Использование ваших таксономий в URL
Имейте в виду, что вам нужно настроить свои архивные страницы для таксономий, добавив соответствующие правила и добавьте поддержку для ссылок на архивы:
function custom_rewrite_rules() {
add_rewrite_rule(
'^producers/([^/]+)/?$',
'index.php?producers=$matches[1]',
'top'
);
}
add_action('init', 'custom_rewrite_rules');
Итог
Вы описали свою ситуацию достаточно четко. Важно помнить, что некоторые изменения в WordPress могут быть неочевидными. Работайте с постоянными ссылками и кэшем, и если все сделано правильно, ваш сайт должен начать функционировать как задумано.
Если после всех действий проблема не решится, рассмотрите дополнительные проверки конфликта с другими плагинами или темами, которые могут вмешиваться в структуру URL.