• Resolved antoineleschamanes

    (@antoineleschamanes)


    Bonjour

    Lors du debut du paiement de la commande, les informations de point relais sont supprimées de la session suite à la création de la commande (line 197 de abstract_pickup_widget.php). Ceci pose problème pour certains modes de paiement externe qui s’ouvrent en popup sans rechargement de la page de validation (par exemple klarna).

    si l’utilisateur annule le paiement, il revient à la page de validation de commande sans rechargement de la page, le point relais est affiché comme sélectionné, mais lors d’une nouvelle validation de la commande, l’erreur “please select a pickup point” est levée par la fonction prevent_checkout_process de la classe abstract_pickup_widget.

    vu que la fonction save_pickup_info est appelé par plusieurs hook dont woocommerce_order_status_processing, la valeur de session ne pourrait être supprimé que dans le cas où la commande a bien été payé et a donc le statut “processing”.

    Je n’ai pas étudié l’ensemble du code du plugin, et il y a peut être d’autres cas à prendre en compte, mais cette modification dans la fonction save_pickup_info a résolu le bug que je rencontrais sur ma page de validation de commande.

    Si vous confirmer le bug, merci d’inclure la correction dans une future version.

    Bonne journée

    --- a/wp-content/plugins/wc-multishipping/inc/front/pickup/abstract_classes/abstract_pickup_widget.php
    +++ b/wp-content/plugins/wc-multishipping/inc/front/pickup/abstract_classes/abstract_pickup_widget.php
    @@ -76,6 +76,9 @@ abstract class abstract_pickup_widget {
    $pickup_country = wms_get_var( 'cmd', 'pickup_country', 'FR' );
    $pickup_provider = wms_get_var( 'cmd', 'pickup_provider', '' );

    + if( $pickup_provider != static::SHIPPING_PROVIDER_ID ) {
    + return;
    + }

    if ( strlen( 4 == $pickup_zip_code ) )
    $pickup_country = "0" . strval( $pickup_zip_code );
    @@ -97,7 +100,7 @@ abstract class abstract_pickup_widget {
    ] );
    }

    - WC()->session->set( self::PICKUP_LOCATION_SESSION_VAR_NAME, $pickup_info );
    + WC()->session->set( static::PICKUP_LOCATION_SESSION_VAR_NAME, $pickup_info );

    wp_send_json( [
    'error' => false,
    @@ -132,7 +135,7 @@ abstract class abstract_pickup_widget {
    $countries_obj = new \WC_Countries();
    $countries = $countries_obj->__get( 'countries' );

    - $pickup_info = WC()->session->get( self::PICKUP_LOCATION_SESSION_VAR_NAME );
    + $pickup_info = WC()->session->get( static::PICKUP_LOCATION_SESSION_VAR_NAME );

    $map_to_use = get_option( 'wms_' . static::SHIPPING_PROVIDER_ID . '_section_pickup_points_map_type', 'openstreetmap' );

    @@ -180,7 +183,7 @@ abstract class abstract_pickup_widget {
    if ( ! $session )
    return;

    - $pickup_info = $session->get( self::PICKUP_LOCATION_SESSION_VAR_NAME );
    + $pickup_info = $session->get( static::PICKUP_LOCATION_SESSION_VAR_NAME );
    if ( empty( $pickup_info ) )
    return;

    @@ -194,7 +197,9 @@ abstract class abstract_pickup_widget {
    $order->update_meta_data( $order_class::PICKUP_INFO_META_KEY, $pickup_info );
    $order->save();

    - WC()->session->set( self::PICKUP_LOCATION_SESSION_VAR_NAME, null );
    + if($order->status == 'processing') {
    + WC()->session->set( static::PICKUP_LOCATION_SESSION_VAR_NAME, null );
    + }
    }

    public function prevent_place_order_button( $order_button ) {
    @@ -212,7 +217,7 @@ abstract class abstract_pickup_widget {
    return $order_button;
    }

    - $pickup_info = WC()->session->get( self::PICKUP_LOCATION_SESSION_VAR_NAME );
    + $pickup_info = WC()->session->get( static::PICKUP_LOCATION_SESSION_VAR_NAME );
    if ( ! empty( $pickup_info ) )
    return $order_button;

    @@ -240,7 +245,7 @@ abstract class abstract_pickup_widget {
    return;


    - $pickup_info = WC()->session->get( self::PICKUP_LOCATION_SESSION_VAR_NAME );
    + $pickup_info = WC()->session->get( static::PICKUP_LOCATION_SESSION_VAR_NAME );

    if ( empty( $pickup_info ) || strpos( $selected_shipping_method_name, $pickup_info['pickup_provider'] ) === false ) {
    if ( $errors )
    @@ -257,7 +262,7 @@ abstract class abstract_pickup_widget {
    return;


    - $pickup_data = WC()->session->get( self::PICKUP_LOCATION_SESSION_VAR_NAME );
    + $pickup_data = WC()->session->get( static::PICKUP_LOCATION_SESSION_VAR_NAME );
Viewing 3 replies - 1 through 3 (of 3 total)
  • Bonjour Antoine,

    Merci de votre message et de votre analyse.
    Désolé du retard, nous sommes moins réactifs ici que via notre formulaire de contact.

    Une question me vient, le fix à votre souci ne serait pas uniquement via cette ligne ?

    if($order->status == 'processing')


    Merci et bonne journée !

    Thread Starter antoineleschamanes

    (@antoineleschamanes)

    Bonjour

    oui tout à fait, par rapport au problème rencontré, la vérification du status ‘processing’ avant de repasser la valeur de session à null suffit à résoudre ce cas.

    J’ai appliqué en même temps les autres changements ( modification de self en static et arrêt de la fonction si l’execution n’est pas sur le bon provider ) car en essayant de debuggé le cas j’ai rencontré un souci de logique à ce niveau.

    Si tous les provider sont utilisés au niveau de la validation de commande, les hooks sont enregistrés pour chacun, l’appel admin-ajax à l’action wms_select_pickup_point executera donc plusieurs fois la fonction select_pickup_point de la class abstraite (1 fois par classe héritée). L’utilisation de self::PICKUP_LOCATION_SESSION_VAR_NAME va enregistrer les informations de pickup sur une valeur de session avec une clé vide (à partir de la valeur de constant définie dans la classe abstraite, qui est ”), alors qu’avec static::PICKUP_LOCATION_SESSION_VAR_NAME, c’est bien la valeur définie dans chaque classe héritée qui sera utilisé en clé pour l’enregistrement dans la session.

    Cela fonctionne dans les deux cas, vu que l’on utilise qu’un seul mode de livraison pour expédier une commande au final, mais en cas de changement de provider au niveau de la validation de commande, je pense que cela peut entrainer des soucis, car les informations de pickup pourraient se mélanger entre les provider.

    Je n’ai pas reproduit le cas, mais cela me semblait plus logique de le corriger en même temps.

    Bonne journée.

    Top, merci de l’info et du retour !

Viewing 3 replies - 1 through 3 (of 3 total)

The topic ‘info de pickup point supprimer de la session avant le paiement de la commande’ is closed to new replies.