我遇到了一个奇怪的问题,不确定是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>«\' . get_the_title($product->id) . \'»</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;
}
最合适的回答,由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>«\' . get_the_title($product->id) . \'»</div>\';
while ( $crosssell_loop->have_posts() ) {
$crosssell_loop->the_post();
wc_get_template_part( \'content\', \'product\' );
};
wp_reset_postdata();
echo \'</div>\';
}