0

0

WooCommerce产品页面的跨类别商品展示教程

碧海醫心

碧海醫心

发布时间:2025-11-28 12:27:21

|

437人浏览过

|

来源于php中文网

原创

WooCommerce产品页面的跨类别商品展示教程

本教程旨在详细指导如何在woocommerce产品页面上展示来自非当前产品所属类别的商品,以实现高级的交叉销售功能。文章将介绍两种策略:首先是排除直接关联的商品类别,其次是更复杂的、排除整个类别树(包括父类、子类及兄弟类)的实现方法,并提供相应的代码示例和最佳实践。

在电子商务运营中,智能地推荐相关商品是提升用户体验和销售额的关键策略之一。WooCommerce提供了多种内置的推荐机制,但有时我们需要更精细的控制,例如在某个商品页面上展示与当前商品完全不属于同一类别层级的商品,以实现更具创新性的交叉销售(Cross-selling)。本文将深入探讨如何通过自定义查询来实现这一目标,并提供两种不同粒度的类别排除策略。

1. 核心需求分析:跨类别商品推荐

我们的目标是:当用户访问一个特定商品(例如属于 cat_1_1 类别)的页面时,系统能够推荐来自其他不相关类别的商品。这意味着我们需要排除以下情况的商品:

  • 直接属于 cat_1_1 的商品。
  • 更进一步,如果希望排除整个类别分支,则需要排除 cat_1(父类别)、cat_1_1(当前类别)和 cat_1_2(兄弟类别)下的所有商品。

这要求我们首先识别当前商品的所属类别,然后构建一个数据库查询,明确排除这些类别下的商品。

2. 策略一:排除直接关联的商品类别

最直接的实现方式是获取当前商品所关联的所有类别ID,然后在查询其他商品时,将这些ID排除在外。这种方法适用于只需要排除当前商品直接所属类别的情况。

2.1 获取当前商品的类别ID

首先,在WooCommerce产品页面上下文中,我们需要获取当前商品的ID,并进而获取其所有关联的商品类别。

global $post; // 确保在WooCommerce产品循环或相关钩子中使用
$product_id = $post->ID; // 获取当前产品ID

$excluded_category_ids = array(); // 用于存储需要排除的类别ID

// 获取当前产品的所有商品类别
$terms = get_the_terms( $product_id, 'product_cat' );

if ( $terms && ! is_wp_error( $terms ) ) {
    foreach ( $terms as $term ) {
        $excluded_category_ids[] = $term->term_id; // 将类别ID添加到排除列表中
    }
}

2.2 构建WP_Query进行商品查询

获取到需要排除的类别ID数组后,我们可以使用 WP_Query 结合 tax_query 参数来构建查询,实现类别排除。

Shoping购物网源码
Shoping购物网源码

该系统采用多层模式开发,这个网站主要展示女装的经营,更易于网站的扩展和后期的维护,同时也根据常用的SQL注入手段做出相应的防御以提高网站的安全性,本网站实现了购物车,产品订单管理,产品展示,等等,后台实现了动态权限的管理,客户管理,订单管理以及商品管理等等,前台页面设计精致,后台便于操作等。实现了无限子类的添加,实现了动态权限的管理,支持一下一个人做的辛苦

下载
// 构建WP_Query参数
$args = array(
    'post_type'      => 'product',           // 查询商品类型
    'posts_per_page' => 5,                   // 显示5个商品
    'post__not_in'   => array( $product_id ), // 排除当前正在查看的商品本身
    'tax_query'      => array(              // 税分类查询
        array(
            'taxonomy' => 'product_cat',    // 针对商品类别分类法
            'field'    => 'term_id',        // 使用term_id进行匹配
            'terms'    => $excluded_category_ids, // 需要排除的类别ID数组
            'operator' => 'NOT IN'          // 运算符:不包含在指定ID中
        ),
    ),
    'orderby'        => 'rand',              // 随机排序,增加推荐的多样性
);

// 执行查询
$cross_sell_products = new WP_Query( $args );

// 检查是否有符合条件的商品
if ( $cross_sell_products->have_posts() ) :
    echo '

您可能还喜欢

'; echo '
    '; while ( $cross_sell_products->have_posts() ) : $cross_sell_products->the_post(); // 在这里输出商品的HTML结构,例如: ?>
  • '; endif; // 重置查询,恢复主循环的数据 wp_reset_postdata();

3. 策略二:排除整个类别层级分支

如果需求是排除当前商品所属类别 及其所有父类、子类和兄弟类,那么仅仅排除直接关联的类别是不够的。我们需要更复杂的逻辑来识别整个类别分支。

例如,如果产品属于 cat_1_1,我们可能希望排除 cat_1、cat_1_1 和 cat_1_2 下的所有产品。这要求我们首先找到当前类别的顶层父类别,然后获取该顶层父类别下的所有子类别(包括其自身)。

3.1 识别并收集整个类别分支的ID

global $post;
$product_id = $post->ID;
$excluded_category_ids = array();

// 获取当前产品的所有直接关联类别
$terms = get_the_terms( $product_id, 'product_cat' );

if ( $terms && ! is_wp_error( $terms ) ) {
    foreach ( $terms as $term ) {
        // 1. 将当前类别ID添加到排除列表
        $excluded_category_ids[] = $term->term_id;

        // 2. 找到当前类别的所有祖先类别
        $ancestors = get_ancestors( $term->term_id, 'product_cat', 'taxonomy' );

        // 3. 确定顶层父类别ID (如果没有祖先,则当前类别就是顶层)
        $top_level_parent_id = empty( $ancestors ) ? $term->term_id : end( $ancestors );

        // 4. 将顶层父类别本身添加到排除列表 (如果尚未添加)
        if ( ! in_array( $top_level_parent_id, $excluded_category_ids ) ) {
            $excluded_category_ids[] = $top_level_parent_id;
        }

        // 5. 获取顶层父类别下的所有子类别 (包括所有层级)
        $all_descendants = get_terms( array(
            'taxonomy'   => 'product_cat',
            'child_of'   => $top_level_parent_id,
            'fields'     => 'ids',
            'hide_empty' => false, // 即使类别下没有商品也获取其ID
        ) );

        // 6. 将所有子类别ID合并到排除列表
        $excluded_category_ids = array_merge( $excluded_category_ids, $all_descendants );
    }
}

// 确保排除列表中没有重复的ID
$excluded_category_ids = array_unique( $excluded_category_ids );

// 此时,$excluded_category_ids 包含了当前产品所属类别及其整个父分支下的所有类别ID。

3.2 使用WP_Query进行高级排除查询

收集到所有需要排除的类别ID后,查询方法与策略一类似,只是 terms 数组包含了更广泛的ID。

// 构建WP_Query参数
$args = array(
    'post_type'      => 'product',
    'posts_per_page' => 5,
    'post__not_in'   => array( $product_id ), // 排除当前商品
    'tax_query'      => array(
        array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => $excluded_category_ids, // 使用包含整个分支的排除列表
            'operator' => 'NOT IN'
        ),
    ),
    'orderby'        => 'rand',
);

// 执行查询和展示 (与策略一相同)
$cross_sell_products = new WP_Query( $args );

if ( $cross_sell_products->have_posts() ) :
    echo '

您可能还喜欢

'; echo '
    '; while ( $cross_sell_products->have_posts() ) : $cross_sell_products->the_post(); ?>
  • '; endif; wp_reset_postdata();

4. 实施注意事项与最佳实践

  • 代码放置位置: 这些代码通常放置在主题的 functions.php 文件中,或者创建一个自定义插件来管理。建议封装成一个函数,并通过WooCommerce的特定钩子(例如 woocommerce_after_single_product_summary 或 woocommerce_after_single_product)来调用。
  • 性能优化:
    • WP_Query 操作可能涉及数据库查询,如果页面访问量大,考虑使用WordPress的转瞬缓存(Transients API)来缓存查询结果,减少数据库负载。
    • 限制 posts_per_page 的数量,避免一次性加载过多商品。
  • 用户体验: 推荐商品的数量应适中,过多可能分散用户注意力。
  • 排除当前商品: 务必使用 post__not_in 参数排除当前正在查看的商品本身,避免自我推荐。
  • 样式定制: 上述代码只提供了基本的HTML结构,您需要根据主题的CSS来美化推荐商品的显示样式。
  • 错误处理: 在实际生产环境中,应对 get_the_terms 可能返回 WP_Error 的情况进行处理。

总结

通过本文介绍的两种策略,您可以灵活地在WooCommerce产品页面上实现基于类别排除的交叉销售推荐。无论是简单的排除直接关联类别,还是复杂的排除整个类别层级分支,核心都是利用 get_the_terms() 获取当前商品的类别信息,并结合 WP_Query 的 tax_query 和 NOT IN 运算符来精确控制推荐商品的来源。合理运用这些技术,将有助于您构建更智能、更有效的商品推荐系统,从而提升店铺的销售表现。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2580

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1617

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1504

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1417

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1447

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

2

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 19.3万人学习

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

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