WooCommerce:在自定义产品循环中按分类ID筛选产品

WooCommerce:在自定义产品循环中按分类ID筛选产品

本文详细介绍了如何在WooCommerce自定义产品归档模板中,利用 wc_get_products 函数高效且兼容未来版本地按指定分类ID筛选并显示产品。通过替换传统的 WP_Query 循环,文章提供了完整的代码示例和参数解析,确保开发者能够灵活构建符合特定业务需求的自定义产品展示逻辑。

为什么选择 wc_get_products 而非 WP_Query

在woocommerce中构建自定义产品查询时,官方强烈推荐使用 wc_get_products 和 wc_product_query,而非传统的 wp_query 或直接的数据库查询。这是因为woocommerce未来可能会将产品数据迁移到自定义表中以提升性能,而 wc_get_products 提供了一个标准且安全的接口,能够确保代码的未来兼容性,避免因数据库结构变化导致代码失效。当我们需要在自定义模板中仅显示特定分类下的产品时,wc_get_products 是实现这一目标的最佳实践。

创建自定义 WooCommerce 产品归档模板

首先,为了实现自定义的产品展示逻辑,我们需要创建一个自定义的WooCommerce模板。

复制基础模板: 将 woocommerce/archive-product.php 文件复制到你的子主题的 woocommerce 文件夹中。

重命名并添加模板注释: 将复制的文件重命名为,例如 custom-category-archive.php。然后,在文件顶部添加模板注释,使其可以作为页面模板在WordPress后台选择:


通过这种方式,你可以在WordPress页面编辑界面中选择这个模板来展示特定内容。

构建按分类 ID 筛选的自定义产品循环

在 custom-category-archive.php 模板中,我们将替换或修改标准的WooCommerce产品循环,以使用 wc_get_products 来筛选特定分类的产品。

标准的WooCommerce产品循环通常如下所示:

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();}

要按分类ID筛选,我们将用 wc_get_products 构建一个全新的循环。以下是完整的代码示例,你可以在 custom-category-archive.php 文件中 get_header( ‘shop’ ); 之后,do_action( ‘woocommerce_before_main_content’ ); 之前或之后添加:

query->get_catalog_ordering_args();$ordering['orderby'] = array_shift( explode( ' ', $ordering['orderby'] ) );// 根据排序字段调整 orderby 参数,例如价格排序需要特殊处理$ordering['orderby'] = stristr( $ordering['orderby'], 'price' ) ? 'meta_value_num' : $ordering['orderby'];// 定义 wc_get_products 的查询参数$args = array(    'status'       => 'publish', // 只获取已发布的产品    'limit'        => -1,        // 获取所有匹配的产品,不限制数量    'paginate'     => true,      // 启用分页,方便获取总数    'return'       => 'ids',     // 只返回产品ID,减少内存消耗,提高性能    'orderby'      => $ordering['orderby'], // 继承WooCommerce的排序方式    'order'        => $ordering['order'],   // 继承WooCommerce的排序顺序    'tax_query'    => array(        array(            'taxonomy' => 'product_cat', // 针对产品分类            'field'    => 'term_id',     // 通过分类ID进行查询            'terms'    => array( 12, 345, 7899 ), // 指定要包含的分类ID,请替换为你的实际ID            'operator' => 'IN',          // 包含在指定ID列表中的分类        )    ),    // 其他可选参数,例如库存状态和可见性    // 'stock_status' => 'instock', // 只显示有库存的产品    // 'visibility'   => 'visible', // 只显示可见的产品);// 执行产品查询$cat_products = wc_get_products( $args );// 设置循环属性,确保WooCommerce的其他组件(如结果计数、分页)能正确工作wc_set_loop_prop( 'total', $cat_products->total );wc_set_loop_prop( 'total_pages', $cat_products->max_num_pages ); // 如果需要分页,设置总页数// 检查是否有产品if ( $cat_products && ! empty( $cat_products->products ) ) {    do_action( 'woocommerce_before_shop_loop' );    echo '
'; // 自定义容器,可根据需要修改 foreach ( $cat_products->products as $product_id ) { // 获取产品对象并设置全局 $post 变量 $post_object = get_post( $product_id ); setup_postdata( $GLOBALS['post'] =& $post_object ); // 获取产品实例,用于 wc_product_class $product = wc_get_product( $product_id ); // 渲染单个产品内容,利用WooCommerce的钩子和模板部分 echo '
'; do_action( 'woocommerce_before_shop_loop_item' ); // 产品循环项开始前的钩子 do_action( 'woocommerce_before_shop_loop_item_title' ); // 产品标题前的钩子 do_action( 'woocommerce_shop_loop_item_title' ); // 产品标题钩子 do_action( 'woocommerce_after_shop_loop_item_title' ); // 产品标题后的钩子 do_action( 'woocommerce_after_shop_loop_item' ); // 产品循环项结束后的钩子 echo '
'; } wp_reset_postdata(); // 重置全局 $post 变量,避免影响后续查询 echo '
'; // 结束自定义容器 do_action( 'woocommerce_after_shop_loop' );} else { // 如果没有找到产品 do_action( 'woocommerce_no_products_found' );}do_action( 'woocommerce_after_main_content' );get_footer( 'shop' );

关键参数解析与注意事项

wc_get_products($args) 参数:

status: 查询产品的状态,如 publish(已发布)。limit: 每页显示的产品数量。设置为 -1 表示不限制,获取所有匹配产品。paginate: 设置为 true 时,wc_get_products 会返回一个 WC_Product_Query 对象,其中包含 total(总产品数)和 max_num_pages(总页数),这对于正确显示分页和结果计数至关重要。return: 指定返回值的类型。设置为 ids 可以只返回产品ID数组,这在仅需遍历产品并渲染时能有效减少内存消耗。orderby 和 order: 用于控制产品排序。示例中继承了WooCommerce商店页面的默认排序设置。tax_query: 这是实现按分类筛选的核心。它是一个数组,每个元素定义一个分类法查询。taxonomy: 指定分类法的名称,对于产品分类,通常是 product_cat。field: 指定用于查询的分类字段,term_id 表示通过分类ID。terms: 一个数组,包含你希望包含(或排除)的分类ID。请注意,这里的ID应为整数,如 array(12, 345, 7899)。operator: 操作符,如 IN(包含在列表内)、NOT IN(不包含在列表内)等。

wc_set_loop_prop(‘total’, $cat_products->total);:这一行代码非常重要。它将自定义查询获取的产品总数传递给WooCommerce的全局循环属性。这样,woocommerce_result_count 等钩子函数才能正确显示“显示 x 到 y 共 z 个结果”这样的信息,并且分页功能也能基于正确的产品总数进行计算。

循环迭代与产品渲染:

foreach ( $cat_products->products as $product_id ): 遍历 wc_get_products 返回的产品ID。setup_postdata( $GLOBALS[‘post’] =& $post_object );: 这一步是关键!它将当前产品ID对应的 WP_Post 对象设置为全局 $post 变量,使得所有依赖于 $post 变量的WordPress和WooCommerce模板函数(如 the_title()、the_permalink()、wc_get_template_part() 等)都能正确获取到当前产品的数据。wp_reset_postdata();: 在循环结束后,务必调用此函数,以将全局 $post 变量恢复到主查询的状态,避免影响页面其他部分的查询。do_action(…): 利用WooCommerce提供的各种动作钩子,可以方便地在产品循环的各个阶段插入自定义内容或调用WooCommerce的默认渲染函数,如 wc_get_template_part( ‘content’, ‘product’ );(在自定义循环中,我们手动调用了多个子钩子来模拟 content-product.php 的渲染)。

获取分类ID:在示例中,分类ID是硬编码的 array( 12, 345, 7899 )。在实际应用中,这些ID可能需要动态获取,例如:

从URL参数获取。从自定义字段(如 ACF)获取。通过 get_term_by() 函数根据分类名称或 slug 获取 ID。

总结

通过 wc_get_products 函数,我们可以强大而灵活地控制WooCommerce产品循环,实现按分类ID筛选等复杂需求,同时保持与WooCommerce未来版本的兼容性。在构建自定义模板时,理解 wc_get_products 的参数、wc_set_loop_prop 的作用以及 setup_postdata/wp_reset_postdata 的必要性,将帮助你创建高效、健壮且易于维护的WooCommerce解决方案。始终优先使用官方推荐的 wc_get_products 接口,以确保你的代码在长期运行中的稳定性和性能。

以上就是WooCommerce:在自定义产品循环中按分类ID筛选产品的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1322497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
通过php递归函数解析嵌套评论_基于php递归函数实现评论层级
上一篇 2025年12月12日 08:38:48
php怎么安装_如何为PHP安装常用的扩展模块
下一篇 2025年12月12日 08:39:02

相关推荐

  • Linux系统信息查看命令整理

    答案:掌握Linux系统需从系统信息、资源使用、性能瓶颈、日志分析和用户权限五方面入手。uname、lscpu、free、df、ip、ss等命令用于查看系统软硬件状态;top、htop、vmstat、iostat、iftop等可诊断CPU、内存、磁盘、网络性能瓶颈;/var/log日志文件结合jou…

    2026年9月20日
    100
  • 灵绘AI如何生成艺术画_灵绘AI艺术画创作的完整流程

    首先启动灵绘AI并选择“艺术创作”模式,确保设备联网;接着在提示词框输入具体场景描述并添加风格关键词;然后调节细节等级至60%-80%、创意强度为7,并选择3:4或16:9比例;点击生成后预览结果,不满意可重新生成最多五次;对局部不满意区域使用“局部重绘”功能修改;最后导出时选择4K高清并保留图层信…

    2026年9月20日
    300
  • 怎么在VSCode里配置Go语言环境?

    安装Go并配置环境变量后,在VSCode中安装官方Go扩展,通过命令面板安装gopls、delve等必要工具,并设置保存时自动格式化与导入,即可实现代码补全、格式化和调试功能。 在 VSCode 中配置 Go 语言开发环境其实不复杂,只要安装好工具链并正确设置,就能获得代码补全、格式化、调试等完整功…

    2026年9月20日
    100
  • 事务(Transaction)处理与并发控制

    事务处理确保操作全部完成或不完成,并发控制防止事务互相干扰。事务处理核心是acid属性:1.原子性,2.一致性,3.隔离性,4.持久性;并发控制方法包括锁和mvcc,优化需考虑事务粒度、隔离级别、锁和mvcc的应用。 事务处理与并发控制是数据库管理系统中至关重要的两个概念,确保数据的一致性和完整性。…

    2026年9月20日
    100
  • Java从文本文件随机读取并打印指定行数内容

    本文旨在指导读者如何使用java程序从文本文件中高效地读取多组固定行数的内容(如诗歌),并随机选择其中一组进行打印。教程将详细介绍如何利用`files.readalllines`、`random`和`list.sublist`等核心api,实现文件的整体读取、随机索引的生成以及特定内容块的提取与输出…

    2026年9月20日
    100
  • edge浏览器”编写”功能(Copilot)怎么帮你润色文案_edge浏览器AI写作助手使用教程

    答案:通过Edge浏览器内置Copilot可实现文案润色。依次开启AI功能、登录账户,在文本框右键选择“使用Copilot改写”,可选正式、简短等语气风格,或通过侧边栏批量处理内容,提升写作效率。 如果您在撰写网页内容或文档时希望获得智能建议和语言优化,可以借助 Microsoft Edge 浏览器…

    2026年9月20日
    100
  • 新页软件合并下达生产计划

    新页软件合并下达生产计划新页软件合并下达生产计划新页软件合并下达生产计划新页软件合并下达生产计划

    同一规格的产成品在面向不同客户进行销售时,若每个客户的订单都独立生成生产计划,容易引发生产排程的重复与冲突。这不仅会造成设备、人力等资源的浪费,还会显著增加生产管理的复杂性,削弱生产过程中的统一调度能力,进而影响整体生产效率与计划执行的精准度。 1、 第一步:为提升系统操作的直观性和演示效果,可适当…

    2026年9月20日 用户投稿
    200
  • 小米Civi 3前置摄像头像素是多少 小米Civi 3自拍模式优化技巧

    小米Civi 3前置双3200万像素摄像头,配备78°f/2.0光圈主摄和100°超广角镜头,支持AF对焦与AI畸变矫正;通过切换镜头、开启4K拍摄、调节美颜、优化光线及启用EIS防抖,可显著提升自拍与Vlog画质表现。 小米Civi 3的前置摄像头配置在同级别中非常突出,自拍表现力强,配合一些使用…

    2026年9月20日
    100
  • 美篇如何添加背景音乐

    首先通过美篇内置音乐库或本地导入音频添加背景音乐,再调整自动播放与音量设置,确保阅读体验沉浸且不突兀。 如果您在编辑美篇文章时希望增加背景音乐以提升阅读体验,但不清楚具体操作步骤,可以按照以下方法进行设置。背景音乐能够为图文内容增添氛围,使读者获得更沉浸的浏览感受。 本文运行环境:iPad Air,…

    2026年9月20日
    100
  • PHP播放HLS视频流的方法_PHP播放HLS视频流方法

    答案:PHP通过权限控制和文件代理实现HLS流安全分发,前端使用HTML5视频标签和hls.js播放。具体描述:HLS将视频切为.ts片段并用.m3u8索引,PHP后端可校验用户权限、防止盗链,动态输出.m3u8或.ts内容;前端通过video标签加载stream.php?id=1,结合hls.js…

    2026年9月20日
    000
  • Java类的初始化顺序是怎样的 静态代码块和构造代码块先后

    Java类初始化顺序为:父类静态成员→子类静态成员→父类实例成员→父类构造函数→子类实例成员→子类构造函数,静态代码块仅加载时执行一次,构造代码块每次创建对象时执行,且均按书写顺序运行。 Java类的初始化顺序遵循一定的规则,理解这些顺序对掌握对象创建过程非常重要。当一个类被加载并创建实例时,各个代…

    2026年9月20日
    100
  • 淘宝收藏商品降价自动提醒怎么设置?如何收藏商品呢?淘宝收藏商品降价提醒这样设!1年能省3000+!手把手教你捡漏神操作!

    在淘宝琳琅满目的商品中,是否曾因价格偏高而犹豫下单?收藏并开启降价自动提醒功能,正是帮你抓住最佳入手时机的秘密武器。无论你是刚需采购,还是长期观望心仪好物,只需简单设置,系统便会在商品降价时通过淘宝消息中心、短信或app推送第一时间通知你,轻松实现“低价入手,省心又省钱”。 一、为什么你需要降价提醒…

    2026年9月20日
    100
  • 如何安装mysql GUI管理工具

    首选安装MySQL Workbench,Windows下载MSI安装,macOS拖拽DMG到应用,Linux用apt命令安装,也可选phpMyAdmin、DBeaver等工具。 安装 MySQL 图形化管理工具(GUI)可以让你更方便地操作数据库,比如建表、查询、备份等。最常用且官方推荐的工具是 M…

    2026年9月20日
    100
  • Java从文本文件随机读取多行连续内容的教程

    本教程旨在指导java开发者如何高效地从文本文件中随机读取并打印指定数量(例如5行)的连续内容,尤其适用于处理结构化文本块(如诗歌)。我们将探讨如何避免仅读取文件开头固定行数的局限,通过将文件内容一次性加载到内存并结合随机数生成器来精确选取所需的文本块,从而实现真正的随机性与灵活性。 引言与问题分析…

    2026年9月20日
    200
  • Workerman与WebAssembly(Wasm)的交互实践

    workerman和wasm结合使用是为了在高性能服务器环境中引入wasm的沙箱化和跨平台能力,实现更灵活、安全和高效的服务端应用。1) wasm模块的编译与加载:使用编译工具链将wasm模块编译成二进制文件并在workerman中加载。2) wasm模块的调用:通过php扩展或外部程序(如exec…

    2026年9月20日
    000
  • ChatGPT代码会出错吗_AI编程中5个常见错误及解决方法

    AI编程中常见错误包括语法不匹配、逻辑遗漏、API误用、安全漏洞和集成困难,需通过版本明确、测试验证、文档核对、安全扫描和上下文补充等方式解决,结合人工审查与测试才能确保代码质量。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ ChatGP…

    2026年9月20日
    100
  • 或为《刺客信条:起源》相关!巴耶克与艾雅动捕同框

    面容虽被遮挡,但魅力依旧啊!AI 伴学 + 轻薄便携,联想小新平板 12.1,开售啦! 帅是帅,就是比较废指头 FK阿凯 1.4万 0 《刺客信条:起源》的粉丝们近日惊喜地发现,曾为巴耶克与艾雅配音并进行面部捕捉的演员——阿布巴卡尔·萨利姆(Abubakar Salim)与艾莉克斯·威尔顿·里根(A…

    2026年9月20日
    000
  • RBAC(基于角色的权限控制)实现方案

    rbac重要,因为它通过角色管理权限,简化了权限管理,提高了系统安全和管理效率。实现rbac时:1.设计数据库结构,定义用户、角色、权限表及中间表;2.在代码中实现权限检查和角色、权限的动态管理;3.优化性能,防止权限泄露,管理角色膨胀。 在探讨RBAC(基于角色的权限控制)实现方案之前,让我们先来…

    2026年9月20日
    000
  • windows怎么启用tpm_Windows TPM安全模块启用教程

    首先确认BIOS/UEFI中TPM是否启用,再通过Windows设置或tpm.msc初始化,最后用组策略确保服务运行,完整顺序为:1. BIOS开启TPM;2. Windows设置初始化;3. tpm.msc配置;4. 组策略启用相关服务。 如果您尝试在Windows系统中启用TPM安全模块,但发现…

    2026年9月20日
    000
  • 腾讯元宝AI便捷体验入口 腾讯元宝网页版在线入口

    腾讯元宝AI便捷体验入口为https://yuanbao.tencent.com,支持网页版、手机APP及微信小程序访问,提供智能问答、文档解析、内容生成等多功能服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 腾讯元宝AI便捷体验入口…

    2026年9月20日
    000

发表回复

登录后才能评论
关注微信