我正在尝试在单个产品页面中设置一个侧边栏,其中显示与所显示产品属于同一类别的所有产品。
这就是我的进展方式:
1)首先,我创建了一个名为“Products_of_same_Category”的侧边栏,在其中放入一个小部件来显示我需要的内容,然后在我的子主题的 function.php 中,我添加了以下代码段:在文本小部件中执行php代码:
// Enable PHP in widgets
add_filter('widget_text','execute_php',100);
function execute_php($html){
if(strpos($html,"<"."?php")!==false){
ob_start();
eval("?".">".$html);
$html=ob_get_contents();
ob_end_clean();
}
return $html;
}
2)然后,当我看到该片段运行正常时,我添加了该代码来测试它:
<?php
$prod=get_the_term_list( $post->ID, 'product_cat');
echo $prod;
?>
一切正常,它给了我单个产品页面中显示的当前产品类别的确切名称。
3)所以我尝试了另一个测试,删除前面的代码,以查看在PHP中翻译的短代码是否也适用于小部件(此时写下所要求的确切类别名称,在本例中为“毛巾” - 在下面的代码中,我将其替换为THE-CATEGORY-I-LIKE
):
<?php echo do_shortcode('[product_category category=“THE-CATEGORY-I-LIKE” per_page="20" columns="1" orderby="title" order="desc"]'); ?>`
一切都做得很好!
4)最后,我在此代码中混合了所有相同类别的产品列表,但出现了问题:
<?php $prod=get_the_term_list( $post->ID, 'product_cat', '', '', '' );
echo do_shortcode('[product_category category="'.$prod.'" per_page="20" columns="1" orderby="title" order="desc"]'); ?>
在最后一种情况下,代码不会显示任何内容。我不明白我在哪里犯错,语法错了或解决方法不合逻辑?
我真的很感激任何帮助。
答案 0 :(得分:1)
问题是如何获得类别slug。 get_the_term_list
会为您提供类别的格式化链接列表,因此它会显示类别名称,而不是类别 slugs ,这些是不同的内容。 “毛巾”将是您的类别名称,但类别slug将是“毛巾”。 product_category
短代码需要一个slug,而不是一个名字。
获取类别产品slug的正确方法如下:
$terms = get_the_terms($post, 'product_cat');
if($terms && ! is_wp_error($terms)) {
foreach($terms as $term) {
echo do_shortcode('[product_category category="'.$term->slug.'" per_page="20" columns="1" orderby="title" order="desc"]');
}
}
这将显示与您的产品相关的所有类别的产品。请参阅get_the_terms
doc以供参考。
为了从结果中删除显示的当前产品,您可以使用woocommerce_shortcode_products_query
过滤器。它没有记录,但您可以通过查看product_category
中的includes/class-wc-shortcodes.php
短代码找到它。在product_category()
方法中,您会找到以下行:
$return = self::product_loop( $query_args, $atts, 'product_cat' );
$query_args
是WP_Query
parameters array的位置。在同一个类中,您将找到此处调用的方法product_loop()
,并查看以下内容:
$products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $query_args, $atts ) );
因此,查询参数被过滤 - 您将能够使用它来添加desirated行为。您要做的是对查询使用post__not_in
参数,如下所示:
function remove_current_product_from_wc_shortcode($args, $atts) {
if(is_product()) { // check if we're on a single product page
$args['post__not_in'] = array(get_queried_object_id());
}
return $args;
}
add_filter('woocommerce_shortcode_products_query', 'remove_current_product_from_wc_shortcode');
这段代码应该放在你的主题 functions.php 中 - 请不要这是未经测试的,所以如果它不起作用,请查看get_queried_object_id()
返回的是否包含当前产品ID