如何为WooCommerce自定义分类法Merk创建指定URL的归档页面?
解决WooCommerce自定义分类法Merk的归档与术语页面路径问题
1. 修正自定义分类法的注册代码
当前注册代码的rewrite参数未适配shop嵌套路径,需调整该部分以匹配需求URL结构:
$labels = array( 'name' => _x('Merk', 'taxonomy general name'), 'singular_name' => _x('Merk', 'taxonomy singular name'), 'search_items' => __('Search Merk'), // 补充其他所需标签 ); $args = array( 'hierarchical' => true, 'labels' => $labels, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'shop/merk', // 设置嵌套在shop路径下的slug 'with_front' => false, // 避免继承WordPress固定链接前缀 'hierarchical' => true // 支持层级术语(如merk/test/subtest) ), 'public' => true, 'publicly_queryable' => true, 'has_archive' => true ); register_taxonomy('merk', 'product', $args);
2. 刷新WordPress固定链接
修改rewrite参数后必须刷新规则才能生效:
- 进入WordPress后台 → 设置 → 固定链接
- 无需修改当前配置,直接点击「保存更改」完成规则刷新
3. 配置模板文件
单个术语页面(如shop/merk/test)
创建taxonomy-merk.php文件放入主题(或子主题)目录,该模板会自动匹配所有Merk术语的归档页面,示例代码如下(复用WooCommerce原生样式):
<?php get_header('shop'); do_action('woocommerce_before_main_content'); ?> <header class="woocommerce-products-header"> <?php if (apply_filters('woocommerce_show_page_title', true)) : ?> <h1 class="woocommerce-products-header__title page-title"><?php single_term_title(); ?></h1> <?php endif; ?> <?php do_action('woocommerce_archive_description'); ?> </header> <?php if (woocommerce_product_loop()) { do_action('woocommerce_before_shop_loop'); woocommerce_product_loop_start(); if (wc_get_loop_prop('total')) { while (have_posts()) { the_post(); do_action('woocommerce_shop_loop'); wc_get_template_part('content', 'product'); } } woocommerce_product_loop_end(); do_action('woocommerce_after_shop_loop'); } else { do_action('woocommerce_no_products_found'); } do_action('woocommerce_after_main_content'); do_action('woocommerce_sidebar'); get_footer('shop'); ?>
分类法总归档页面(shop/merk/)
WordPress默认不提供自定义分类法的总归档页面(展示所有Merk术语下的产品),可通过以下两种方式实现:
方法一:自定义页面模板
- 在主题目录创建
page-merk-archive.php,添加以下代码:
<?php /* Template Name: Merk 总归档 */ get_header('shop'); do_action('woocommerce_before_main_content'); ?> <header class="woocommerce-products-header"> <h1 class="woocommerce-products-header__title page-title">所有Merk产品</h1> </header> <?php // 自定义查询:获取所有属于Merk分类法的产品 $merk_query = new WP_Query(array( 'post_type' => 'product', 'posts_per_page' => wc_get_default_products_per_row() * wc_get_default_product_rows_per_page(), 'paged' => get_query_var('paged') ?: 1, 'tax_query' => array( array( 'taxonomy' => 'merk', 'operator' => 'EXISTS' // 匹配任意Merk术语下的产品 ) ) )); if ($merk_query->have_posts()) { do_action('woocommerce_before_shop_loop'); woocommerce_product_loop_start(); while ($merk_query->have_posts()) { $merk_query->the_post(); wc_get_template_part('content', 'product'); } woocommerce_product_loop_end(); woocommerce_pagination(array('total' => $merk_query->max_num_pages)); } else { do_action('woocommerce_no_products_found'); } wp_reset_postdata(); do_action('woocommerce_after_main_content'); do_action('woocommerce_sidebar'); get_footer('shop'); ?>
- 进入WordPress后台创建新页面,标题设为「Merk总归档」,页面属性选择「Merk 总归档」模板,发布后修改页面固定链接为
shop/merk。
方法二:通过Rewrite规则与查询修改实现(无需创建页面)
在主题的functions.php中添加以下代码:
// 添加Merk总归档的Rewrite规则 function add_merk_archive_rewrite() { add_rewrite_rule( '^shop/merk/?$', 'index.php?post_type=product&merk_archive=1', 'top' ); } add_action('init', 'add_merk_archive_rewrite'); // 注册自定义查询变量 function add_merk_archive_query_var($vars) { $vars[] = 'merk_archive'; return $vars; } add_filter('query_vars', 'add_merk_archive_query_var'); // 修改主查询,加载所有Merk产品 function modify_merk_archive_query($query) { if (!is_admin() && $query->is_main_query() && isset($query->query_vars['merk_archive'])) { $query->set('post_type', 'product'); $query->set('tax_query', array( array( 'taxonomy' => 'merk', 'operator' => 'EXISTS' ) )); $query->set('posts_per_page', wc_get_default_products_per_row() * wc_get_default_product_rows_per_page()); } } add_action('pre_get_posts', 'modify_merk_archive_query'); // 指定Merk总归档使用的模板 function set_merk_archive_template($template) { if (isset(get_query_var('merk_archive')) && get_query_var('merk_archive')) { $custom_template = locate_template(array('archive-merk.php')); return $custom_template ?: $template; } return $template; } add_filter('template_include', 'set_merk_archive_template');
之后创建archive-merk.php模板文件(可参考上面的页面模板代码),即可专门处理shop/merk/的展示内容。
内容的提问来源于stack exchange,提问作者Bhautik
相关产品推荐
相关产品推荐

