PHP更新后代码失效:WooCommerce无配送方式时修改结账按钮
问题:WooCommerce更新后购物车页面因自定义代码崩溃
此前使用以下来自Stack Overflow的代码,通过Code Snippets插件运行3个月均正常。但在完成PHP、WordPress及WooCommerce更新后,启用该代码时购物车页面崩溃无法正常工作。
原代码
add_action( 'woocommerce_proceed_to_checkout', 'modify_checkout_button_no_shipping', 1 ); function modify_checkout_button_no_shipping() { $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' ); // removes empty values from the array $chosen_shipping_methods = array_filter( $chosen_shipping_methods ); if ( empty( $chosen_shipping_methods ) ) { remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 ); echo '<a href="'.esc_url(wc_get_checkout_url()).'" class="checkout-button button alt wc-forward">' . __("Informe o seu CEP para prosseguir", "woocommerce") . '</a>'; } }
错误日志摘要
PHP Fatal error: Uncaught TypeError: array_filter(): Argument #1 ($array) must be of type array, null given in /../public_html/wp-content/plugins/code-snippets/php/snippet-ops.php(505) : eval()'d code:5
解决方案
错误根源是WooCommerce更新后,WC()->session->get('chosen_shipping_methods')在未选择配送方式时可能返回null,而非之前的空数组,导致array_filter()接收到非法参数触发致命错误。
修改后的代码如下,核心是确保变量始终为数组类型:
add_action( 'woocommerce_proceed_to_checkout', 'modify_checkout_button_no_shipping', 1 ); function modify_checkout_button_no_shipping() { // 确保变量始终是数组,避免null传入array_filter $chosen_shipping_methods = (array) WC()->session->get( 'chosen_shipping_methods' ); // 移除数组中的空值 $chosen_shipping_methods = array_filter( $chosen_shipping_methods ); if ( empty( $chosen_shipping_methods ) ) { remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 ); echo '<a href="'.esc_url(wc_get_checkout_url()).'" class="checkout-button button alt wc-forward">' . __("Informe o seu CEP para prosseguir", "woocommerce") . '</a>'; } }
修改说明
- 使用
(array)强制转换WC()->session->get()的返回值,无论返回null还是数组,最终都会转为数组类型 - 保留原有逻辑,仅修复类型不匹配问题,确保代码兼容更新后的WooCommerce版本
内容的提问来源于stack exchange,提问作者Agência Fiber
相关产品推荐
相关产品推荐

