WooCommerce Koristni Snippeti
7 naročnikov
7 naročnikov
Pozdravljeni,
Kot sem že omenila pred kratkim delamo na selitvi trgovine z preste na woocommerce.
Gleda na to, da je po defaultu WooCommerce kar oskubljen kar se funkcionalnosti tiče in so vsi plugini kar dragi (tisti malo bolj koristni), sploh glede na to, da je treba za vsako figo kupit plugin al pa kodo spreminjat/dodajat, sem se odločila, da odprem to temo kjer bi delili kakšen uporaben snippet, torej kodo s katero bi dodali ali razdelali določene funkcije, ki jih po defaultu pogrešamo.
Sama sem prosila fanta, da deli kakšen snippet in za začetek imam priravljenih nekaj malenkosti...
Naj prvo povem za tiste, ki ne vedo kam to dodajati, da morajo iti v theme editor, tam poiščejo functions.php in čisto na koncu tega fajla vpisujejo te kode.
#1. V adminu, na seznamu izdelkov sem zelo pogrešala število artiklov, ki so na zalogi, saj po defaultu piše samo "in stock" ali "out of stock", nič pa ne vemo koliko jih je dokler izdelka ne odpremo.
takole izgleda po defaultu:
http://imgur.com/a/677pC
in takole po dodani kodi:
http://imgur.com/a/OluZ5
Koda:
//pokaži količino zaloge v admin products list
addfilter( 'woocommerceadminstockhtml', 'tmtshowvariationstocklevel', 10, 2 );function tmtshowvariationstocklevel( $stockhtml, $theproduct ) {
if( sizeof( $the_product->get_children() ) ) { $stock_html .= ' (' . $the_product->get_total_stock() . ')'; } return $stock_html;
}
#2. Ko nekdo prekliče naročilo ali pa ga vrne in podobno se v woocommercu zaloga ne povrne avtomatsko nazaj ampak moraš to ročno storiti sam...
Da bi naredili avtomatski RESTOCK uporabimo naslednjo funkcijo/kodo:
//Auto restock function
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if ( ! classexists( 'WCAutoStockRestore' ) ) {
class WCAutoStockRestore {
public function _construct() {
addaction( 'woocommerceorderstatusprocessingtocancelled', array( $this, 'restoreorderstock' ), 10, 1 );
addaction( 'woocommerceorderstatuscompletedtocancelled', array( $this, 'restoreorderstock' ), 10, 1 );
addaction( 'woocommerceorderstatuson-holdtocancelled', array( $this, 'restoreorderstock' ), 10, 1 );
addaction( 'woocommerceorderstatusprocessingtorefunded', array( $this, 'restoreorderstock' ), 10, 1 );
addaction( 'woocommerceorderstatuscompletedtorefunded', array( $this, 'restoreorderstock' ), 10, 1 );
addaction( 'woocommerceorderstatuson-holdtorefunded', array( $this, 'restoreorderstock' ), 10, 1 );
} // End _construct()
public function restoreorderstock( $orderid ) {
$order = new WCOrder( $orderid );
if ( ! getoption('woocommercemanagestock') == 'yes' && ! sizeof( $order->getitems() ) > 0 ) {
return;
}
foreach ( $order->getitems() as $item ) {
if ( $item['productid'] > 0 ) {
$product = $order->getproductfromitem( $item );
if ( $product && $product->exists() && $product->managingstock() ) {
$oldstock = $product->stock;
$qty = applyfilters( 'woocommerceorderitemquantity', $item['qty'], $this, $item );
$newquantity = $product->increasestock( $qty );
doaction( 'woocommerceautostockrestored', $product, $item );
$order->addordernote( sprintf( _( 'Item #%s stock incremented from %s to %s.', 'woocommerce' ), $item['productid'], $oldstock, $newquantity) );
$order->sendstocknotifications( $product, $newquantity, $item['qty'] );
}
}
}
} // End restoreorderstock()
}
$GLOBALS['wcautostockrestore'] = new WCAutoStockRestore();
}
Takole, to sta prvi dve za pokušino... več pa še pride. :)
Upam, da se najde kdo, ki mu bo to koristilo.
15 odgovorov
Opcija, da skrijes dolocene fielde v kosarici - link na GitHub, tukaj je sicer se dodan (dobrodosel) pogoj ko gre za virtualne produkte, ko ne rabis shippmenta/podjetja in ostalih fieldov.
perunpro:
Opcija, da skrijes dolocene fielde v kosarici - link na GitHub, tukaj je sicer se dodan (dobrodosel) pogoj ko gre za virtualne produkte, ko ne rabis shippmenta/podjetja in ostalih fieldov.
sam tukaj je ena napaka na tej povezavi, ker je vse napisano za billing, v resnici bi mogl bit tud shipping umes...
takole bi mogla zgledat koda (s tem, da tukaj nimam vpisanih vseh opcij, samo za vzorc)
// odstrani polja v košarici oziroma na blagajni
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
unset($fields['billing']['billing_company']);
unset($fields['billing']['billing_address_2']);
unset($fields['billing']['billing_country']);
unset($fields['shipping']['shipping_company']);
unset($fields['shipping']['shipping_address_2']);
unset($fields['shipping']['shipping_country']);
return $fields;
}
Ker imamo posebej billing in shipping option je treba to posebej definirat in ne vse enako kot tam na zgornji povezavi.
Evo še nekaj malenkosti, ki mogoče komu prav pridejo...
Sej veste tisto nerodno reč, ki jo imate na CHECKOUT strani, ko je po defoltu viden vnos podatkov za billing in za shipping (če se razlikuje od bilinga) in potem lahko daš kljukico stran, da se skrije ta del za shipping podatke...
No tale linija kode vam bo samodejno odstranila to kljukico in potem bodo stranke morale dodati kljukico samo takrat kadar se bosta naslova dejansko razlikovala.
// Uncheck "Ship to different address" checkbox
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );
Naslednja linija je za tiste, ki imajo omogočen tudi nakup kot gost brez registracije... na checkout page imate checkbox, ki ga lahko označite v kolikor želite ob nakupu tudi račun ustvariti z uporabljenimi podatki...
Ta koda avomatsko doda kljukico in potem mora stranka v kolikor ne želi ustvariti računa ob nakupu odstraniti kljukico.
// Auto check "create account" checkbox
add_filter('woocommerce_create_account_default_checked' , function ($checked){
return true;
});
upam, da ne zvenim tako zmedeno, kot se meni zdi zdaj, ko to preberem :)
jaz npr. nikakor ne najdem delujoce resitve, kako na product page umestiti 2 add to cart buttna. ce c/p originalni snippet mi potem vedno poscrolla nazaj do prvega, probal sem pa tud z nekim shortcode, ki sicer lepo podvoji title in add to cart, vendar ne deluje.. rad bi imel en cta v glavi in enega na koncu product page vsebine. ve kdo, kako se to naredi?
sicer pa top tema, koristni hacki, hvala.
wssrpnc:
jaz npr. nikakor ne najdem delujoce resitve, kako na product page umestiti 2 add to cart buttna. ce c/p originalni snippet mi potem vedno poscrolla nazaj do prvega, probal sem pa tud z nekim shortcode, ki sicer lepo podvoji title in add to cart, vendar ne deluje.. rad bi imel en cta v glavi in enega na koncu product page vsebine. ve kdo, kako se to naredi?sicer pa top tema, koristni hacki, hvala.
2 gumba maš lahko, to ni problem z uporabo query urlja, vendar je potem dodatna težava drugje... težava se pojavi pri tem, da ta query ostane in potem pri vsaki ovežitvi strani število izdelka v košarici raste... edini način kako to preprečiti je, da naštimaš možnost dodajanja samoe enega enakega izdelka, kar pride prav mogoče pri kakih download trgovincah, pri fizičnih stvareh pa nikakor, saj želiš, da lahko stranke dodajo več komadov enakega izdelka
Evo nekaj za vse tiste, ki jih mogoče moti merilec moči gelsa na registracijski strani... z naslednjim snippetom ga odstranite :)
//REMOVE PASSWORD STRENGHT REQUIREMENT
function wc_ninja_remove_password_strength() {
if ( wp_script_is( 'wc-password-strength-meter', 'enqueued' ) ) {
wp_dequeue_script( 'wc-password-strength-meter' );
}
}
add_action( 'wp_print_scripts', 'wc_ninja_remove_password_strength', 100 );
Avtomatsko osveževanje košarice (ko spremeniš količino, se cena avtomatsko posodobi). Samo še v css skriješ gumb in je košarica malo bolj clean.
add_action( 'wp_footer', 'cart_update_qty_script' );
function cart_update_qty_script() {
if (is_cart()) :
?>
<script>
jQuery('div.woocommerce').on('change', '.qty', function(){
jQuery("[name='update_cart']").removeAttr('disabled');
jQuery("[name='update_cart']").trigger("click");
});
</script>
<?php
endif;
}
Spodnji snippet avtomatsko nastavi poštnino na "brezplačno", ko ima kupec v košarici dovolj velik znesek in skrije preostale poštnine.
/* Free Shipping Code start here */
function my_hide_shipping_when_free_is_available( $rates ) {
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
$free[ $rate_id ] = $rate;
break;
}
}
return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );
@Luka93 - slaba stvar te kode, ki si jo napisal je da je končna, mislim ne daje ti nobenih opcij...
Sama imam nastavljeno tako, da recimo kljub temu, da je kupec upravičen do brezplačne dostave ima na voljo tudi osebni prevzem.
Seveda, če tega ne rabiš nobenih dodatnih opcij je itak vseeno. :)
Res je, v tem primeru so na spodnjem linku še dodatne možnosti:
https://docs.woocommerce.com/document/hide-other-shipping-methods-when-free-shipping-is-available/