Woocommerce egyedi szállítási mód
2020-03-23T14:59:25+01:00
2020-03-24T13:47:27+01:00
2022-07-18T23:51:07+02:00
lokutus
Sziasztok!

Saját template-et használnék woocommerce pénztár szállítási módnál.

A következő kóddal próbálom felülírni a flate rate-t, amit ajaxal küldök:

ajax:

add_action( 'wp_ajax_nopriv_wc_sc_shipping_ajax_handler', array($this, 'woocommerceShippingAjaxHandler') ); add_action( 'wp_ajax_wc_sc_shipping_ajax_handler', array($this, 'woocommerceShippingAjaxHandler') ); public function woocommerceShippingAjaxHandler(){ WC()->session->set( 'shipping_calculated_cost', $_POST['shipping_cost']); } Flate Rate módosítás: add_filter('woocommerce_package_rates', array($this, 'update_shipping_costs_based_on_cart_session_custom_data') , 10, 2); public function update_shipping_costs_based_on_cart_session_custom_data( $rates, $package ){ if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return $rates; // SET HERE the default cost (when "calculated cost" is not yet defined) $cost = '50'; // Get Shipping rate calculated cost (if it exists) $calculated_cost = WC()->session->get( 'shipping_calculated_cost'); // Iterating though Shipping Methods foreach ( $rates as $rate_key => $rate_values ) { $method_id = $rate_values->method_id; $rate_id = $rate_values->id; // For "Flat rate" Shipping" Method only if ( 'flat_rate' === $method_id ) { if( ! empty( $calculated_cost ) ) { $cost = $calculated_cost; } // Set the rate cost $rates[$rate_id]->cost = $cost; //var_dump($rates[$rate_id]->cost); // Taxes rate cost (if enabled) foreach ($rates[$rate_id]->taxes as $key => $tax){ if( $rates[$rate_id]->taxes[$key] > 0 ){ // set the new tax cost $taxes[$key] = number_format( $rates[$rate_id]->taxes[$key] * $cost, 2 ); $has_taxes = true; } else { $has_taxes = false; } } if( $has_taxes ) $rates[$rate_id]->taxes = $taxes; } } return $rates; }
A probéma az, hogy csak első alkalomkor írja felül a szállítási költséget, amikor a fizetési oldalon másikat választok, akkor nem módosítja sajnos. Mi ennek az oka?
Mutasd a teljes hozzászólást!
Csináltam egy costum shipping methodot ez alapján:
Create a WooCommerce Custom Shipping Method Plugin

és érdekes ezzel megy az ajax shipping cost frissítés.
Mutasd a teljes hozzászólást!

  • Próbáltad már a woocommerce_package_rates filternél a prioritást állítani? Továbbá, a wp_ajax_wc_sc_shipping_ajax_handler hívásakor mindig felülírod a munkamenetben a shipping_calculated_cost értékét, holott azt sejtem nem mindig létezik az a $_POST['shipping_cost']. Ezt is ellenőrizni kellene. Első körben ezeket nézd meg.
    Mutasd a teljes hozzászólást!
  • Azt az értéket csak ajax híváskor írom felül ezzel:

    var jQuery, ajax jQuery(document).ready(function () { /* Szallítási mod választása esetwn ujra szamolja a vegosszeget. */ jQuery(document).on('change', '.shipping', function () { //jQuery(this).attr('checked', true); //e.preventDefault(); var shippingCost, oldShippingCost; shippingCost = jQuery('input[name=shipping]:checked').val(); jQuery('input[name=shipping]:not(:checked)').removeAttr('checked'); jQuery('input[name=shipping]:checked').attr('checked', true); oldShippingCost = jQuery('input[name=shipping]:not(:checked)').val(); jQuery.ajax({ 'url': ajax.url, 'type': 'POST', 'data': { 'action': 'wc_sc_shipping_ajax_handler', 'shipping_cost': shippingCost, 'old_shipping_cost': oldShippingCost, }, success: function ( response ) { //window.location.href = href console.log(response); jQuery('body').trigger('update_checkout'); jQuery(document.body).trigger('wc_fragments_refreshed'); }, error: function (XMLHttpRequest, textStatus, errorThrown){ console.log(textStatus); } }) }) }) Tehát elvileg csak POST esetén kellene felül írnia, de csak egyszer fut le sajnos
    Mutasd a teljes hozzászólást!
  • OK. Azaz ha jól értem, a woocommerce_package_rates nem fut le akkor amikor a checkout oldalon másik módot választasz? Ha ez a gond, akkor használj ott másik hook-ot, pl. a woocommerce_shipping_method_chosen nevűt. Kérj le itt minden élő szállítási módot és módosítsd amit szükséges. Ezt is nézd meg:

    get_shipping_methods() return empty rate arary

    Szerintem nem jó ötlet az hogy AJAX-al adod át kliens oldalról az árat. Ezeket mind szerver oldalon kellene intézni egy olyan hook-ban ami mindig, minden szükséges oldalon lefut, azaz például az is_checkout() oldalakon. Szerintem.
    Mutasd a teljes hozzászólást!
  • Igen, az a probléma, hogy nem módsul a szállítási költség amikor másikat választok

    public function WoocommerceCartTemplateLoader($located, $template_name, $args, $template_path, $default_path){ if ('cart/cart-shipping.php' === $template_name) { $located = $this->pluginPath . 'templates/front/cart/shipping.php'; } } Ezzel eleve ugye egy másik templatet töltök be, amivel kiolvastatom a termék attributumából a szállítási költséget.
    Ahogy látom a probém az lehet, hogy a POST során valamiért NULL az értéke a $rates változónak, amit ugye vár a függvény, hogy módosítani tudja az árát.
    Mutasd a teljes hozzászólást!
  • Nézd meg amit linkeltem oldalt, ott is küzdenek hasonlóval.
    Mutasd a teljes hozzászólást!
  • áá sajnos ez a függvény WC()->shipping->get_shipping_methods(); nem ugyanazt adja vissza, mint, amikor először lefut a woocommerce_package_rates filter. Így nem is lehet felülírni az eredeti tömb tartalmát (cost).

    Ez valami védelem lehet woocommerce részéről. Így sajnos felejtős lesz ez a custom shipping method.
    Mutasd a teljes hozzászólást!
  • Csináltam egy costum shipping methodot ez alapján:
    Create a WooCommerce Custom Shipping Method Plugin

    és érdekes ezzel megy az ajax shipping cost frissítés.
    Mutasd a teljes hozzászólást!
  • Ez a korrekt megoldás (a saját fizetési mód használata).
    Mutasd a teljes hozzászólást!
abcd