• Moderatore

    WooCommerce: errore in un filtro al checkout blocca richieste api

    Buongiorno a tutti,
    sto riscontrando un problema con questo snippet:

    add_filter('woocommerce_available_payment_gateways', 'payment_gateways_based_on_chosen_shipping_method');
    function payment_gateways_based_on_chosen_shipping_method($available_gateways)
    {
        // Not in backend (admin) and Not in order pay page
        if (is_admin() ||  is_wc_endpoint_url('order-pay'))
            return $available_gateways;
        // Recupera il metodo di spedizione scelto
    
        $chosen_shipping_methods = (array) WC()->session->get('chosen_shipping_methods');
    
        if (in_array('flat_rate:5', $chosen_shipping_methods)) // se è il metodo "contrassegno"
        {
            unset($available_gateways['bacs']);               // unset Bonifico
            unset($available_gateways['paypal']);             // unset PayPal
            unset($available_gateways['ppcp-gateway']);
            unset($available_gateways['stripe']);             // unset Stripe
            unset($available_gateways['woocommerce_payments']); // unset WC-Payments
        } elseif (in_array('flat_rate:1', $chosen_shipping_methods)) // nel caso sia "tariffa unica"
        {
            unset($available_gateways['cod']);
        }
        return $available_gateways;
    }
    

    Lo snippet funziona e serve per eslcudere i metodi pagamento non necessari se viene selezionato come metodo di invio il contrassegno. Lo snippet è in uso da mesi.
    Tuttavia, oggi ha iniziato a dare problemi con le API.
    Le chiamate API vengono bloccate con un 500. Lo snippet e il sito continuano a funzionare, nascondendo i metodi di pagamento correttamente, ma tutte le chiamate API falliscono perché viene segnalato un errore alla riga

    $chosen_shipping_methods = (array) WC()->session->get( 'chosen_shipping_methods' );
    

    Qui il testo dell'errore dal log:

    01-Feb-2023 10:20:12 UTC] PHP Fatal error: Uncaught Error: Call to a member function get() on null in /home/customer/www/*****/public_html/wp-content/mu-plugins/pbp_custom-wc.php:46
    Stack trace:
    #0 /home/customer/www/*****/public_html/wp-includes/class-wp-hook.php(308): payment_gateways_based_on_chosen_shipping_method(Array)
    #1 /home/customer/www/*****/public_html/wp-includes/plugin.php(205): WP_Hook->apply_filters(Array, Array)
    #2 /home/customer/www/*****/public_html/wp-content/plugins/woocommerce/includes/class-wc-payment-gateways.php(163): apply_filters('woocommerce_ava...', Array)
    #3 /home/customer/www/*****/public_html/wp-content/plugins/woocommerce-paypal-payments/modules/ppcp-wc-gateway/services.php(1322): WC_Payment_Gateways->get_available_payment_gateways()
     #4 /home/customer/www/*****/public_html/wp-content/plugins/woocommerce-paypal-payments/lib/packages/Dhii/Container/DelegatingContainer.php(117): WooCommerce\PayPalCommerce\WcGateway\WCGatewayModule::WooCommerce\PayPalCommerce\WcGateway\{closure}(Ob in /home/customer/www/*****/public_html/wp-content/mu-plugins/pbp_custom-wc.php on line 46
    

    Non sono sicuro dell'errore. Sbaglio metodo?


  • Moderatore

    Risolto.
    Per chi fosse interessato, è stato risolto aggiungendo un check sulla sessione. La riga incriminata è stata modificata in questo modo:

    $chosen_shipping_methods = WC()->session && WC()->session->get( 'chosen_shipping_methods' ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();