如何定制woocommerce相关产品?[关闭]


14

我的网站中包含以下代码行,这些代码行将在WooCommerce的单个产品页面底部显示相关产品 ...

functions.php:

// display upsells and related products within dedicated div with different column and number of products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

function woocommerce_output_related_products() {
    $output = null;

    ob_start();
    woocommerce_related_products(4,4); 
    $content = ob_get_clean();
    if($content) { $output .= $content; }

    echo '<div class="clear"></div>' . $output;
}

因为它显示了4个以相同名称分类的产品,我将如何修改上述内容以显示相关标签

例如,我有一个名为“汽车”的产品类别,并且在该类别中有一些标签-“ Holden”,“ Ford”,“ Toyota”,“ Nissan”等。

我希望在底部显示4个产品,与用户当前正在查看的产品的标签有关。

Answers:


29

首先,您无法立即实现问题中显示的代码所描述的目标。要了解为什么该代码没有直接的方法,您必须看一下正在使用的内容- woocommerce_related_products()到目前为止所做的事情。

其次,您必须了解,因为否则您将无法提出即时问题,这绝对是您的目标,以确保您得到答案。除此之外,您还必须牢记Wordpress Development的主要范围是针对wordpress核心相关的问题-如果您有兴趣,请在Wordpress Development Meta上进行讨论,其中一个特定的主题是WPSE的吸引力和未来平台插件的发展。因此,如果您在询问有关插件的问题(例如woocommerce),则应将其分解为尽可能与核心功能相关的内容-请参阅下一点-因为您不能期望人们知道您所使用的每个插件的每个细节正在使用。

第三,现在让我们更深入地了解正在发生的事情。如您所说,您正在使用woocommerce_related_products()。如果您查看源代码,则会看到此函数用于woocommerce_get_template()获取related.php模板。woocommerce_get_template()再次使用woocommerce_locate_template()来定位模板,后者是通过利用wordpress核心功能来定位的locate_template()
现在有一个回到核心的连接,导致人们认识到,上述的-希望检查的-woocommerce功能本质上是用于扩展核心功能的包装器。通过分析功能依赖性,另一件事变得很清楚,就是我之前所说的,您需要一种不同的方法来实现您的目标,因为woocommerce_related_products()-不可否认的是-这不是正确的方法。
如果您按照我的解释进行了阅读并且到目前为止已经读完了,您就会意识到其中related.php包含了您所需要的。我特别在谈论该get_related()函数,该函数包括woocommerce_product_related_posts钩子并利用了核心函数,wp_get_post_terms()并且get_posts()- get_related()用于获取一组ID。此外,还有的woocommerce_related_products_args钩子,它可以用来改变相关产品查询里面的参数related.phpWP_Query用于此。该查询使用get_related()调用中的结果ID 。
我想您现在可以解决所有问题。实际上,不仅如此,它还提供了有关如何定制相关产品的几乎完整的概述。我没有提到所检查的源代码中的所有功能-功能和/或挂钩-但绝对是所有重要的功能。现在应该更清楚如何将woocommerce的相关产品功能追溯到wordpress的核心功能。

第四,我来了,您应该在其中应用您的自定义设置以及您需要的要求。例如这样:

Woocommerce woocommerce_product_related_posts可以自定义get_posts()呼叫以确定相关产品。

码:

        // Get the posts
        $related_posts = get_posts( apply_filters('woocommerce_product_related_posts', array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                        'relation' => 'OR',
                        array(
                                'taxonomy' => 'product_cat',
                                'field' => 'id',
                                'terms' => $cats_array
                        ),
                        array(
                                'taxonomy' => 'product_tag',
                                'field' => 'id',
                                'terms' => $tags_array
                        )
                )
        ) ) );

如何自定义此功能以实现自己的目标?这将显示与所显示的单个产品处于同一产品类别product_cat-和具有相同标签product_tag-的相关产品。

在没有给出结论的情况下(至少如果您没有期望获得完整和现成的代码的答案),您可能应该做的第一件事就是将tax_query参数relation从更改ORAND





笔记:

  • 考虑到以上相关的持续讨论,我做出了一个较长的描述性答案
  • 我希望您不要介意,这不仅是您的问题的答案,而且还致力于实现一般的教育目的
  • 这是未经测试的,因为没有实际的现成代码
  • 最后但并非最不重要的一点是,可以预见的是,随着woocoomerce 2.1的发布,将实现一些重要的代码更改,但请记住,但是从2.0.19版本开始,以上代码现在有效



编辑:

您确实不应该直接编辑(插入)核心类。这是有问题的,因为您必须再次对更新进行更改,因为如果执行一个,核心文件将被更新并覆盖。尤其是在这种情况下很容易避免的情况下,下面的代码无论如何都会做您打算做的事情,也就是说,通过实现此更改functions.php

码:

    add_filter( 'woocommerce_product_related_posts', 
                'wpse_123436_change_wc_related_products_relation_to_and' );
    function wpse_123436_change_wc_related_products_relation_to_and() {
            $get_related_products_args = array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'id',
                        'terms' => $cats_array
                    ),
                    array(
                        'taxonomy' => 'product_tag',
                        'field' => 'id',
                        'terms' => $tags_array
                    )
                )
            );
            return $get_related_products_args;
    }



对于WooCommerce 2.1.0及更高版本,上述钩子将不起作用,因为它不再存在,因此答案在2.0.20版之前可用。但是@NathanPowell在StackOverflow上发现了一个很好的答案,它涉及到v2.1.0中的可用版本以及有关可用挂钩集的相关产品定制


非常感谢@ialocin的快速详细的回复。作为一项临时措施,我只是改变了ORAND我的wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php文件,不久将其更改为从内完成functions.php文件。再次感谢你。
user1752759

@ user1752759请参阅我的编辑信息,以通过functions.php
Nicolai

完美的答案!在任何有关如何理解插件以及如何将其扩展到您的需求的指南中都应使用它。不知道这些书是否存在..但仍然:)
ThdK 2014年

@ThdK谢谢,我不知道它是否那么好,但是自编写以来第一次阅读它后,我对答案仍然感到满意,除了我肯定会赞美自己,听到它总是很高兴:)有您是否在WC 2.1.x上尝试过此操作?
Nicolai 2014年

嗨@ialocin。底部的编辑版本缺少一些右括号,但是不幸的是,在版本2.1.8中它不再作为解决方案。如果麻烦不大,可以为我更新一下吗?
user1752759 2014年

2

我们不要在这里愚弄自己。接受的答案只会使用户达到他的目标。

第一个问题就在这里:

<?php
// display upsells and related products within dedicated div with different column and number of    products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

删除动作,然后将其放置在删除的确切位置。目标是完全不清楚的。

我在搜索相关产品时遇到了这个问题,因为我不了解TAGS和CATEGORIES是驱动woocommerce_output_related_products此插件功能的因素。

这个问题的最佳答案是以下链接,并且与woocommerce_output_related_products_args()过滤器有关:https : //stackoverflow.com/questions/23554993/output-posts-relating-to-the-tags


这实际上很有趣。为什么要问,因为如果您已经仔细阅读了我的答案,那么您会看到,它仅使用一个过滤器。确切地说,当时只有一个可用的过滤器,但是您应该知道,如果您确实阅读了我写的内容,并且会花时间查看不同版本的源文件。只是说。除此之外,您链接的答案很好地说明了可用的新Sine v2.1挂钩。
Nicolai 2014年

抱歉,这是一个深夜。我希望解释一下OP中代码的明显错误。
内森·鲍威尔

不用担心,但是我还是不得不说些什么。
Nicolai 2014年

您的参考链接对我有用。内森,非常感谢,现在已经尝试2个小时为自己完成此工作。现在,我知道正确应用过滤器了:)
marcovega 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.