Przydatne filtry, akcje, funkcje i ciekawe zastosowania dla Woocommerce

Woocommerce jest platformą nadal się rozwijającą i do mniejszych sklepów nadaje się idealnie – jest prosty w obsłudze, posiada stosy różnych integracji i rozszerzeń, ale nie wszystko jest podane na tacy, czasami potrzebujemy wyłączyć jakąś funkcję, czy zmienić funkcjonalność i oficjalna dokumentacja nie odnosi się do naszego problemu w żaden sposób, poza potwierdzeniem, że jakaś funkcja faktycznie istnieje.

Podstawowe funkcje i warunki znajdziecie w dokumentacji Woo, snippety dla front-endu tutaj, ogólne tutaj, a przeznaczone dla modyfikacji motywów tutaj.

//Komentarze w kodzie oznaczone są w języku angielskim.


Kody dla szablonów motywu

Poniższe kody możemy zamieszczać bezpośrednio w plikach typu single-product.php itp.

Funkcja umożliwiająca określenie, czy kategoria zawiera podkategorie


<?php
    $term = get_queried_object(); // get the current taxonomy term
					
    // Checks for subcategories
    $terms = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); // get current term
    $parent = get_term($terms->parent, get_query_var('taxonomy') ); // get parent term
    $children = get_term_children($terms->term_id, get_query_var('taxonomy')); // get children                                
?>

<?php if( ($term->parent && sizeof($children)>0) ) { ?>
// Some function if current category have subcategories
<?php } elseif(($term->parent) && (sizeof($children)==0)) { ?>
// Some function if current category doesn't have any subcategories
<?php } ?>

Funkcja sprawdzająca, czy dany produkt ma atrybuty


<?php 
    $_product = wc_get_product(get_the_id()); 
    if ($_product->has_attributes()) :
        //Magic happens here, for example output product attributes:
        echo wc_display_product_attributes( $product ); ?>
    endif;
?>

Kody dla pliku funkcji

Poniższe kody zamieszczamy w pliku functions.php aktywnego motywu.

Niezależny, własny formularz wyszukiwania produktów

„Niezależny” oznacza, że wyszukiwania są ograniczone jedynie do produktów – nie przeszukują innych taksonomii.


// Custom product search form widget
function woo_custom_product_searchform( $form ) {
 
    $form = '<form role="search" method="get" id="searchform" class="searchform" action="' . esc_url( home_url( '/'  ) ) . '">
		<div>
			<label class="screen-reader-text" for="s">' . __( 'Search for:', 'woocommerce' ) . '</label>
			<input type="hidden" class="" value="product" name="post_type" />
			<input class="search-widget" type="text" value="' . get_search_query() . '" name="s" id="s" placeholder="' . __( 'Type name or product code...','my_theme' ) . '" />
		</div>
	</form>';
    return $form;
 
}
add_filter( 'get_product_search_form' , 'woo_custom_product_searchform' );

Placeholder możemy zmienić na własny rzecz jasna.

Jeśli chcemy, żeby wyszukiwarka przeszukiwała również inne taksonomie, to usuwamy po prostu linię:


<input type="hidden" class="" value="product" name="post_type" />

Wyłączanie funkcji sklepowych, czyli „tryb katalogowy”

Woo niestety obecnie nie posiada tak fajnej funkcji jak Prestashop, mam na myśli „Tryb katalogowy”, więc po prostu musimy ręcznie wyłączyć funkcje sklepowe, czyli m.in. koszyk lub cenę.


// Disables shopping functionality from Woocommerce on the frontend
function woocatalogue() {

    remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );

}
add_action( 'init', 'woocatalogue' );

Wyłączanie zakładek z panelu „Dane produktu”

Po kolei: ustawienia główne, magazyn, wysyłka, powiązane produkty, atrybuty, zaawansowane. Jeśli potrzebujemy usunąć tylko jedną zakładkę, to zostawiamy ją na liście (wybrana linia unset), a resztę usuwamy.


// Removes unused tabs from Woocommerce admin area
function remove_tab($tabs){
    
    unset($tabs['general']);
    unset($tabs['inventory']);
    unset($tabs['shipping']);
    unset($tabs['linked_product']);
    unset($tabs['attribute']);
    unset($tabs['advanced']);

    return($tabs);
}
add_filter('woocommerce_product_data_tabs', 'remove_tab', 10, 1);

Usuwanie wariacji przedmiotu

Mowa o tym. Podobnie jak wyżej mamy możliwość selektywnego wybrania, czego się pozbyć.


// Removes unused product variables from Woocommerce admin area
function remove_product_types( $types ){

    unset( $types['grouped'] );
    unset( $types['external'] );
    unset( $types['virtual'] );
    unset( $types['downloadable'] );
    unset( $types['variable'] );

    return $types;
}
add_filter( 'product_type_selector', 'remove_product_types' );

Selektywne wybieranie lub usuwanie domyślnego sortowania

Mowa o tym.

Całkowite usunięcie sortowania:


//Removes default sorting
function remove_woo_sorting() {
    remove_action( 'woocommerce_after_shop_loop', 'woocommerce_catalog_ordering', 10 );
    remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 10 );
}
add_action( 'init', 'remove_woo_sorting' );

Selektywne usuwanie:


// Disables unused sorting options
function woocommerce_catalog_orderby( $orderby ) {

    unset($orderby["menu_order"]); //default sorting
    unset($orderby["popularity"]);
    unset($orderby["rating"]);
    unset($orderby["date"]);
    unset($orderby["price"]);
    unset($orderby["price-desc"]);
	
    return $orderby;

}
add_filter( "woocommerce_catalog_orderby", "woocommerce_catalog_orderby", 20 );

Usuwanie domyślnych zakładek produktu


// Disable product tabs from woocommerce_after_single_product_summary
function woo_remove_product_tabs( $tabs ) {

    unset( $tabs['description'] );      	
    unset( $tabs['reviews'] ); 			
    unset( $tabs['additional_information'] );  	

    return $tabs;

}
add_filter( 'woocommerce_product_tabs', 'woo_remove_product_tabs', 98 );

Więcej na temat zakładek znajdziecie w oficjalnej dokumentacji – tutaj również dowiecie się jak dodać własne zakładki bez używania ociężałych wtyczek 🙂


Całkowite wyłączenie SKU


// Removes SKU function from woocommerce
add_filter( 'wc_product_sku_enabled', '__return_false' );

Przełączenie produktów powiązanych na wyświetlanie wedle tagów, zamiast kategorii


// Disable products related by category in woocommerce, shows related by tag instead
add_filter( 'woocommerce_output_related_products_args', function( $args ) { 
    $args = wp_parse_args( array( 'posts_per_page' => 5, 'orderby' => 'title', 'order' => 'ASC' ), $args );
    return $args;
});

add_filter( 'woocommerce_product_related_posts_relate_by_category', function() {
    return false;
});

Selektywne ukrywanie zakładek głównych Woocommerce’a

Zaznaczam, że zakładki są tylko ukrywane w panelu – nadal jest do nich dostęp za pomocą bezpośrednich odnośników.


// Hides unused admin items
function nstrm_remove_admin_submenus() {

    remove_submenu_page('woocommerce', 'wc-addons');
    remove_submenu_page('woocommerce', 'wc-status');
    remove_submenu_page('woocommerce', 'wc-reports');
    remove_submenu_page('woocommerce', 'edit.php?post_type=shop_order');
    remove_submenu_page('woocommerce', 'edit.php?post_type=shop_coupon');
}
add_action( 'admin_menu', 'nstrm_remove_admin_submenus', 999 );

Usuwanie kategorii z widgetu listy kategorii produktów

Numerek 999 to nr ID kategorii, który zmieniamy na własny. Array przyjmuje również więcej, niż jedno id – wystarczy dodać po przecinku następne numery. W sieci można znaleźć co prawda krótsze kody, ale działają one tylko dla strony głównej sklepu – nie obejmują podstron kategorii, czy produktów.


// Hides selected categories form listings
function exclude_product_categories_widget( $list_args ) {

    $categories = array('999');

    if(isset( $list_args['include'])):
        $included_ids =  explode( ',', $list_args['include'] );
        $included_ids = array_unique( $included_ids );
        $included_ids = array_diff ( $included_ids, $categories );
        $list_args['include'] = implode( ',', $included_ids);

    else: $list_args['exclude'] = $categories; endif;
	return $list_args;
}
add_filter( 'woocommerce_product_categories_widget_args', 'exclude_product_categories_widget', 10, 1 );

Usuwanie kategorii głównej z bezpośrednich odnośników produktu

Po dodaniu kodu należy odbudować indeks (zwyczajnie kliknąć „zapisz zmiany” w Ustawienia > Bezpośrednie odnośniki).


// Removes parent category from permalinks in woocommerce
function remove_parent_category_from_url( $args ) {
    $args['rewrite']['hierarchical'] = false;
    return $args;
}
add_filter( 'woocommerce_taxonomy_args_product_cat', 'remove_parent_category_from_url' );

Własne tłumaczenia

Ok, Woocommerce w dokumentacji wspomina , w jaki sposób stworzyć własne tłumaczenie w oddzielnym pliku i uodpornić je na aktualizacje wtyczki, ale umówmy się – jeśli potrzebujemy zmienić zdanie, bądź dwa, to jest to troszkę przerost formy nad treścią. Do tego możemy zwyczajnie wykorzystać filtr typu gettext.


function translate_woocommerce_strings( $translated, $text, $domain ) {
 
    // First string to translate
    $translated = str_ireplace( 'Sale!', 'OUR NEW OFFER!', $translated );

    // Second string to translate
    $translated = str_ireplace( 'Product Description', 'About our product', $translated );
 
    return $translated;

}
add_filter( 'gettext', 'translate_woocommerce_strings', 999, 3 );

Pierwszy tekst w str_ireplace to oryginalne tłumaczenie, natomiast drugie to nasze własne. Tłumacząc przykładowo na polski:


$translated = str_ireplace( 'Sale!', 'Super promocja!', $translated );

W ten sposób możemy tłumaczyć dowolną ilość tekstów. Jednak jeśli faktycznie planujemy zmieniać większą ilość tekstów (licząc w dziesiątkach i więcej), to oddzielny plik .mo będzie bardziej praktycznym i przede wszystkim wygodniejszym wyborem.


Podsumowanie

To oczywiście tylko niewielka część przykładów zastosowań dla Woo – w sieci znajdziecie tego o wiele więcej, choćby w pojedynczych wątkach Stackoverflow, czy blogu Business Bloomer (tutaj jest tego naprawdę sporo, plus funkcje są sensownie napisane i skomentowane). Jeroen Sormani też czasami wrzuci ciekawe wpisy na swojego bloga – szczególnie interesujący jest jego wpis dotyczący pól zamówień/billingu.

Niestety nie znalazłem nic ciekawego dot. Woo na polskich blogach (tj. faktycznie użytecznego), także na chwilę obecną pozostaję z powyższymi linkami.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Jasny / Ciemny