我有一个自定义帖子类型
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/
我都没有sl是一样的,我也不希望它们是。这是我的
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
的另一种自定义分类法,理想情况下,我希望具有某种友好的名称网址,但我对此更为开放。我想访问mysite.com/products/scents
来访问所有气味的列表,但它们不必特定于类别。有人可以帮助我吗?
#1 楼
将帖子类型参数中的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 );
注意,这只是获取按名称排序的帖子的第一个产品类别。如果您要为一个产品分配多个类别,我可以轻松地更改其确定在固定链接中使用哪个类别的方式。
Lemme知道您如何继续使用此产品,我们可以解决其他问题问题!
#2 楼
感谢@TheDeadMechanic,您的回答对我有所帮助,但仅部分帮助了我。我想按照@RodeoRamsey的要求做同样的事情,但是使用嵌套类别(即:mysite.com/products/category1/child-category-1/grandchild-category-1/product-name
),并且您的解决方案对此无效。我终于想出了一个扩展的解决方案可以,因此,如果其他任何人都需要嵌套的类别/子类别,则可以根据我自己的问题查看详细的解决方案。希望它能对其他人有所帮助,并感谢您的初始步骤。
#3 楼
我不确定wp是否支持开箱即用的结构-但是您可以很容易地创建自己的重写规则。在此处查看先前的答案作者url rewrite。
您可以将行
$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部分可能是多余的-我不确定是否需要。
您可以添加任何喜欢的规则,它们将优先于内置规则。
评论
好吧,那不是很有趣。哦,男孩,我认为自定义重写规则超出了我的范围。我尝试了上面的代码(其余代码来自另一篇文章),没有任何变化。我刷新了所有内容,然后再次尝试,但仍然没有任何更改,因此我注释掉了自定义帖子类型和分类法中设置的所有重写规则,并刷新并保持不变。
– RodeoRamsey
2010-12-14在1:09
#4 楼
是的,在设置自定义帖子类型的永久链接之前,这让我发疯了。我找到了一个插件来处理自定义帖子类型。它非常易于使用。http://wordpress.org/extend/plugins/custom-post-permalinks/
WP应该将此添加为核心功能!
Leo
评论
我以前见过这个,并避免使用它,因为它说的是“非分层”分类法。我曾经将其设置为分层结构,所以我认为它不会起作用,但是到目前为止,它似乎已经成功了!另外,它似乎正在完成我试图实现的/ products / cat-name / prod-name /结构(请参见对其他答案的评论)。 @TheDeadMedic,这是一个可行的选择吗?还是应该坚持在functions.php文件中进行重写?
– RodeoRamsey
2010-12-14 17:57
#5 楼
实际上,这很容易。您只需要一行。这是我的代码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), ));
,并应用于GenerateWP.com为我的Reviews CPT生成的分类法。我在自己的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 );
上使用了所有您需要的内容,因此将'rewrite'=> array ('hierarchical'=> true),
评论
哇,我敬畏!这工作!最后!我从来没有想过会!!!非常感谢SOOOOOO! ............现在,我将如何生成一个链接(类似于the_permalink之类的东西)以单独获取分类法URL? / products / my-product-cat /
– RodeoRamsey
2010-12-14在3:21
我想我已经解决了这个问题^^^ ............但是现在我陷入了分页问题。当使用任何分页(自定义功能或内置功能)时,似乎会中断,因为/ products / my-product-cat /看起来还可以,但/ products / my-product-cat / page / 2 /返回404并删除了taxonomy.php文件支持index.php文件。我已经尝试了所有可能找到的东西,但仍然一无所获。
– RodeoRamsey
2010-12-14 6:45
您是否考虑将单个产品重写更改为product / cat-name / product-name? (请注意唯一性)问题在于未触发分类法分页的重写规则,因为它已被单一产品的较早规则所捕获!
–TheDeadMedic
2010-12-14 10:52
我愿意接受。但是,请绕开我的头,这是否意味着如果您要查看的是单个产品页面还是“类别”页面,则产品将具有不同的URL路径?因此,单一将是product / cat-name / prod-name,但是cats将是products / cat-name /?这样会否破坏“人类友好”网址的目的?我很难帮助客户了解wp仪表板,更不用说区别了...如果我误会了,请告诉我!我也可能对没有前台目录感到满意,例如product-cat / product-nam和product-cat /。那行得通吗?
– RodeoRamsey
2010-12-14 14:44
知道了-尽管我会说它是“人类友好的”,因为档案(产品/)和单项(产品/)之间有明显的区别。不,我会保留“前目录”-它有助于与帖子和页面保持明显区别,另外,否则可能会导致性能问题(即冗长的重写规则)。
–TheDeadMedic
2010-12-14 15:31