Подписки на WooCommerce: сообщение о критической ошибке после оформления заказа

#php #wordpress #woocommerce #fatal-error #woocommerce-subscriptions

#php #wordpress #woocommerce #фатальная ошибка #woocommerce-подписки

Вопрос:

Недавно мы обнаружили сообщение об ошибке при размещении заказа (отображается в конечной точке просмотра заказа в WooCommerce). В самом низу написано: «На этом веб-сайте произошла критическая ошибка». но, похоже, ничего не сломано / не работает. С тех пор я включил режим отладки, который позволил нам, по-видимому, сузить его до пользовательского плагина со следующей трассировкой стека:

 Fatal error: Uncaught Error: Call to undefined function wcs_get_all_user_actions_for_subscription() in /wp-content/plugins/custommanager/custommanager.php:75 Stack trace: #0 /wp-includes/class-wp-hook.php(287): addCancelButton(Object(WC_Order)) #1 /wp-includes/class-wp-hook.php(311): WP_Hook->apply_filters(NULL, Array) #2 /wp-includes/plugin.php(484): WP_Hook->do_action(Array) #3 /wp-content/plugins/woocommerce/templates/order/order-details-customer.php(60): do_action('woocommerce_ord...', Object(WC_Order)) #4 /wp-content/plugins/woocommerce/includes/wc-core-functions.php(249): include('/home/mysite...') #5 /wp-content/plugins/woocommerce/templates/order/order-details.php(105): wc_get_template('order/order-det...', Array) #6 /wp-content/plugins/custommanager/custommanager.php on line 75
 

Строка 75 custommanager — это следующая функция:

 function addCancelButton($subscription) {
    $actions = wcs_get_all_user_actions_for_subscription( $subscription, get_current_user_id() );

    if(!empty($actions)){
        foreach ( $actions as $key => $action ){
            if(strtolower($action['name']) == "cancel"){
                $cancelLink = esc_url( $action['url'] );
                echo "<br/><p><a href='$cancelLink' class='button cancel'>Cancel Subscription</a></p>";
            }
        }
    }
}
 

Генерируемая кнопка отмены отображается и работает на нашей странице управления подписками, но, похоже, является причиной появления сообщения о критической ошибке при каждом заказе (подписка или нет)

Кто-нибудь может указать нам правильное направление для решения этой проблемы?

Ответ №1:

Чтобы избежать этой проблемы, вы можете попробовать использовать условную функцию function_exists() следующим образом:

 function addCancelButton($subscription) {
    if( function_exists('wcs_get_all_user_actions_for_subscription') ){
        $actions = wcs_get_all_user_actions_for_subscription( $subscription, get_current_user_id() );
    
    
        if( $actions ){
            foreach ( $actions as $key => $action ){
                if(strtolower($action['name']) == "cancel"){
                    $cancelLink = esc_url( $action['url'] );
                    echo "<br/><p><a href='$cancelLink' class='button cancel'>Cancel Subscription</a></p>";
                }
            }
        }
    }
}
 

Это может сработать.

Комментарии:

1. Похоже, это решило проблему (не уверен, что это проблема с кешем, так как при гостевой проверке она исчезла, но все еще отображается при входе в систему и покупке) Большое вам спасибо.

Ответ №2:

Пожалуйста, включите отсутствующую функцию из WCS

 function addCancelButton( $subscription ) {
    require_once( WP_PLUGIN_DIR . '/woocommerce-subscriptions/includes/wcs-user-functions.php' );
    $actions = wcs_get_all_user_actions_for_subscription( $subscription, get_current_user_id() );


    if ( !empty( $actions ) ) {
        foreach ( $actions as $key => $action ) {
            if ( strtolower( $action[ 'name' ] ) == "cancel" ) {
                $cancelLink = esc_url( $action[ 'url' ] );
                echo "<br/><p><a href='$cancelLink' class='button cancel'>Cancel Subscription</a></p>";
            }
        }
    }
}
 

Это может быть достигнуто с помощью фильтра wcs_view_subscription_actions

Комментарии:

1. к сожалению, это не возымело никакого эффекта, спасибо.