2016-03-04 76 views
1

我试图在单个产品页面中设置侧边栏,显示与显示的产品相同类别的所有产品。获取显示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

问题是你如何得到类别slu。。 get_the_term_list会给你一个格式化的链接列表的类别,所以它会显示类别名称,而不是类别slu 012,这是不同的东西。 “毛巾”将是你的类别名称,但类别slu would将是“毛巾”。并且product_category shortcode期望一个slu,,而不是一个名字。

正确的方法来获得该类别产品块如下:

$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文档以供参考。

为了从结果中删除当前显示的产品,您可以使用woocommerce_shortcode_products_query过滤器。它没有记录,但您可以通过查看位于includes/class-wc-shortcodes.php中的product_category短代码来找到它。在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 - 请勿这是未经测试,所以如果它不工作如果它包含当前产品ID,请查看get_queried_object_id()返回。

+0

感谢代码@vard,您的帮助非常棒。 现在我正在阅读您在代码中建议的参考资料。 下一步将从侧栏视图中排除产品页面中显示的产品以避免重复。如果你有其他建议或读数建议解决它,欢迎你。 – paolo70

+0

@ paolo70是的,你可以使用一个过滤器 - 我更新了我的答案,以提供有关这方面的详细信息。 – vard

相关问题