如何获取WooCommerce购物车商品永久链接并var_dump输出?
我正在使用WooCommerce + Product Bundles + Subscriptions插件,需要获取购物车中商品(含捆绑订阅商品)带URL参数的永久链接,但目前连购物车内容都无法用var_dump输出。尝试了三段独立代码:
function playboi_carti() { /* none of these three things works, trying each independently */ /* if (WC()->cart->get_cart() != NULL) { var_dump(WC()->cart->get_cart()); } else { echo('No cart item!'); } */ /* foreach ( WC()->cart->get_cart() as $cart_item ) { var_dump($cart_item); } */ foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key ); $product_permalink = $_product->get_permalink( $cart_item ); var_dump($product_permalink); } } add_action( 'init', 'playboi_carti' );
以上代码均抛出相同错误:
Uncaught Error: Call to a member function get_cart() on null in wp-content/themes/canine-catering-theme/functions.php:71 Stack trace: #0 wp-includes/class-wp-hook.php(307): playboi_carti() #1 wp-includes/class-wp-hook.php(331): WP_Hook->apply_filters() #2 wp-includes/plugin.php(476): WP_Hook->do_action() #3 wp-settings.php(598): do_action() #4 wp-config.php(105): require_once('wp-...') #5 wp-load.php(50): require_once('wp-...') #6 wp-admin/admin.php(34): require_once('wp-...') #7 wp-admin/theme-editor.php(10): require_once('wp-...') #8 {main} thrown
另外试了一段代码,得到空购物车结果,但实际购物车有捆绑订阅商品,且听说用$woocommerce全局变量不规范:
add_action('init', 'dump_woocommerce_cart'); function dump_woocommerce_cart() { global $woocommerce; var_dump($woocommerce->cart); }
请问这种无法获取购物车数据的情况,是否和Product Bundles或Subscriptions插件有关?
核心原因
问题和Product Bundles/Subscriptions插件无关,是钩子时机选择错误:init钩子执行时,WooCommerce的购物车对象还未完成初始化,导致WC()->cart返回null,调用get_cart()自然报错;即便用全局变量$woocommerce,此时购物车也还没加载用户会话数据,所以得到空结果。
正确实现步骤
选择合适的钩子:
- 后端场景:用
woocommerce_init(WooCommerce完成初始化后触发)或wp_loaded(WordPress所有组件加载完成后触发) - 前端购物车/结账页场景:用
woocommerce_before_cart、woocommerce_after_cart等页面专属钩子,更精准。
- 后端场景:用
规范的购物车访问代码:
先判断WC()->cart是否存在,再处理购物车项;对于捆绑商品,需要额外遍历子项(Product Bundles会将捆绑商品作为父项,子商品嵌套在$cart_item['bundled_items']中)。示例代码:function get_cart_product_permalinks() { // 确保WooCommerce购物车已初始化 if ( ! function_exists( 'WC' ) || ! WC()->cart ) { return; } foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key ); // 获取主商品(含订阅/捆绑父商品)的带参数永久链接 $permalink = $_product->get_permalink( $cart_item ); var_dump( '主商品链接:', $permalink ); // 处理捆绑商品的子项 if ( isset( $cart_item['bundled_items'] ) && ! empty( $cart_item['bundled_items'] ) ) { foreach ( $cart_item['bundled_items'] as $bundled_item ) { $bundled_product = $bundled_item['data']; $bundled_permalink = $bundled_product->get_permalink( $bundled_item ); var_dump( '捆绑子商品链接:', $bundled_permalink ); } } } } // 用woocommerce_init钩子,确保购物车已加载 add_action( 'woocommerce_init', 'get_cart_product_permalinks' );关于带参数的永久链接:
$_product->get_permalink( $cart_item )方法会自动处理订阅商品的周期参数(如?subscription_period=month),无需手动拼接;捆绑商品的父项链接默认指向捆绑商品本身,子项链接指向对应的单品。
补充说明
- 避免使用
global $woocommerce,官方推荐用WC()全局函数访问WooCommerce组件,更规范且兼容性更好。 - 如果是在前端页面调试,建议用
woocommerce_before_cart这类钩子,只在购物车页触发,避免不必要的执行。
内容的提问来源于stack exchange,提问作者ACJ

