1 回答
TA贡献2021条经验 获得超8个赞
考虑到这一点后,我相信以下应该有效。对 wp_safe_redirect() 的调用将应用几个过滤器:'wp_safe_redirect_fallback'、'wp_redirect'、'wp_redirect_status',......任何这些都可以被滥用以防止发生 HTTP 重定向并返回您自己的 HTML。
add_filter('wp_safe_redirect_fallback', function($url) {
if (/* wp_safe_redirect() is called from your cart update AJAX request */) {
# Render your new cart HTML
echo cart_html();
# This filter cannot return otherwise wp_redirect() will be called!
exit();
}
return $url;
}
注意,过滤器不是用作过滤器,而是用作更改 wp_safe_redirect() 执行的钩子,以不执行 HTTP 重定向并返回生成的 HTML。即调用 exit() 是必要的!
附录
我想到了另一种方法来实现这一目标。它再次涉及滥用过滤器。在这种情况下,过滤器“woocommerce_update_cart_action_cart_updated”将谎称正在更新购物车,从而阻止调用 wp_safe_redirect()。然后较低优先级的操作将生成更新的购物车 HTML。
add_filter( 'woocommerce_update_cart_action_cart_updated', function($cart_updated) {
if (/* filter 'woocommerce_update_cart_action_cart_updated' is called from your cart update AJAX request */) {
# returning false prevents the call to wp_safe_redirect()
return false;
}
return $cart_updated;
} );
add_action( 'wp_loaded', function() {
if (/* filter 'woocommerce_update_cart_action_cart_updated' is called from your cart update AJAX request */) {
# need to calculate totals as this step was bypassed.
WC()->cart->calculate_totals();
# Render your new cart HTML
echo cart_html();
wp_die();
}
}, 21 ); # priority 21 so this action runs after WC_Form_Handler::update_cart_action() which runs at priority 20
- 1 回答
- 0 关注
- 213 浏览
添加回答
举报