Страница не найдена для таксономии произвольного типа записи
Я создал произвольный тип записи с таксономиями, и когда я перехожу на страницу таксономии и просматриваю одну из них, я получаю ошибку "страница не найдена", как будто таксономия не была создана.
Есть предложения?
/*Продукты*/
$labels = array(
'name' => _x('Продукты', 'общее название типа записи'),
'singular_name' => _x('Продукт', 'единственное название типа записи'),
'add_new' => _x('Добавить новый', 'Продукт'),
'add_new_item' => __("Добавить новый продукт"),
'edit_item' => __("Редактировать продукт"),
'new_item' => __("Новый продукт"),
'view_item' => __("Просмотреть продукт"),
'search_items' => __("Поиск продукта"),
'not_found' => __('Продукты не найдены'),
'not_found_in_trash' => __('В корзине продукты не найдены'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'singular_label' => __('Продукты'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => true,
'query_var' => 'products',
'taxonomies' => array('products-cat'),
'supports' => array('title', 'editor', 'custom-fields', 'thumbnail', 'excerpt'),
'has_archive' => true,
);
register_post_type( 'products' , $args );
// Добавить в функцию admin_init
add_filter('manage_edit-products_columns', 'add_new_products_columns');
function add_new_products_columns($columns) {
$columns = array(
'cb' => '<input type="checkbox" />',
'images' => 'Изображения',
'title' => 'Название продукта',
'author' => 'Автор',
'product-categories' => 'Категории',
'tags' => 'Метки',
'date' => 'Дата',
);
return $columns;
}
add_action('manage_products_posts_custom_column', 'manage_products_columns', 10, 2);
function manage_products_columns($column_name, $id) {
global $wpdb;
switch ($column_name) {
case 'images':
//echo get_the_post_thumbnail( $page->ID, array(50,50) );
break;
case 'product-categories':
echo get_the_term_list($post->ID, 'products-cat', '', ', ','');
break;
default:
break;
}
}
add_action( 'init', 'products_create_taxonomies', 0 );
function products_create_taxonomies()
{
// Категории фотографий
register_taxonomy('products-cat',array('products'),array(
'hierarchical' => true,
'label' => 'Категории продуктов',
'singular_name' => 'Категория продуктов',
'show_ui' => true,
'query_var' => true,
'rewrite' => array('slug' => 'products' )
));
}
/*Конец Продуктов*/
У меня это есть в странице архивов
archive-products.php
<?php get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post();?>
<?php the_title(); ?>
<?php endwhile; endif; ?>

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

После некоторых исследований я нашел блог, в котором действительно был ответ на эту проблему.
Вот функция вместе с ссылкой на блог.
function taxonomy_slug_rewrite($wp_rewrite) {
$rules = array();
// получаем все пользовательские таксономии
$taxonomies = get_taxonomies(array('_builtin' => false), 'objects');
// получаем все пользовательские типы записей
$post_types = get_post_types(array('public' => true, '_builtin' => false), 'objects');
foreach ($post_types as $post_type) {
foreach ($taxonomies as $taxonomy) {
// перебираем все типы записей, к которым привязана эта таксономия
foreach ($taxonomy->object_type as $object_type) {
// проверяем, зарегистрирована ли таксономия для этого типа записей
if ($object_type == $post_type->rewrite['slug']) {
// получаем объекты категорий
$terms = get_categories(array('type' => $object_type, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0));
// создаем правила
foreach ($terms as $term) {
$rules[$object_type . '/' . $term->slug . '/?$'] = 'index.php?' . $term->taxonomy . '=' . $term->slug;
}
}
}
}
}
// объединяем с глобальными правилами
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'taxonomy_slug_rewrite');

Я рекомендую как минимум два действия:
Измените приоритет для вашего действия
products_create_taxonomies
как минимум на 1, а лучше на 5 или выше. (Я предполагаю, что 0 может быть недопустимым значением для приоритетов действий по какой-то причине)Добавьте создание вашего типа записи в действие init, так же как вы сделали для таксономий, но с более высоким приоритетом, чем у таксономий (поскольку вы связываете их через таксономию).
Если эти два изменения не решат проблему, попробуйте настроить оба элемента (без их связи через собственные структуры), а затем вызовите следующий код с более поздним приоритетом (все еще во время init):
register_taxonomy_for_object_type( 'products-cat', 'products' );
Это должно гарантировать, что они будут полностью и корректно связаны.

Я думаю, ваша основная проблема здесь заключается в правилах перезаписи (rewrite) для вашей таксономии. В текущем виде ваш rewrite для таксономии выглядит так:
'rewrite' => array('slug' => 'products' )
Это в точности соответствует тому, что означает этот rewrite в вашем пользовательском типе записи (custom post type). Следующее:
'rewrite' => true,
преобразуется в вашем пользовательском типе записи в:
'rewrite' => array('slug' => 'products' )
По умолчанию, этот конфликт в правилах перезаписи приводит к ошибке 404 для запросов к таксономии. В качестве решения вы можете изменить rewrite для вашей таксономии, или ознакомиться с этой статьей, которую я недавно опубликовал на этом сайте, где описан более оптимальный способ решения этой проблемы.
Важно: После каждого изменения в коде не забывайте сбрасывать (flush) постоянные ссылки (permalinks), чтобы обновить их структуру в соответствии с новыми настройками.

это исправило проблему, но название слага изменилось на зарегистрированную таксономию, которая называется products-cat. Как я могу оставить rewrite true, но сохранить название слага как products?

Вы проверяли связанный пост? Одинаковые слаги rewrite для пользовательских типов записей и таксономий всегда вызывают проблемы в работе. Если я правильно помню, пользователь, который задал вопрос, на который я ответил, разместил пост именно об этой проблеме. Просто просмотрите его посты

Хорошо, я просмотрел пост, который вы порекомендовали, и изменил использование дефисов на подчеркивания, а также установил плагин для постоянных ссылок. После внесения этих изменений я понял, что изменение rewrite кода с того, что у меня было, на просто true — это не одно и то же. Когда я ставлю true, URL становится таким же, как имя зарегистрированной таксономии. URL также отображает имя пользовательского типа записей и имя зарегистрированной таксономии, например products/products-cat/automotive/. Есть предложения?

Честно говоря, это всё, чем я могу вам помочь, к сожалению. Откровенно говоря, с правилами перезаписи URL мы в одной лодке :-). Я знаю, что одинаковые URL для страниц таксономий и архивов пользовательских типов записей возможны с дополнительными правилами перезаписи. Думаю, с помощью пользовательского правила перезаписи можно убрать название таксономии из структуры URL в предыдущем комментарии. К сожалению, я сам не углублялся в решение подобной задачи. Надеюсь, вы найдёте решение, и если найдёте, пожалуйста, опубликуйте его и примите свой собственный ответ. Это будет очень полезно для будущих пользователей.
