我们一直在使用WooCommerce订阅,但是当查看来自用户"my“部分的订单时,打开WP_DEBUG显示如下所示:
在/wp-content/plugins/woocommerce-subscriptions/includes/wcs-user-functions.php:381中调用bool上的成员函数get_user_id()
第381行是:
if ( $user_id === $subscription->get_user_id() ) {
$allcaps['edit_shop_subscription_status'] = true;
}
break;考虑到这是一个官方插件,我不知道一个问题是如何发展的,我也有堆栈跟踪:
堆栈跟踪:#0 /wp-包含/class-wp-hook.php(289):wcs_user_has_capability(Array,Array,Array) #1 /wp-包含/plugin.php(212):WP_Hook->apply_filters(Array,Array) #2 /wp-包含/class-wp-user.php(783):apply_filters(‘user_has’,Array,apply_filters对象(WP_User) #3 /WP-包括/capabilities.php(788):WP_User->has_cap(‘WP_User_WP_User_subsc.,44013) #4 user_can(Object(WP_User),’edit_shop_subsc.‘,( 44013) #5 /wp-content/plugins/tmanager/tmanager.php(76):wcs_get_all_user_actions_for_subscription(Object(WC_O in /wp-content/plugins/woocommerce-subscriptions/includes/wcs-user-functions.php on /wp-content/plugins/woocommerce-subscriptions/includes/wcs-user-functions.php
完整的代码块:
/**
* 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中得到任何东西--它是否只显示出一个错误,只针对没有订阅计划的用户?任何指针都是非常精确的。
发布于 2021-03-11 15:13:10
由于罪犯似乎是返回布尔值的WC_Subscription对象,所以请使用:
if ( is_a( $subscription, 'WC_Subscription' ) && $user_id === $subscription->get_user_id() ) {
$allcaps['edit_shop_subscription_status'] = true;
}它应该能解决这个问题。
https://stackoverflow.com/questions/66584916
复制相似问题