0

0

WooCommerce 产品自动分类:根据商品创建日期动态管理“新品”标签

碧海醫心

碧海醫心

发布时间:2025-07-07 21:32:21

|

341人浏览过

|

来源于php中文网

原创

WooCommerce 产品自动分类:根据商品创建日期动态管理“新品”标签

本教程详细介绍了如何在WooCommerce中实现产品自动分类功能,根据商品的创建日期将其动态地归类到“新品”类别,并在指定天数(例如60天)后自动移除。文章将提供完整的PHP代码示例,并指导如何将其集成到WordPress环境中,同时探讨性能考量及最佳实践,帮助您高效管理商品生命周期。

概述

在电子商务网站中,动态展示“新品”是吸引顾客、提升销量的有效策略。然而,手动管理商品的“新品”状态既耗时又容易出错。本教程旨在提供一个自动化解决方案,通过编写自定义php代码,让woocommerce能够根据商品的创建日期自动将其添加到特定的“新品”分类,并在达到设定的时间限制后(例如60天)自动从该分类中移除。

实现原理

该功能的实现主要依赖于以下几个核心步骤:

  1. 获取所有产品: 遍历WooCommerce中的所有产品。
  2. 计算产品年龄: 获取每个产品的创建日期,并与当前日期进行比较,计算出产品发布至今的天数。
  3. 条件判断与分类操作: 根据计算出的天数,判断产品是否满足“新品”条件。如果满足,则将其添加到预设的“新品”分类;如果超过时间限制,则从该分类中移除。
  4. 集成到WordPress: 将上述逻辑封装成一个函数,并挂载到WordPress的特定动作钩子(init)上,确保在每次页面加载时执行。

详细实现步骤与代码

以下是实现此功能的完整代码和详细说明。建议将此代码添加到您当前活动主题的 functions.php 文件中,或者更好地,封装到一个自定义插件中。

1. 获取所有产品

首先,我们需要使用WP_Query来获取WooCommerce中的所有产品。WP_Query是WordPress查询文章(包括自定义文章类型如产品)的标准方式。

$args = array(
    'post_type'      => 'product',      // 指定文章类型为产品
    'posts_per_page' => -1              // 获取所有产品,不限制数量
);

$products = new WP_Query( $args );

if ( $products->have_posts() ) {
    while ( $products->have_posts() ) {
        $products->the_post();
        // 在这里处理每个产品
    }
    wp_reset_postdata(); // 恢复全局文章数据
}

2. 计算产品年龄

获取产品创建日期并计算与当前日期的天数差是关键一步。WooCommerce提供了WC_Product对象,通过get_date_created()方法可以获取产品的创建日期。为了准确计算,我们需要处理时区并确保日期对象的一致性。

$product  = wc_get_product( get_the_ID() ); // 获取当前循环中的产品对象
$datetime = $product->get_date_created();   // 获取产品创建日期 (WC_DateTime 对象)

if ( $datetime ) { // 确保日期对象存在
    $timezone = $datetime->getTimezone(); // 获取产品创建日期所在的时区
    $now_time = new WC_DateTime();        // 创建当前时间的 WC_DateTime 对象

    $now_time->setTimezone($timezone);    // 将当前时间对象设置为与产品创建日期相同的时区

    // 计算时间戳差值(秒)
    $timestamp_diff = $now_time->getTimestamp() - $datetime->getTimestamp();

    // 将秒数差值转换为天数
    // 这里使用一个辅助函数 timestamp_to_array 来获取天数
    $data = timestamp_to_array( $timestamp_diff );
    $days = (int)$data['d']; // 确保天数是整数类型
} else {
    $days = 9999; // 如果没有创建日期,则默认设置为一个大值,确保不被视为新品
}

这里我们引入了一个辅助函数 timestamp_to_array 来将秒数差值转换为天、小时、分钟和秒的数组。虽然我们只需要天数,但这个函数提供了一个完整的转换示例。

零沫AI工具导航
零沫AI工具导航

零沫AI工具导航-AI导航新标杆,探索全球实用AI工具

下载
/**
 * 将时间戳差值转换为天、小时、分钟、秒的数组
 *
 * @param int $timestamp 时间戳差值(秒)
 * @return array 包含 'd', 'h', 'm', 's' 的数组
 */
function timestamp_to_array( $timestamp ) {
    $d = floor($timestamp/86400);
    $_d = ($d < 10 ? '0' : '').$d; // 格式化为两位数字符串

    $h = floor(($timestamp-$d*86400)/3600);
    $_h = ($h < 10 ? '0' : '').$h;

    $m = floor(($timestamp-($d*86400+$h*3600))/60);
    $_m = ($m < 10 ? '0' : '').$m;

    $s = $timestamp-($d*86400+$h*3600+$m*60);
    $_s = ($s < 10 ? '0' : '').$s;

    return array('d' => $_d, 'h' => $_h, 'm' => $_m, 's' => $_s);
}

3. 应用/移除分类

根据计算出的天数,我们使用wp_set_object_terms和wp_remove_object_terms函数来管理产品的分类。

  • wp_set_object_terms( $object_id, $terms, $taxonomy, $append ): 用于设置或添加对象的分类术语。
    • $object_id: 产品ID。
    • $terms: 要添加的分类ID或分类名称(这里使用分类ID 40)。
    • $taxonomy: 分类法名称(产品分类是product_cat)。
    • $append: 如果为true,则将新术语添加到现有术语中;如果为false,则替换现有术语。这里我们设置为true以仅添加“新品”分类而不影响其他分类。
  • wp_remove_object_terms( $object_id, $terms, $taxonomy ): 用于移除对象的分类术语。
$new_in_category_id = 40; // 请替换为您的“新品”分类ID

if ( $days < 60 ) { // 如果天数小于60,则认为是新品
    // 将产品添加到“新品”分类,并保留现有分类
    wp_set_object_terms( get_the_ID(), $new_in_category_id, 'product_cat', true );
} else {
    // 如果天数大于等于60,则从“新品”分类中移除
    wp_remove_object_terms( get_the_ID(), $new_in_category_id, 'product_cat' );
}

如何找到您的“新品”分类ID:

  1. 登录WordPress后台。
  2. 导航到 产品 > 分类。
  3. 鼠标悬停在您想要作为“新品”的分类名称上,浏览器左下角会显示一个链接,其中包含 tag_ID= 参数,例如 ...&tag_ID=40&...。这里的数字(例如40)就是该分类的ID。

4. 整合代码并挂载到动作钩子

将上述所有逻辑封装在一个函数中,并将其挂载到WordPress的init动作钩子上。init钩子在WordPress核心加载完毕后、用户请求被路由之前触发,是执行此类全局操作的理想时机。

/**
 * 根据产品创建日期自动设置/移除“新品”分类
 */
function add_category_to_product_for_certain_days(){
    $new_in_category_id = 40; // <-- 请将此ID替换为您的“新品”分类ID

    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1 // 获取所有产品
    );

    $products = new WP_Query( $args );

    if ( $products->have_posts() ) {
        while ( $products->have_posts() ) {
            $products->the_post();

            $product  = wc_get_product( get_the_ID() );
            $datetime = $product->get_date_created();

            if ( $datetime ) {
                $timezone = $datetime->getTimezone();
                $now_time = new WC_DateTime();
                $now_time->setTimezone($timezone);

                $timestamp_diff = $now_time->getTimestamp() - $datetime->getTimestamp();
                $data           = timestamp_to_array( $timestamp_diff );
                $days           = (int)$data['d']; // 确保天数是整数
            } else {
                $days = 9999; // 如果没有创建日期,则设置为一个大值,确保不被视为新品
            }

            // 根据天数判断并设置/移除分类
            if ( $days < 60 ) { // 60天内视为新品
                wp_set_object_terms( get_the_ID(), $new_in_category_id, 'product_cat', true );
            } else {
                wp_remove_object_terms( get_the_ID(), $new_in_category_id, 'product_cat' );
            }
        }
        wp_reset_postdata(); // 恢复全局文章数据
    }
}

// 挂载函数到 'init' 动作钩子
add_action( 'init', 'add_category_to_product_for_certain_days', 10, 0 );

/**
 * 辅助函数:将时间戳差值转换为天、小时、分钟、秒的数组
 * (此函数应与主函数放在同一文件中)
 *
 * @param int $timestamp 时间戳差值(秒)
 * @return array 包含 'd', 'h', 'm', 's' 的数组
 */
function timestamp_to_array( $timestamp ) {
    $d = floor($timestamp/86400);
    $_d = ($d < 10 ? '0' : '').$d;

    $h = floor(($timestamp-($d*86400)/3600));
    $_h = ($h < 10 ? '0' : '').$h;

    $m = floor(($timestamp-($d*86400+$h*3600))/60);
    $_m = ($m < 10 ? '0' : '').$m;

    $s = $timestamp-($d*86400+$h*3600+$m*60);
    $_s = ($s < 10 ? '0' : '').$s;

    return array('d' => $_d, 'h' => $_h, 'm' => $_m, 's' => $_s);
}

注意事项与最佳实践

  1. 分类ID: 务必将代码中的 40 替换为您实际的“新品”分类ID。
  2. 代码位置: 建议将此代码放置在子主题的 functions.php 文件中,以防止主题更新时代码被覆盖。对于更复杂的项目,可以考虑创建一个自定义插件。
  3. 性能考量:
    • 将此功能挂载到 init 钩子上意味着每次页面加载时都会执行此逻辑。对于拥有大量产品(例如数千个)的网站,这可能会导致显著的性能开销,增加页面加载时间。
    • 优化建议: 对于大型商店,强烈建议使用WordPress的Cron Job(定时任务)来替代 init 钩子。例如,可以设置一个每日或每小时运行的定时任务来执行此产品分类更新,而不是在每次用户访问时都执行。这样可以显著减轻服务器负载。
      • 要实现定时任务,您可以使用 wp_schedule_event() 和 wp_unschedule_event() 函数。
  4. 调试: 在生产环境中使用前,务必在开发或测试环境中充分测试此功能。
  5. 数据准确性: 确保您的产品创建日期数据是准确的,因为所有逻辑都基于此。

总结

通过上述代码和步骤,您可以为WooCommerce商店实现一个高效的自动化“新品”分类管理系统。这不仅能节省手动操作的时间,还能确保“新品”展示的准确性和及时性,从而提升用户体验和销售转化率。在实施时,请务必根据您的商店规模和性能需求,选择最合适的执行频率和方式(例如 init 钩子或定时任务)。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

349

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1080

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

186

2025.09.12

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

67

2025.12.13

wordpress seo
wordpress seo

WordPress网站SEO优化方法有:1、选择一个SEO友好的主题,具有清晰的代码结构,快速的加载速度和响应式设计;2、使用SEO插件,优化你的标题标签,元描述,关键字,XML站点地图等;3、优化你的内容,内容是SEO优化的核心;4、优化你的网站速度;5、创建友好的URL;6、使用内部链接;7、优化图像;8、使用社交媒体;9、定期更新你的网站;10、监控和分析你的网站等等。

435

2023.09.18

wordpress下载后怎么安装
wordpress下载后怎么安装

安装前准备:确保服务器满足要求、获取安装文件、创建数据库。上传 wordpress 文件。创建数据库和用户。运行安装程序:选择语言、输入数据库信息、网站标题和管理员信息。安装 wordpress。安装后配置:设置永久链接、安装主题、安装插件、创建内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.04.15

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

136

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

47

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十三期_前端开发
第二十三期_前端开发

共98课时 | 8.4万人学习

WordPress视频教程
WordPress视频教程

共23课时 | 9.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号