如何配置自定义文章类型与分类法的重写规则以实现目标URL结构
解决WordPress自定义文章类型与分类法的URL结构冲突问题
核心思路
要实现你需要的三个URL结构,关键是关闭自定义文章类型的默认归档页,同时给分类法设置嵌套的URL规则,最后通过自定义页面或查询钩子实现/products页的tax查询逻辑。
步骤1:修正自定义文章类型注册代码
注册product类型时,关闭默认归档(避免/products被识别为归档页),同时指定单页URL的slug为products:
function register_product_cpt() { $args = array( 'labels' => array( 'name' => '产品', 'singular_name' => '产品' ), 'public' => true, 'has_archive' => false, // 关键:关闭默认归档,让/products指向自定义页面 'rewrite' => array( 'slug' => 'products', 'hierarchical' => true, 'with_front' => false ), 'supports' => array('title', 'editor', 'thumbnail'), 'taxonomies' => array('product_category') ); register_post_type('product', $args); } add_action('init', 'register_product_cpt');
步骤2:修正分类法注册代码
给product_category分类法设置嵌套在products下的URL规则:
function register_product_category_tax() { $args = array( 'labels' => array( 'name' => '产品分类', 'singular_name' => '产品分类' ), 'public' => true, 'rewrite' => array( 'slug' => 'products/category', // 分类归档URL嵌套在products下 'with_front' => false, 'hierarchical' => true ), 'hierarchical' => true ); register_taxonomy('product_category', 'product', $args); } add_action('init', 'register_product_category_tax');
步骤3:实现/products页的tax查询逻辑
有两种方式实现,选其一即可:
方式一:自定义页面模板
- 在WordPress后台创建一个页面,标题设为「产品」,slug必须设为
products。 - 在主题目录下创建模板文件
page-products.php,写入自定义查询逻辑:
<?php /* Template Name: 产品列表页 */ get_header(); // 自定义tax查询,示例:显示分类slug为aromamasla的产品 $products_query = new WP_Query(array( 'post_type' => 'product', 'posts_per_page' => 12, 'tax_query' => array( array( 'taxonomy' => 'product_category', 'field' => 'slug', 'terms' => 'aromamasla' ) ) )); if ($products_query->have_posts()) : while ($products_query->have_posts()) : $products_query->the_post(); // 输出产品内容(按需调整) the_title('<h3 class="product-title">', '</h3>'); the_post_thumbnail('medium'); the_excerpt(); endwhile; wp_reset_postdata(); else : echo '<p>暂无产品</p>'; endif; get_footer();
- 回到后台编辑「产品」页面,在右侧「模板」选项中选择「产品列表页」,保存即可。
方式二:用钩子修改页面查询
如果不想单独创建模板,可通过pre_get_posts钩子修改/products页的主查询:
function modify_products_page_query($query) { if (!is_admin() && $query->is_main_query() && is_page('products')) { $query->set('post_type', 'product'); // 设置tax查询条件 $query->set('tax_query', array( array( 'taxonomy' => 'product_category', 'field' => 'slug', 'terms' => 'aromamasla' ) )); $query->set('posts_per_page', 12); } } add_action('pre_get_posts', 'modify_products_page_query');
步骤4:刷新固定链接规则
登录WordPress后台,进入「设置」→「固定链接」,直接点击「保存更改」(无需修改任何设置),这会刷新WordPress的URL重写规则,确保所有新URL结构生效。
验证结果
完成上述步骤后,三个URL将正常工作:
https://example.com/products→ 加载自定义的带tax查询的页面https://example.com/products/category/aromamasla/→ 加载product_category分类归档页(可通过taxonomy-product_category.php模板自定义样式)https://example.com/products/product-page/→ 加载自定义文章product的单页(可通过single-product.php模板自定义样式)
内容的提问来源于stack exchange,提问作者Александр Курлаев
相关产品推荐
相关产品推荐

