WordPress子类别不像他们应该在网址中工作

时间:2017-02-20 08:53:33

标签: php wordpress .htaccess url-rewriting

我正在使用这个名为"自定义帖子类型永久链接"的插件,这有助于我获得一个帖子类型以与我创建的自定义分类法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?

2 个答案:

答案 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输出时发现的。