Defend against missing session in cart functions to prevent fatals (#51442)

* Ensure session is callable in cart functions

* Changelog
This commit is contained in:
Mike Jolley 2024-09-19 13:36:54 +01:00 committed by GitHub
parent 8ca18f06ad
commit bf549e6d8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 7 deletions

View File

@ -0,0 +1,4 @@
Significance: patch
Type: fix
Ensure session is loaded in cart functions to prevent fatal errors.

View File

@ -412,13 +412,13 @@ function wc_cart_round_discount( $value, $precision ) {
* @return string[] * @return string[]
*/ */
function wc_get_chosen_shipping_method_ids() { function wc_get_chosen_shipping_method_ids() {
$method_ids = array(); if ( ! is_callable( array( WC()->session, 'get' ) ) ) {
$chosen_methods = array(); return array();
if ( is_callable( array( WC()->session, 'get' ) ) ) {
$chosen_methods = WC()->session->get( 'chosen_shipping_methods', array() );
} }
$chosen_methods = WC()->session->get( 'chosen_shipping_methods', array() );
$method_ids = array();
foreach ( $chosen_methods as $chosen_method ) { foreach ( $chosen_methods as $chosen_method ) {
if ( ! is_string( $chosen_method ) ) { if ( ! is_string( $chosen_method ) ) {
continue; continue;
@ -439,11 +439,15 @@ function wc_get_chosen_shipping_method_ids() {
* @return string|bool Either the chosen method ID or false if nothing is chosen yet. * @return string|bool Either the chosen method ID or false if nothing is chosen yet.
*/ */
function wc_get_chosen_shipping_method_for_package( $key, $package ) { function wc_get_chosen_shipping_method_for_package( $key, $package ) {
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); if ( ! is_callable( array( WC()->session, 'get' ) ) ) {
return false;
}
$chosen_methods = WC()->session->get( 'chosen_shipping_methods', array() );
$chosen_method = isset( $chosen_methods[ $key ] ) ? $chosen_methods[ $key ] : false; $chosen_method = isset( $chosen_methods[ $key ] ) ? $chosen_methods[ $key ] : false;
$changed = wc_shipping_methods_have_changed( $key, $package ); $changed = wc_shipping_methods_have_changed( $key, $package );
// This is deprecated but here for BW compat. TODO: Remove in 4.0.0. // This is deprecated but here for BW compat. Remove in 4.0.0.
$method_counts = WC()->session->get( 'shipping_method_counts' ); $method_counts = WC()->session->get( 'shipping_method_counts' );
if ( ! empty( $method_counts[ $key ] ) ) { if ( ! empty( $method_counts[ $key ] ) ) {
@ -465,6 +469,12 @@ function wc_get_chosen_shipping_method_for_package( $key, $package ) {
WC()->session->set( 'chosen_shipping_methods', $chosen_methods ); WC()->session->set( 'chosen_shipping_methods', $chosen_methods );
WC()->session->set( 'shipping_method_counts', $method_counts ); WC()->session->set( 'shipping_method_counts', $method_counts );
/**
* Fires when a shipping method is chosen.
*
* @since 3.2.0
* @param string $chosen_method Chosen shipping method. e.g. flat_rate:1.
*/
do_action( 'woocommerce_shipping_method_chosen', $chosen_method ); do_action( 'woocommerce_shipping_method_chosen', $chosen_method );
} }
return $chosen_method; return $chosen_method;
@ -536,6 +546,10 @@ function wc_get_default_shipping_method_for_package( $key, $package, $chosen_met
* @return bool * @return bool
*/ */
function wc_shipping_methods_have_changed( $key, $package ) { function wc_shipping_methods_have_changed( $key, $package ) {
if ( ! is_callable( array( WC()->session, 'get' ) ) ) {
return false;
}
// Lookup previous methods from session. // Lookup previous methods from session.
$previous_shipping_methods = WC()->session->get( 'previous_shipping_methods' ); $previous_shipping_methods = WC()->session->get( 'previous_shipping_methods' );
// Get new and old rates. // Get new and old rates.