获取侧栏小部件,在Woocommerce中显示相同类别的产品

时间:2016-03-04 09:09:29

标签: wordpress woocommerce

我正在尝试在单个产品页面中设置一个侧边栏,其中显示与所显示产品属于同一类别的所有产品。

这就是我的进展方式:

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"]'); ?>

在最后一种情况下,代码不会显示任何内容。我不明白我在哪里犯错,语法错了或解决方法不合逻辑?

我真的很感激任何帮助。

1 个答案:

答案 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_argsWP_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