Пользовательские типы записей, таксономии и постоянные ссылки
Это сводит меня с ума, и я уверен, что это просто, но ничто из того, что я ищу, не имеет простой структуры (все очень сложно).
У меня есть пользовательский тип записи product_listing
и пользовательская таксономия product_cat
(которая является иерархической и должна иметь похожие категории).
Я просто хочу, чтобы мои URL-адреса выглядели так:
mysite.com/products/category1/product-name1
mysite.com/products/category2/product-name2
Но, клянусь жизнью, что бы я ни делал, я получаю ужасную проблему 404. Страницы работают нормально, и сообщения работают нормально, но мои пользовательские сообщения работают неправильно. Они отображаются как:
mysite.com/products/product-name1
mysite.com/products/product-name2
Который на самом деле работает ! Просто я хочу увидеть там свою пользовательскую таксономию, плюс я хочу иметь доступ к шаблону taxonomy.php
, который я настроил, перейдя по ссылке:
mysite.com/products/category1/
mysite.com/products/category2/
Ни один из моих слизней не является одинаковым, и я не хочу, чтобы они были такими. Вот тип записи и часть таксономии моего файла functions.php
:
///// CUSTOM POST TYPES /////
// register the new post type
register_post_type( 'product_listing', array(
'labels' => array(
'name' => __( 'Products' ),
'singular_name' => __( 'Product' ),
'add_new' => __( 'Add New' ),
'add_new_item' => __( 'Create New Product' ),
'edit' => __( 'Edit' ),
'edit_item' => __( 'Edit Product' ),
'new_item' => __( 'New Product' ),
'view' => __( 'View Products' ),
'view_item' => __( 'View Product' ),
'search_items' => __( 'Search Products' ),
'not_found' => __( 'No products found' ),
'not_found_in_trash' => __( 'No products found in trash' ),
'parent' => __( 'Parent Product' ),
),
'description' => __( 'This is where you can create new products on your site.' ),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 2,
'menu_icon' => get_stylesheet_directory_uri() . '/images/tag_orange.png',
'hierarchical' => true,
'_builtin' => false, // It's a custom post type, not built in!
'rewrite' => array( 'slug' => 'products', 'with_front' => true ),
'query_var' => true,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );
//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');
//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
// Add new taxonomy, make it hierarchical (like categories)
$labels = array(
'name' => _x( 'Categories', 'taxonomy general name' ),
'singular_name' => _x( 'Category', 'taxonomy singular name' ),
'search_items' => __( 'Search Categories' ),
'all_items' => __( 'All Categories' ),
'parent_item' => __( 'Parent Categories' ),
'parent_item_colon' => __( 'Parent Categories:' ),
'edit_item' => __( 'Edit Category' ),
'update_item' => __( 'Update Category' ),
'add_new_item' => __( 'Add New Category' ),
'new_item_name' => __( 'New Category Name' ),
'menu_name' => __( 'Category' ),
);
register_taxonomy( 'product_cat', array( 'product_listing' ), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
//'rewrite' => true,
'rewrite' => array( 'slug' => '%category%', 'with_front' => true ),
) );
// Add new taxonomy, NOT hierarchical (like tags)
$labels = array(
'name' => _x( 'Scents', 'taxonomy general name' ),
'singular_name' => _x( 'Scent', 'taxonomy singular name' ),
'search_items' => __( 'Search Scents' ),
'popular_items' => __( 'Popular Scents' ),
'all_items' => __( 'All Scents' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit Scent' ),
'update_item' => __( 'Update Scent' ),
'add_new_item' => __( 'Add New Scent' ),
'new_item_name' => __( 'New Scent Name' ),
'separate_items_with_commas' => __( 'Separate scents with commas' ),
'add_or_remove_items' => __( 'Add or remove scents' ),
'choose_from_most_used' => __( 'Choose from the most used scents' ),
'menu_name' => __( 'Scents' ),
);
register_taxonomy( 'scent', 'product_listing', array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
//'rewrite' => array( 'slug' => 'scents' ),
) );
}
У меня также есть другая пользовательская таксономия scents
, которую я в идеале хотел бы иметь какой-то дружественный URL, но я более открыт в этом вопросе. Я бы хотел, возможно, получить доступ к списку всех ароматов, перейдя к mysite.com/products/scents
, но они не обязательно должны быть специфичными для конкретной категории.
Кто-нибудь может мне помочь?
5 answers
Измените slug
в аргументах типа сообщения на products/%product_cat%
и slug
в аргументах таксономии на просто products
, затем очистите правила перезаписи. WordPress теперь должен обрабатывать /products/my-product-cat/post-name/
!
Теперь, наконец, нам нужно немного помочь WordPress с созданием постоянных ссылок (из коробки, он не распознает тег permastruct %product_cat%
):
/**
* Inject term slug into custom post type permastruct.
*
* @link http://wordpress.stackexchange.com/a/5313/1685
*
* @param string $link
* @param WP_Post $post
* @return array
*/
function wpse_5308_post_type_link( $link, $post ) {
if ( $post->post_type === 'product_listing' ) {
if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
$link = str_replace( '%product_cat%', current( $terms )->slug, $link );
}
return $link;
}
add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );
Следует отметить одну вещь: это просто захватит первую категорию товаров для поста , заказанного по имени. Если вы назначаете несколько категорий для одного продукта я могу легко изменить способ определения того, какой из них использовать в постоянной ссылке.
Дайте мне знать, как вы справляетесь с этим, и мы сможем решить другие проблемы!
Спасибо @Thedeadmechanic, ваш ответ помог мне, но только частично. Я хотел сделать то же самое, о чем просил @rodeoramsey, но с вложенными категориями (т.Е.: mysite.com/products/category1/child-category-1/grandchild-category-1/product-name
), и ваше решение для этого не сработало.
Наконец-то я нашел расширенное решение своего вопроса, которое работает, поэтому, если кому-то еще нужны вложенные категории/подкатегории, вы можете увидеть подробное решение по моему собственному вопросу. Надеюсь, это поможет другим, и спасибо за первые шаги.
Я не уверен, что wp поддерживает эту структуру из коробки, но вы можете очень легко создать для этого свои собственные правила перезаписи.
Ознакомьтесь с предыдущим ответом здесь Перепишите URL-адрес автора.
Вы можете изменить строку
$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';
К чему-то вроде
$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';
Часть product_cat здесь может быть излишней - я не уверен, нужна ли она.
Вы можете добавить любые правила, которые вам нравятся, и они будут иметь приоритет над встроенными.
Да, это сводило меня с ума, прежде чем установить постоянную ссылку для пользовательского типа сообщения. Я нашел плагин для обработки пользовательского типа сообщений. Он очень прост в использовании. http://wordpress.org/extend/plugins/custom-post-permalinks / WP должен добавить это в качестве основной функции! Лев
На самом деле, это довольно просто. Вам нужна всего одна строчка. Вот мой код
function create_product_taxonomies() { // Add new taxonomy, make it hierarchical (like categories) $labels = array( 'name' => _x('Categories', 'taxonomy general name'), 'singular_name' => _x('Category', 'taxonomy singular name'), 'search_items' => __('Search Categories'), 'all_items' => __('All Categories'), 'parent_item' => __('Parent Categories'), 'parent_item_colon' => __('Parent Categories:'), 'edit_item' => __('Edit Category'), 'update_item' => __('Update Category'), 'add_new_item' => __('Add New Category'), 'new_item_name' => __('New Category Name'), 'menu_name' => __('Category'), ); register_taxonomy('product_cat', array('product_listing'), array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'query_var' => true, 'rewrite' => array('hierarchical' => true), ));
И применен к сгенерированной таксономии для моих обзоров CPT из GenerateWP.com . Я использую это на своем собственном сайте WordPress, https://www.wpstarters.com
function reviews_category_taxonomy() { $labels = array( 'name' => _x( 'Reviews Categories', 'Taxonomy General Name', 'reviews_category' ), 'singular_name' => _x( 'Reviews Category', 'Taxonomy Singular Name', 'reviews_category' ), 'menu_name' => __( 'Reviews Category', 'reviews_category' ), 'all_items' => __( 'All Review Categories', 'reviews_category' ), 'parent_item' => __( 'Parent Review Category', 'reviews_category' ), 'parent_item_colon' => __( 'Parent Review Category:', 'reviews_category' ), 'new_item_name' => __( 'New Review Category Name', 'reviews_category' ), 'add_new_item' => __( 'Add New Review Category', 'reviews_category' ), 'edit_item' => __( 'Edit Review Category', 'reviews_category' ), 'update_item' => __( 'Update Review Category', 'reviews_category' ), 'view_item' => __( 'View Review Category', 'reviews_category' ), 'separate_items_with_commas' => __( 'Separate items with commas', 'reviews_category' ), 'add_or_remove_items' => __( 'Add or remove items', 'reviews_category' ), 'choose_from_most_used' => __( 'Choose from the most used', 'reviews_category' ), 'popular_items' => __( 'Popular Review Categories', 'reviews_category' ), 'search_items' => __( 'Search Items', 'reviews_category' ), 'not_found' => __( 'Not Found', 'reviews_category' ), 'no_terms' => __( 'No Review Categories', 'reviews_category' ), 'items_list' => __( 'Review Categories list', 'reviews_category' ), 'items_list_navigation' => __( 'Review Categories list navigation', 'reviews_category' ), ); $args = array( 'labels' => $labels, 'hierarchical' => true, 'public' => true, 'show_ui' => true, 'show_admin_column' => true, 'show_in_nav_menus' => true, 'show_tagcloud' => false, 'show_in_rest' => true, 'rewrite' => array( 'hierarchical' => true ), ); register_taxonomy( 'reviews_category', array( 'wps_reviews' ), $args ); } add_action( 'init', 'reviews_category_taxonomy', 0 );
Все, что вам нужно, так это поставить 'переписать'=>массив ('иерархический'=>true),