WooCommerce:产品选项卡中的自定义循环中断评论选项卡

时间:2016-09-07 作者:Dmitriy Gamolin

我遇到了一个奇怪的问题,不确定是bug还是代码有问题。

Woocommerce允许在默认情况下仅在购物车中显示交叉销售产品,因此我必须进行自定义循环以在产品页面上显示它们。

因此,我为产品页面制作了一个定制产品选项卡,显示交叉销售产品(追加销售或相关产品将不符合要求)。除了“评论”选项卡外,一切正常。如果我把它放在交叉销售的标签后面,它会显示错误的评论(看起来是随机的)。评论计数器(选项卡名称旁边的计数器)是正确的,但评论列表包含其他产品的评论,而不是当前产品的评论。如果“评论”选项卡位于“交叉销售”选项卡之前,那么就可以了。所以我猜我的代码中有什么东西破坏了它,但我不知道是什么。。。

以下是我在交叉销售选项卡中运行的代码:

$crosssell_ids = get_post_meta( get_the_ID(), \'_crosssell_ids\' ); 
$crosssell_ids = $crosssell_ids[0];

if(count($crosssell_ids) > 0) {
    $crosssell_args = array( \'post_type\' => \'product\', \'posts_per_page\' => 8, \'post__in\' => $crosssell_ids );
    $crosssell_loop = new WP_Query( $crosssell_args );
    echo \'<div class="products"><div class="tabs-title">Consumables for <br>&laquo;\' . get_the_title($product->id) . \'&raquo;</div>\';
    while ( $crosssell_loop->have_posts() ) {
        $crosssell_loop->the_post();
        wc_get_template_part( \'content\', \'product\' );
    };
    echo \'</div>\';
}
我给我的循环指定了一个自定义名称以避免任何冲突,因此它应该覆盖评论使用的任何变量。。。我还尝试在while loop 和输出缓冲变量,但这并没有解决问题。

问题是,我被要求按照设计将评论放在这个选项卡之后,所以我不能只在它之前留下评论(这也是因为第一个带有产品描述的选项卡还应该包含两个交叉销售产品)。

下面是我添加自定义选项卡和设置其优先级的功能:

// Custom tabs for product page
add_filter( \'woocommerce_product_tabs\', \'my_product_tabs\' );
function my_product_tabs( $tabs ) {
    // Add new product tabs for product page
    $detailed_info = get_post_meta( get_the_ID(), \'detail_info\', true );
    if( !empty($detail_info) ) {
        $tabs[\'detail_info\'] = array(
            \'title\'     => __( \'Detail info\', \'woocommerce\' ),
            \'callback\'  => \'my_tabs_detail_info_html\'
        );
    }
    $crosssell_ids = get_post_meta( get_the_ID(), \'_crosssell_ids\' ); 
    $crosssell_ids = $crosssell_ids[0];
    if( !empty($crosssell_ids) ) {
        $tabs[\'consumables\'] = array(
            \'title\'     => __( \'Consumables\', \'woocommerce\' ),
            \'callback\'  => \'my_tabs_consumables_html\'
        );
    }
    $tabs[\'delivery_methods\'] = array(
        \'title\'     => __( \'Delivery Methods\', \'woocommerce\' ),
        \'callback\'  => \'my_tabs_delivery_methods_html\'
    );

    // Edit default product tabs for product page
    unset( $tabs[\'additional_information\'] );

    // Tabs order
    if ( isset($tabs[\'description\']) ) $tabs[\'description\'][\'priority\'] = 10;
    if ( isset($tabs[\'detail_info\']) ) $tabs[\'detail_info\'][\'priority\'] = 15;
    if ( isset($tabs[\'consumables\']) ) $tabs[\'consumables\'][\'priority\'] = 20;
    $tabs[\'reviews\'][\'priority\'] = 25;
    if ( isset($tabs[\'delivery_methods\']) ) $tabs[\'delivery_methods\'][\'priority\'] = 30;
    return $tabs;
}

1 个回复
最合适的回答,由SO网友:Dmitriy Gamolin 整理而成

我找到了对有经验的WP开发人员来说可能非常基本的解决方案。我将把它贴在这里,而不是删除这个问题,我希望有一天这可能会帮助一些人。。。

问题是post数据没有重置,所以我只需要添加一个函数调用wp_reset_postdata(); 在我的while循环之后。像这样:

$crosssell_ids = get_post_meta( get_the_ID(), \'_crosssell_ids\' ); 
$crosssell_ids = $crosssell_ids[0];

if(count($crosssell_ids) > 0) {
    $crosssell_args = array( \'post_type\' => \'product\', \'posts_per_page\' => 8, \'post__in\' => $crosssell_ids );
    $crosssell_loop = new WP_Query( $crosssell_args );
    echo \'<div class="products"><div class="tabs-title">Consumables for <br>&laquo;\' . get_the_title($product->id) . \'&raquo;</div>\';
    while ( $crosssell_loop->have_posts() ) {
        $crosssell_loop->the_post();
        wc_get_template_part( \'content\', \'product\' );
    };
    wp_reset_postdata();
    echo \'</div>\';
}

相关推荐

我如何以编程方式向WooCommerce产品添加‘REVIEWS_ALLOWED’?

我正在尝试使用从火山口表单收集的数据添加产品。我成功地创建了产品并添加了其他属性,但事实证明,“允许评论”是难以捉摸的。$post_id = wp_insert_post(array( \'post_title\' => \'ProductName \'.$data[\'uniquenumber\'], \'post_type\' => \'product\', \'post_status\' => \'draft\', \