
本文将指导您如何在 WooCommerce 自定义模板中,使用 wc_get_products 函数而非传统的 WP_Query,高效且未来兼容地按指定产品分类 ID 筛选并显示产品。文章将提供详细的步骤和代码示例,帮助开发者构建一个灵活的产品展示页面,确保您的自定义产品列表功能强大且易于维护。
理解需求:自定义产品分类显示
在构建复杂的 woocommerce 商店时,开发者经常需要创建自定义页面来展示特定分类下的产品。例如,您可能希望在一个特殊的“特价商品”页面中,只显示特定几个产品分类(如“电子产品”和“服装”)中的商品。传统上,许多开发者会倾向于使用 wp_query 来实现这一目标。然而,对于 woocommerce 产品,官方推荐使用 wc_get_products 函数,因为它提供了更好的兼容性和性能优化。
为何选择 wc_get_products?
wc_get_products 和 WC_Product_Query 提供了一种标准化的方式来检索产品,这种方式安全且不会因未来 WooCommerce 数据库结构的变化而中断。随着 WooCommerce 数据逐渐向自定义表迁移以提升性能,直接构建 WP_Query 或数据库查询很可能会在未来的 WooCommerce 版本中导致代码失效。因此,采用 wc_get_products 是一个更具前瞻性和稳健性的选择。
设置自定义产品存档模板
首先,您需要在子主题中创建一个自定义的 WooCommerce 模板文件。
将 woocommerce/archive-product.php 文件复制到您的子主题的 woocommerce 文件夹中。
将其重命名为 custom-category-archive.php(或其他您喜欢的名称)。
在该文件的顶部添加以下模板头,以便在 WordPress 页面编辑器中选择它作为页面模板:
在 WordPress 后台创建一个新页面,并在页面属性中选择“Custom Category Archive Template”作为模板。
构建 wc_get_products 查询
现在,我们将在 custom-category-archive.php 文件中替换默认的 WooCommerce 产品循环,使用 wc_get_products 来筛选产品。
wc_get_products 函数接受一个包含查询参数的数组,类似于 WP_Query 的 $args。要按产品分类 ID 筛选,我们需要使用 tax_query 参数。
以下是一个基本的 wc_get_products 查询示例,用于获取指定分类 ID(例如 123, 45, 6789)下的所有产品:
query->get_catalog_ordering_args();$ordering['orderby'] = array_shift( explode( ' ', $ordering['orderby'] ) );$ordering['orderby'] = stristr( $ordering['orderby'], 'price' ) ? 'meta_value_num' : $ordering['orderby'];// 构建 wc_get_products 查询参数$args = array( 'stock_status' => 'instock', // 只显示有库存的产品 'visibility' => 'visible', // 只显示可见产品 'status' => 'publish', // 只显示已发布产品 'limit' => -1, // 显示所有产品,不分页 'paginate' => true, // 启用分页(即使 limit 为 -1,也建议设置为 true,以便获取总数) 'return' => 'ids', // 只返回产品 ID 'orderby' => $ordering['orderby'], // 使用商店默认排序方式 'order' => $ordering['order'], // 使用商店默认排序顺序 'tax_query' => array( array( 'taxonomy' => 'product_cat', // 分类法为产品分类 'field' => 'term_id', // 根据分类 ID 筛选 'terms' => array( 123, 45, 6789 ), // 指定要包含的产品分类 ID 数组 'operator' => 'IN', // 包含在指定 ID 列表中的分类 ) ));// 执行查询$cat_products = wc_get_products( $args );// 设置 WooCommerce 循环属性,以便其他函数(如分页)可以访问总数wc_set_loop_prop( 'total', $cat_products->total );?>
参数解释:
stock_status: instock 表示只查询有库存的产品。visibility: visible 表示只查询在商店和搜索结果中可见的产品。status: publish 表示只查询已发布的产品。limit: -1 表示不限制产品数量。如果需要分页,可以设置为每页显示的数量。paginate: true 表示启用分页。当 return 为 ids 或 objects 时,这将返回一个 WC_Product_Query 对象,其中包含 total 属性。return: ids 表示只返回匹配产品的 ID 数组。这有助于减少内存消耗。orderby 和 order: 用于设置产品的排序方式,这里使用了 WooCommerce 商店的默认排序设置。tax_query: 这是关键参数,用于根据分类法进行筛选。taxonomy: product_cat 指定要查询的产品分类法。field: term_id 指定根据分类的 ID 进行匹配。terms: array( 123, 45, 6789 ) 是一个包含您希望显示的产品分类 ID 的数组。请替换为您的实际分类 ID。operator: IN 表示产品必须属于 terms 数组中的任何一个分类。
实现自定义产品循环
获取到产品 ID 列表后,我们需要遍历这些 ID,并使用 WooCommerce 的标准钩子来显示每个产品。
将以下代码整合到您的 custom-category-archive.php 文件中,替换掉原有的 while ( have_posts() ) 循环部分:
products ) : ?> <div id="container" class="products columns-"> products as $product_id ) : ?> <div >
微信扫一扫
支付宝扫一扫