0

0

WooCommerce产品页交叉推广:排除特定分类商品展示

碧海醫心

碧海醫心

发布时间:2025-11-30 12:12:07

|

967人浏览过

|

来源于php中文网

原创

WooCommerce产品页交叉推广:排除特定分类商品展示

本教程详细介绍了如何在woocommerce产品页面实现交叉销售功能,通过排除当前产品所属的分类及其相关分类,展示来自其他分类的商品。文章将指导您如何利用`wp_query`和`tax_query`构建精确的查询,获取并展示不同类别的推荐商品,同时提供代码示例、高级优化策略和注意事项,帮助您提升用户体验和转化率。

在电子商务运营中,有效地引导用户发现更多相关或互补的产品是提升销售额的关键策略之一。WooCommerce提供强大的产品管理功能,但有时我们需要更精细地控制产品推荐逻辑,例如在某个产品页面,我们希望展示那些与当前产品不属于同一分类树的商品,以实现真正的“交叉销售”或“发现新商品”的目的。

本教程将详细讲解如何通过编程方式,在WooCommerce产品详情页实现这一目标:获取当前产品的所有分类,然后构建一个查询,排除这些分类下的产品,最终展示来自其他分类的推荐商品。

核心原理

实现这一功能主要依赖于WordPress和WooCommerce的以下核心机制:

  1. get_the_terms(): 用于获取当前文章(在此处是产品)所属的所有指定分类法(product_cat)的术语(term)。
  2. WP_Query: WordPress用于查询文章和自定义文章类型(包括WooCommerce产品)的主要类。
  3. tax_query: WP_Query的一个参数,允许我们根据分类法进行复杂的查询,包括排除特定分类。
  4. operator => 'NOT IN': 在tax_query中,这个操作符用于指定查询结果不包含特定分类ID下的文章。

实现步骤与代码示例

以下是实现该功能的详细步骤和相应的代码示例。这段代码通常放置在您主题的functions.php文件或自定义插件中。

/**
 * 在WooCommerce产品页显示来自其他分类的交叉销售产品
 */
function display_cross_sell_products_from_other_categories() {
    // 确保当前是WooCommerce产品详情页
    if ( ! is_product() ) {
        return;
    }

    global $post; // 获取当前产品对象
    $current_product_id = $post->ID;

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

    // 1. 获取当前产品所属的所有分类
    $terms = get_the_terms( $current_product_id, 'product_cat' );

    if ( $terms && ! is_wp_error( $terms ) ) {
        foreach ( $terms as $term ) {
            $excluded_term_ids[] = $term->term_id; // 将当前产品直接所属分类ID添加到排除数组

            // 2. 进一步获取父级分类及其所有子级分类的ID
            // 这一步旨在排除当前分类的整个分类树,实现更全面的交叉销售
            // 例如:如果产品属于 cat_1_1,则排除 cat_1, cat_1_1, cat_1_2 等
            if ( $term->parent > 0 ) {
                // 获取直接父级分类
                $parent_term = get_term( $term->parent, 'product_cat' );
                if ( $parent_term && ! is_wp_error( $parent_term ) ) {
                    $excluded_term_ids[] = $parent_term->term_id; // 添加父级分类ID

                    // 获取父级分类的所有子级(包括当前分类的兄弟分类及其子级)
                    $siblings_and_children = get_terms( array(
                        'taxonomy'   => 'product_cat',
                        'parent'     => $parent_term->term_id,
                        'fields'     => 'ids',
                        'hide_empty' => false, // 即使分类下没有产品也获取其ID
                    ) );
                    if ( ! empty( $siblings_and_children ) ) {
                        $excluded_term_ids = array_merge( $excluded_term_ids, $siblings_and_children );
                    }
                }
            }
        }
        // 确保排除的分类ID是唯一的,避免重复
        $excluded_term_ids = array_unique( $excluded_term_ids );
    }

    // 3. 构建 WP_Query 参数,排除上述分类,并随机显示5个产品
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => 5, // 显示5个产品
        'orderby'        => 'rand', // 随机排序
        'post__not_in'   => array( $current_product_id ), // 确保不显示当前产品本身
        'tax_query'      => array(
            array(
                'taxonomy' => 'product_cat',
                'field'    => 'term_id',
                'terms'    => $excluded_term_ids,
                'operator' => 'NOT IN' // 排除包含这些分类的产品
            ),
        ),
        // 确保只查询有库存且可见的产品
        'meta_query'     => array(
            'relation' => 'AND',
            array(
                'key'     => '_stock_status',
                'value'   => 'instock',
                'compare' => '=',
            ),
        ),
        'tax_query'      => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'product_visibility',
                'field'    => 'name',
                'terms'    => array('exclude-from-catalog', 'exclude-from-search'),
                'operator' => 'NOT IN',
            ),
            array(
                'taxonomy' => 'product_cat',
                'field'    => 'term_id',
                'terms'    => $excluded_term_ids,
                'operator' => 'NOT IN'
            ),
        ),
    );

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

    // 4. 显示产品
    if ( $cross_sell_products_query->have_posts() ) :
        echo '
'; echo '

您可能还喜欢

'; echo '
    '; // 使用WooCommerce的默认产品列表结构 while ( $cross_sell_products_query->have_posts() ) : $cross_sell_products_query->the_post(); // 使用WooCommerce的模板部分来渲染每个产品,确保样式一致 wc_get_template_part( 'content', 'product' ); endwhile; echo '
'; echo '
'; endif; // 5. 重置查询数据,避免影响后续的主循环 wp_reset_postdata(); } // 将函数挂载到WooCommerce产品页面的适当钩子 // 例如,在产品摘要下方或相关产品上方 add_action( 'woocommerce_after_single_product_summary', 'display_cross_sell_products_from_other_categories', 25 ); // 或者 add_action( 'woocommerce_after_single_product', 'display_cross_sell_products_from_other_categories', 10 );

代码解析与进阶考量

  1. 获取排除分类ID:

    • 代码首先获取当前产品直接所属的所有分类ID。
    • 为了实现更全面的“排除整个分类树”的需求,我们进一步迭代这些分类,获取它们的直接父级分类,以及该父级分类下的所有子级分类(包括当前分类的兄弟分类)。这样,任何属于当前产品分类树的商品都将被排除。
    • array_unique() 用于确保所有收集到的分类ID都是唯一的,避免冗余。
  2. WP_Query 参数配置:

    绵阳网上手机销售中心销售系统
    绵阳网上手机销售中心销售系统

    功能介绍:1.网站前台功能:产品二级分类展示:一级分类--二级分类--产品列表--详细介绍(名称,图片,市场价,会员价,是否推荐,功能介绍等)产品搜索:关键字模糊搜索定购产品:选择商品--确认定购--填写收货人信息--选择付款方式--订单号自动生成(限登录用户)用户管理:修改资料 订单查看 查看购物车(限登录用户)网站新闻:按时间先后顺序排列2.网站后台功能:商品管理:添加 删除 修改 图片上传订

    下载
    • post_type => 'product': 指定查询WooCommerce产品。
    • posts_per_page => 5: 限制显示5个产品,您可以根据需要调整。
    • orderby => 'rand': 使推荐产品随机显示,增加新鲜感。
    • post__not_in => array( $current_product_id ): 明确排除当前正在查看的产品,防止自我推荐。
    • tax_query: 这是核心部分。它定义了一个条件,要求产品不属于$excluded_term_ids数组中的任何分类。
    • meta_query 和 tax_query 结合使用:确保只显示有库存且对外可见的产品,提升用户体验。
  3. 显示产品:

    • $cross_sell_products_query->have_posts() 和 while ( ... ) : ... endwhile; 是标准的WordPress循环结构。
    • wc_get_template_part( 'content', 'product' ): 这是一个WooCommerce提供的便捷函数,用于加载单个产品的模板部分。这样可以确保推荐产品的显示样式与您主题中其他WooCommerce产品列表的样式保持一致。
    • 我们使用
        标签来包裹产品列表,并添加了 woocommerce 和 products 类,以便WooCommerce的CSS样式能够正确应用。
  4. 钩子位置:

    • add_action( 'woocommerce_after_single_product_summary', 'display_cross_sell_products_from_other_categories', 25 );
    • 这个钩子将推荐产品列表插入到产品摘要的下方。WooCommerce提供了许多钩子,您可以根据设计需求选择最合适的位置,例如 woocommerce_after_single_product 或在自定义模板文件中直接调用函数。
  5. 性能考量:

    • wp_reset_postdata(): 在使用自定义WP_Query后,务必调用此函数。它将全局$post变量恢复到主查询的产品,避免对页面其他部分的显示造成影响。

注意事项

  • 代码位置: 建议将此代码放入子主题的functions.php文件,或创建一个自定义插件。直接修改父主题文件会在主题更新时丢失更改。
  • 样式调整: 示例代码使用了WooCommerce的默认产品列表结构和模板。如果您的主题有自定义的WooCommerce样式,可能需要对输出的HTML结构或CSS进行微调,以确保完美融合。
  • 缓存: 对于高流量网站,此类数据库查询可能会对性能产生影响。考虑使用WordPress缓存插件来缓存产品页面,以减少重复查询。
  • 逻辑扩展: 如果您需要更复杂的推荐逻辑(例如基于用户行为、购买历史等),可能需要集成专门的推荐系统插件或开发更高级的算法。本教程提供的是基于分类排除的基础实现。

总结

通过本教程,您已经掌握了如何在WooCommerce产品页面上,通过排除当前产品所属的分类及其相关分类,展示来自其他类别的推荐商品。这种基于分类的交叉销售策略能够有效提升用户发现新产品的机会,从而可能增加网站的平均订单价值。结合灵活的WP_Query参数和WooCommerce的模板系统,您可以构建出高度定制化且用户体验友好的产品推荐模块。

相关专题

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

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

2637

2023.09.01

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

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

1633

2023.10.11

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

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

1513

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数据库相关内容,可以阅读本专题下面的文章。

1418

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

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

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

43

2026.01.16

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 20.1万人学习

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

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