Woocommerce - Szállítás korlátozása településekre

Szevasztok.





A Woocommerce webáruháznál a Szállítási beállításoknál van lehetőség a Szállítás korlátozására, de csak országra. Én városokra is szeretném. Létezik erre egy bővítmény vagy megoldás? Csak adott városokba lehetne rendelni.





A teljes történet, amit sikerült is megoldani:



3000 Ft alatt 400 Ft a szállítási díj, 3000 Ft felett ingyenes. Ártól függetlenül a helyikézbesítés (pl. Kispirics) ingyenes. Ezt sikerült is megoldani.


  • korlátozni szeretném 8-10 településre a rendelést.





    előre is köszönöm a segítséget.


Szia!



Lehet olyan megoldás, hogy felveszel egy új select -et a városok kiválasztásához a checkout -oldalra. Igazából van egy csomó kész filtere (függvénye) a woocommerce-nek, azokat kell kell használni.



Azt így tudod:

<br />
/**<br />
* [Add] -> Varos select<br />
*<br />
*/<br />
<br />
add_action( 'woocommerce_after_order_notes', 'sz_varos_select_field' );<br />
<br />
function sz_varos_select_field( $checkout ) {<br />
<br />
echo '<div id="sz_input_filed"><h2>' . __('Város kiszállítási cím') . '</h2>';<br />
<br />
woocommerce_form_field( 'sz_varos', array(<br />
'type'          => 'select',<br />
'required'      => true,<br />
'options' 		=> array(<br />
'' 				=> 'Válasszon!',<br />
'martely' 		=> 'Mártély',<br />
'miskolc' 		=> 'Miskolc'),<br />
'class'         => array('sz_varos-class form-row-wide'),<br />
'label'         => __('Hová szállítsuk? <span style="color: red;font-weight: bold">(Kötelező)</span>'),<br />
), $checkout->get_value( 'sz_varos'));<br />
<br />
echo '</div>';<br />
}<br />

```<br />
Most a példában Mártély meg Miskolc van, de az array-ben tudsz még hozzáadni. Eddig ez semmit nem csinál, csak megjelenik egy select ami kötelező kitölteni, azaz választani.<br />
 <br />
Ezután a woocommerce hibát hozzá kell kapcsolni, hogy ha nem választanak várost, és elküldenék a megerendelést, akkor a hibaüzenetben jelenjen meg, hogy nem lett ez kiválasztva, így:<br />

/**
* [Process checkout] -> post tömb->sz_varos
*/
add_action('woocommerce_checkout_process', 'sz_varos_checkout_field_process');

function sz_varos_checkout_field_process() {
global $woocommerce;

// Check if set, if its not set add an error.
if ( !$_POST){
wc_add_notice( __( 'Nem lett szállítási város kiválasztva!' ), 'error' );
}
}

Ezzel már fel van véve az, hogy error-ban jelenjen meg. A felhasználó kap visszajelzést. <br />
 <br />
De ezzel nem jelenik meg a város sehol (pl.: megrendelés leadása után betöltődik egy összefoglaló oldal. Annak, aki rendelet. Ebben nem jelenik meg a kiválasztott város. Ahhoz, hogy megjelenjen kell egy meta is hozzá)<br />
 <br />
Ezt a meta regisztrációt így lehet felvinni (hogy bekerüljön az adatbázisba!):<br />

/**
* [sz_varos meta regisztrálás] -> metába kerül!
**/
add_filter('woocommerce_email_order_meta_keys', 'sz_varos_checkout_field_order_meta_keys');

function sz_varos_checkout_field_order_meta_keys( $keys ) {

$keys[] = 'sz_varos_meta';
return $keys;
}

Ezzel létre lett hozva a meta, abba bekerül a kiválasztott város. Ezt meg kell jeleníteni több helyen is. Ilyen a megrendelés leadása utána összefoglaló oldal:<br />

/**
* [Add] vásárálás után visszaigazoló (order-received) oldalra
**/

add_action( 'woocommerce_order_details_after_order_table', 'sz_varos_custom_field_display_cust_order_meta', 10, 1 );

function sz_varos_custom_field_display_cust_order_meta($order){

$sz_varos_cim=get_post_meta( $order->id, 'sz_varos_meta', true );

if( ! empty( $sz_varos_cim) ) {
echo '

'.__('Kiszállítási város:').'

' . $sz_varos_cim . '';
}
}

De még mindig nem vagyunk készen, mert ha te (webshop üzemeltető, az admin) a woocommerce orders oldalon is látni akarod, melyik várost választotta a megrendelő, akkor oda is be kell tenni a várost (részletek nézetben a leadott megrendelésben), + updatélni kell a létrehozott metát (ahol tárolódik a város) + megrendelési oldalon ezt meg kell jeleníteni:<br />

/**
* [Update] sz_varos
*/
add_action( 'woocommerce_checkout_update_order_meta', 'sz_varos_checkout_field_update_order_meta' );

function sz_varos_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST ) ) {
update_post_meta( $order_id, 'sz_varos_meta', sanitize_text_field( $_POST ) );
}
}

/**
* [Edit Order] page -> megjelenítjük a megerdenlési oldalon a sz_varos_meta-t (de a )
*/
add_action( 'woocommerce_admin_order_data_after_billing_address', 'sz_varos_checkout_field_display_admin_order_meta', 10, 1 );

function sz_varos_checkout_field_display_admin_order_meta($order){
echo '

'.__('Szállítási város:').' ' . get_post_meta( $order->id, 'sz_varos_meta', true ) . '

';
}

Az egész kód így néz egyben: <a href="http://pastebin.com/9pH0nh0G">http://pastebin.com/9pH0nh0G</a><br />
 <br />
A sablonod functions.php-jába kell tenni.<br />
 <br />
Egy bővítmény írásánál pont ezek jöttek elő. A kódot kipróbáltam localhost-on működik. Tesztelni kell, meg nem tudom mindent összefoglaltam-e. <br />
 <br />
Doksi a függvényekhez: <a href="http://docs.woothemes.com/documentation/plugins/woocommerce/%C2%A0">http://docs.woothemes.com/documentation/plugins/woocommerce/ </a><br />
 <br />
 <br />
Ü: András

Köszönöm.



Az elegáns megoldás az lenne ha nem kellene pluszba még beírni a várost a cím megadásánál. Ott lenne a legördülő település lista. Így kétszer van megadva.



köszönöm.

Szia!



Teljesen logikus, én meg egyből túlbonyolítottam az új mezővel, nem tudom miért. :slight_smile:



A fenti példa akkor új select /input beszúrását mutatja, lehetne unset-elni a meglévő city-ket, de át is alakíthatóak a meglévők legördülősre.



Itt van a lényeg: http://docs.woothemes.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/



A meglévő fileds-eket (ezek az űrlap elemei) felül lehet írni, ezeket egy tömbben tárolják és át lehet definiálni őket pl select-típusra is.



Minden fields lehet: text, textarea, password, select



Nektek a select kell + az options array-be felvenni a városokat, így:

<br />
/// Filter:<br />
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );<br />
<br />
<br />
function custom_override_checkout_fields( $fields ) {<br />
<br />
//számlázó felülírása -> city input<br />
$fields = 'select';<br />
$fields = array(<br />
'' => 'Válassz várost',<br />
'Miskolc' => 'Miskolc',<br />
'Mártély' => 'Mártély'<br />
);<br />
<br />
//szállítás másik címre felülírása -> city input<br />
$fields = 'select';<br />
$fields = array(<br />
'' => 'Válassz várost',<br />
'Miskolc' => 'Miskolc',<br />
'Mártély' => 'Mártély'<br />
);<br />
<br />
<br />
return $fields;<br />
}<br />

```<br />
Ennyi lenne. (Ezekre elvileg működik az ellenőrzés meg minden, bekerülnek az adatbázisba, orders-page oldalra stb, hiszen egy meglévő inputot használunk. Feltételezem.)<br />
 <br />
A "//számlázó felülírása city" alatti részt kiszedhetitek, ha nem kell, mert lehet más a megrendelő telephelye, azt csak betettem példának.<br />
 <br />
András

Nagyon jól müküdik. köszönöm szépen.

Sziasztok!





Valami hasonlóra lenne nekem is szükségem.



Egy pizzéria webshopját csinálnám és egy olyan igény merült fel, hogy a települések korlátozásán felül a településeknél megvan határozva a minimális rendelés és a szállítási díj is.





Ezt kéne valahogy megoldanom.



Van rá egyszerű megoldás?



Alakul ez kérem szépen.





A fenti leírás alapján bevittem a városokat a rendszerbe.



Hosszas keresgélés után rátaláltam a megfelelő bővítményre, mellyel a városokhoz tudok kiszállítási díjat rendelni.





A neve: Woocommerce Advanced Shipping









Remélem tudtam segíteni a hasonló vízben evezőknek…

Most viszont úgy néz ki elakadtam és WP mágusra lesz szükség.





Találtam egy leírást, kódot, ezzel próbálnám beállítani a településekhez a minimális rendelési összeget.





Már szinte mindent megpróbáltam, de nem látom a hibát, és ha ezt a kódrészletet beillesztem a functions.php-ba, akkor 500-as hibakóddal elszáll az egész weboldal.






<br />
/// Minimum kosár érték beállítása városokhoz<br />
add_action( 'woocommerce_check_cart_items', __NAMESPACE__ . '\spyr_set_min_total' );<br />
<br />
function spyr_set_min_total() {<br />
<br />
// Only run in the Cart or Checkout pages<br />
<br />
global $woocommerce;<br />
<br />
if( ( is_cart() || is_checkout()) && "Kerepes" == WC()->customer->shipping_city )<br />
<br />
// Minimum kosár részöszeg<br />
$minimum_cart_total = 1000;<br />
<br />
// Total we are going to be using for the Math<br />
// This is before taxes and shipping charges<br />
$total = WC()->cart->subtotal;<br />
<br />
// Értékek összehasonlítása a részösszeggel és hibaüzenet<br />
// Ha kevesebb, mint az előírt minimum<br />
// Ez az üzenet jelenik meg<br />
// A minimum összeg jelen esetben 1000 Ft<br />
// Aktuális részösszeg pl. 500 Ft<br />
if ( $total <= $minimum_cart_total  ) {<br />
// Hibaüzenet kiírása<br />
wc_add_notice(<br />
sprintf(<br />
'Vásárlásod nem éri el a minimális 1000 Ft-ot.' .<br />
'Kosarad értéke: %s %s',<br />
$total,<br />
get_option( 'woocommerce_currency' )<br />
),<br />
'error'<br />
);<br />
}<br />
}<br />
}<br />

A fenti kóddal továbbra sem akar összejönni a városokhoz rendelt minimális rendelési összeg beállítása, viszont “kitaláltam” egy ideiglenes megoldást.





A fentebb említett Woocommerce Advanced Shipping bővítményben létrehozok még egy feltételt a szállításhoz.



Vagyis például Csömörre a kiszállítás ingyenes, viszont a minimális rendelés 1000 Ft.



Ha valamelyik feltétel nem teljesül, nincs kiválasztva a település vagy nem éri el a kosár értéke az 1000 Ft-ot, akkor nincs elérhető szállítási mód.









Mivel a kedves vevő csak nézne, mint borjú az új kapura, hogy mi az, hogy nincs kiszállítási mód, meg ugye nem tudná, miért nincs, emiatt ezt a részt a woocommerce fordításban átírtam, így tájékoztatva a vevőt, miért nem tudja megrendelni a terméket.







Még valami eszembe jutott, nem tudom van-e erre is egyszerű megoldás.





Pizzéria esetén ugye van rendelési felvételi idő, jelen esetben még egy hétfői zárva tartás is.





Valahogy meg kéne oldanom, hogy csak a megadott időben lehessen a rendelést elküldeni.





Ötlet?

Hali!





Nekünk ez van fent 4.2.7. alatt és működik.



https://wordpress.org/plugins/wp-opening-hours/