Firstly, 用问题中显示的代码无法立即实现所描述的目标。要理解为什么没有直接的方法来处理这些代码,您必须看看您使用的是什么-woocommerce_related_products()
- 去做你迄今为止所做的事。
Secondly, 你必须理解,否则你就无法提出一个切中要害的问题,而这绝对是你的目标,以确保你得到了答案。除此之外,你必须记住Wordpress Development 是否在wordpress核心相关问题上设置了其主要范围-如果您感兴趣,这正在讨论中Wordpress Development Meta, 一个具体的主题是Our wooes and future of platform plugins at WPSE. 因此,如果你要问一些关于插件的问题,比如woocommerce,你应该把它分解成尽可能与核心功能相关的部分——看下一点——因为你不能指望人们知道你使用的每个插件的每一个细节。
Thirdly, 现在,让我们深入了解正在发生的事情。正如你所说,你正在使用woocommerce_related_products()
现在如果查看源代码,您会看到此函数使用woocommerce_get_template()
获取related.php
样板woocommerce_get_template()
再次使用woocommerce_locate_template()
为了定位模板,后者通过使用wordpress的核心功能来定位模板locate_template()
.<现在有了一个与core的连接,从而认识到上述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.php
, WP_Query
用于此。查询使用get_related()
呼叫<我想你现在手头有一切可以解决你的问题了。实际上,更重要的是,这提供了一个关于如何定制相关产品的几乎完整的概述。我并没有提到所检查的源代码的所有功能-功能和/或挂钩,但肯定提到了所有重要的功能。现在应该更清楚的是,woocommerce的相关产品功能如何追溯到wordpress的核心功能。
Fourthly, 我来了,你应该在哪里应用你的定制和你应该要求的东西。例如:
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
从…起OR
到AND
.
Notes: 这是一个较长的描述性回答,我考虑到了上述正在进行的讨论,希望您不要介意,这不仅是对您问题的回答,而且是为了实现一般教育目的,这是未经测试的,因为没有实际现成的代码,可以预见,随着woocoomerce 2.1的发布,将实施一些重要的代码更改,但目前从2.0.19开始,上述代码是有效的
<小时>
Edit:
你真的不应该直接编辑(插件)核心类。这是有问题的,因为您必须在更新时再次维护更改,因为如果执行更新,核心文件会被更新和覆盖。特别是如果像在这种情况下很容易避免的话,下面的代码会以任何方式实现您想要做的事情,也就是说,通过
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上找到了一个关于from v2的好答案。1.0上可用,用于customization of the related products usable set of hooks.