Вопрос или проблема
У меня на сайте реализована функциональность пользовательского типа записи для определенного действия. Это нужно для достижения специфической структуры 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. Если проблема все еще остается, возможно, стоит проверить ваши плагины и темы на наличие потенциальных конфликтов.