我正在使用这个名为"自定义帖子类型永久链接"的插件,这有助于我获得一个帖子类型以与我创建的自定义分类法product_category
对齐,但是我无法在与Child Categories一起使用的/shop/
前面获得适当的product_category分类标准链接。
基本上,自定义帖子类型为product
,并且具有如下所示的网址结构:/ shop / category / {Category Parent} / {Category Child} / {Product Name},在函数中如下所示。 php注册自定义帖子类型时:
register_post_type('product', array(
'description' => __('Products'),
'label' => __('products'),
'labels' => array(
'name' => _x('Product', 'Post Type General Name'),
'singular_name' => _x('Product', 'Post Type Singular Name'),
'menu_name' => __('Products'),
'parent_item_colon' => __('Parent Product'),
'all_items' => __('All Products'),
'view_item' => __('View Product'),
'add_new_item' => __('Add New Product'),
'add_new' => __('Add New'),
'edit_item' => __('Edit Product'),
'update_item' => __('Update Product'),
'search_items' => __('Search Product'),
'not_found' => __('Not Found'),
'not_found_in_trash' => __('Not Found in Trash')
),
'taxonomies' => array('product_category'),
'supports' => array('title', 'editor', 'thumbnail'),
'rewrite' => array('slug' => 'shop', 'with_front' => false),
"cptp_permalink_structure" => "/category/%product_category%/%postname%/",
'hierarchical' => false,
'public' => true, // Needs to be set to true to be able to show the endpoints!
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => false,
'show_in_admin_bar' => true,
'query_var' => true,
'menu_position' => 10,
'menu_icon' => 'dashicons-cart',
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'capability_type' => 'page'
)
);
cptp_permalink_structure
键允许我分配%product_category%
,以便在网址中收集类别(父级和子级),产品名称是路径的最后一部分。我需要给它一个slug,所以我选择shop
以便它有一些东西作为slug并且商店应该在类别之前。所有产品网址都运行良好。看起来像这样:/shop/category/{Category Parent}/{Category Child}/{Product Name}/
现在对于自定义分类法,我在由WordPress的init
操作触发的函数中添加,看起来像这样:
// I do not want to use 'category' since I don't want post categories mixed with product categories.
register_taxonomy('product_category', 'product', array(
'label' => __('Category'),
'rewrite' => array('slug' => 'shop/category', 'hierarchical' => true, 'with_front' => false),
'labels' => array(
'name' => __('Categories'),
'singular_name' => __('Category'),
'all_items' => __('All Categories'),
'edit_item' => __('Edit Category'),
'view_item' => __('View Category'),
'update_item' => __('Update Category'),
'add_new_item' => __('Add New Category'),
'new_item_name' => __('New Category Name'),
'parent_item' => __('Parent Category'),
'parent_item_colon' => __('Parent Category:'),
'search_items' => __('Search Categories'),
'popular_items' => __('Popular Categories'),
'separate_items_with_commas' => __('Separate Categories with commas'),
'add_or_remove_items' => __('Add or Remove Categories'),
'choose_from_most_used' => __('Choose from the most used Categories'),
'not_found' => __('No Categories found')
),
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'hierarchical' => true,
'exclude_from_search' => false,
'description' => 'Categories associated with Products.',
'query_var' => true,
'capabilities' => array(
'manage_terms' => 'manage_options', //by default only admin
'edit_terms' => 'manage_options',
'delete_terms' => 'manage_options',
'assign_terms' => 'edit_posts' // means administrator', 'editor', 'author', 'contributor'
)
));
我尝试使用shop/category
作为分类法的重写段(如上所示),如果只有子类别档案页面没有生成404页面,这将是完美的。因此,在/shop/category/{Category Parent}/
和/shop/category/{Category Child}/
工作时,/shop/category/{Category Parent}/{Category Child}/
会返回404错误页面。所以,我不知道如何在/shop/category/{Category Parent}/{Category Child}/
注意:如果我将category
更改为重写slug,则子类别排列正确,如下所示:/category/{Category Parent}/{Category Child}
,但问题是,我需要/shop/
/category/
之前category
1}}这里。
怎么做?一直试图通过大量不同的方式解决这个问题,尝试添加重写规则(将重写slug更改为add_rewrite_rule('shop/category/?([^/]*)', 'index.php?product_category=$matches[1]', 'top');
时)。
$tax_slug = get_query_var('product_category');
echo '<pre>', var_dump($tax_slug), '</pre>';
但重写规则对儿童类别也不起作用。并返回父类别存档而不是子类。
我已经使用以下代码在archive.php文件中对此进行了测试:
BASE
并在子类别中返回父类别slug而不是子类。
这里有任何帮助,我一直在拉我的头发......秃头!
编辑 - 可能有效的方法
因此,基本上,它可能就像在管理员的永久链接部分为该分类法创建另一个product_category
一样简单。但是如何为自定义分类创建BASE?已经有类别和标签的BASE,但如果这可行,我需要product_category
的BASE,而category
分类的slug可能只是shop
,而且BASE会在其前面为所有链接添加{{1}}。但是如何为自定义分类创建BASE?
答案 0 :(得分:0)
我认为你应该更新functions.php中的查询参数。我在我的本地安装中尝试了你的代码,它与我的工作正常。
更新后的代码是:
/* Have WordPress match postname to any of our public post types (post, page, product)
* All of our public post types can have /post-name/ as the slug, so they better be unique across all posts
* By default, core only accounts for posts and pages where the slug is /post-name/
*/
function na_parse_request( $query ) {
if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
return;
}
if ( ! empty( $query->query['name'] ) ) {
$query->set( 'post_type', array( 'post', 'page', 'product' ) );
}
}
add_action( 'pre_get_posts', 'na_parse_request' );
当您更新永久链接和重写规则的任何更改时,这基本上会更改查询字符串。在这里发布类型值“product”已经给出了设置查询。
希望这对你有用。
谢谢
答案 1 :(得分:0)
在查看rewrite_rules_array
过滤器中的规则转储后计算出来。
我在wordpress init
操作中添加了这一位,现在可以正常工作:
add_rewrite_rule('shop/category/(.+?)/?$', 'index.php?product_category=$matches[1]&cpage=$matches[2]', 'top');
感谢大家的帮助。自定义分类法的slug在shop/category
为了让儿童类别有效,这里有一点重要的是:&cpage=$matches[2]
我不知道并且甚至不知道儿童类别的名称是{{cpage
1}},这是在查看我刚刚在页面上转储的rewrite_rules_array输出时发现的。