首先,您无法立即实现问题中显示的代码所描述的目标。要了解为什么该代码没有直接的方法,您必须看一下正在使用的内容- 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.php
,WP_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
从更改OR
为AND
。
笔记:
- 考虑到以上相关的持续讨论,我做出了一个较长的描述性答案
- 我希望您不要介意,这不仅是您的问题的答案,而且还致力于实现一般的教育目的
- 这是未经测试的,因为没有实际的现成代码
- 最后但并非最不重要的一点是,可以预见的是,随着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中的可用版本以及有关可用挂钩集的相关产品的定制。
OR
对AND
我的wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
文件,不久将其更改为从内完成functions.php
文件。再次感谢你。