未捕获错误:调用成员函数get_user_id()WooCommerce订阅



我们一直在很好地使用WooCommerce订阅,但在查看来自用户的订单时,它已经开始引起问题"我的账户";部分,打开WP_DEBUG显示以下内容:

未捕获错误:调用布尔上的成员函数get_user_id((/wp-content/plugins/woocommerce订阅/included/wcs用户函数php:381

第381行为:

if ( $user_id === $subscription->get_user_id() ) {
$allcaps['edit_shop_subscription_status'] = true;
}
break;

鉴于这是一个官方插件,我不确定问题是如何发展的,我也有堆栈跟踪:

堆栈跟踪:#0/wp-includs/class-wp-hook.php(289(:wcs_user_has_capability(阵列、阵列、阵列(#1/wp包含/plugin.php(212(:WP_Hook->apply_filters(数组,数组(#2/wp包含/class wp-user.php(783(:apply_filters('user_has_cap',Array,Array,Object(WP_user((#3/wp includes/capabilities.php(788(:WP_用户->has_cap('edit_shop_subsc…',44013(#4/wp-content/plugins/woocommerce订阅/included/wcs-user-functions.php(320(:user_can(对象(WP_user(,'edit_shop_subsc…',44013(#5/wp-content/plugins/tmanager/tmanager.php(76(:wcs_get_all_user_actions_for_subscription(中的对象(WC_O/wp-content/plugins/woocommerce订阅/included/wcs-user-functions.php在线381

完整的代码块:

/**
* Checks if a user has a certain capability
*
* @access public
* @param array $allcaps
* @param array $caps
* @param array $args
* @return array
*/
function wcs_user_has_capability( $allcaps, $caps, $args ) {
if ( isset( $caps[0] ) ) {
switch ( $caps[0] ) {
case 'edit_shop_subscription_payment_method' :
$user_id  = $args[1];
$subscription = wcs_get_subscription( $args[2] );
if ( $subscription && $user_id === $subscription->get_user_id() ) {
$allcaps['edit_shop_subscription_payment_method'] = true;
}
break;
case 'edit_shop_subscription_status' :
$user_id  = $args[1];
$subscription = wcs_get_subscription( $args[2] );
if ( $user_id === $subscription->get_user_id() ) {
$allcaps['edit_shop_subscription_status'] = true;
}
break;
case 'edit_shop_subscription_line_items' :
$user_id  = $args[1];
$subscription = wcs_get_subscription( $args[2] );
if ( $user_id === $subscription->get_user_id() ) {
$allcaps['edit_shop_subscription_line_items'] = true;
}
break;
case 'switch_shop_subscription' :
$user_id  = $args[1];
$subscription = wcs_get_subscription( $args[2] );
if ( $user_id === $subscription->get_user_id() ) {
$allcaps['switch_shop_subscription'] = true;
}
break;
case 'subscribe_again' :
$user_id  = $args[1];
$subscription = wcs_get_subscription( $args[2] );
if ( $user_id === $subscription->get_user_id() ) {
$allcaps['subscribe_again'] = true;
}
break;
case 'pay_for_order' :
$user_id = $args[1];
$order   = wc_get_order( $args[2] );
if ( $order && wcs_order_contains_subscription( $order, 'any' ) ) {
if ( $user_id === $order->get_user_id() ) {
$allcaps['pay_for_order'] = true;
} else {
unset( $allcaps['pay_for_order'] );
}
}
break;
}
}
return $allcaps;
}
add_filter( 'user_has_cap', 'wcs_user_has_capability', 15, 3 );

使用print_r$user_id会得到一个结果,但我无法从$subscription中得到任何东西——它会只为不在订阅计划中的用户显示错误吗?任何指针都非常精确。

由于有罪对象似乎是返回布尔值的WC_Subscription对象,请改用:

if ( is_a( $subscription, 'WC_Subscription' ) && $user_id === $subscription->get_user_id() ) {
$allcaps['edit_shop_subscription_status'] = true;
}

它应该能解决这个问题。

最新更新