我已将结帐和购物车的短代码合并到两列的结帐页面上,以减少完成付款的点击次数。
然而,我发现钩子似乎对这种安排很奇怪。
例如,我正在尝试将交叉销售部分放在购物车部分下方。在默认购物车页面上,默认情况下会显示。结合推车和结账一起使它消失。
逻辑方法是这样做:
function add_cart_collaterals() {
if (is_checkout()) {
add_action( 'woocommerce_after_cart_contents', 'woocommerce_cross_sell_display' );
}
}
add_action('wp', 'add_cart_collaterals');
没有做任何事。
出于绝望,我随后复制并修改了cross-sell.php模板代码,并将其直接放入我的子主题的functions.php文件中,如下所示:
/* Display Cross-Sells below cart */
function show_cross_sell() {
if ( $cross_sells ) :
echo '<div class="cross-sells"><h2>';
_e( 'You may be interested in…', 'woocommerce' );
echo '</h2>';
woocommerce_product_loop_start();
foreach ( $cross_sells as $cross_sell ) :
$post_object = get_post( $cross_sell->get_id() );
setup_postdata( $GLOBALS['post'] =& $post_object );
wc_get_template_part( 'content', 'product' );
endforeach;
woocommerce_product_loop_end();
echo '</div>';
else : {
echo 'No cross sells to display';
}
endif;
}
add_action( 'woocommerce_after_cart_table', 'show_cross_sell', 10 );
但是,只有else
条件运行并显示“没有交叉销售显示”。所以它可能会失去$cross_sells
对象的范围。
我是否有希望实现这一目标?
答案 0 :(得分:2)
WooCommerce支持得到了一个帮助我的答案。我没有为任何事情分配$cross_sells
。我需要像$cross_sells = array_filter( array_map( 'wc_get_product', WC()->cart->get_cross_sells() ), 'wc_products_array_filter_visible' );
但我仍然很想知道为什么挂钩动作不起作用。
答案 1 :(得分:0)
关于为什么用钩子无法实现的原因,可能是因为您钩住了该动作的函数的第一行代码是
function woocommerce_cross_sell_display( $limit = 2, $columns = 2, $orderby = 'rand', $order = 'desc' ) {
if ( is_checkout() ) {
return;
}