• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Важно! 50 полезных сниппетов для WooCommerce. Часть первая.

D&B

Администратор
Команда форума
Местный
Подборка сниппетов-кодов от популярного, западного WP разработчика множества WooCommerce плагинов - Remi

[h2]Первая часть из 25 WooCommerce сниппетов:[/h2]
1. Добавить способ оплаты в админ-email woocommerce
Код:
add_action( 'woocommerce_email_after_order_table', 'add_payment_method_to_admin_new_order', 15, 2 );
function add_payment_method_to_admin_new_order( $order, $is_admin_email ) {
  if ( $is_admin_email ) {
    echo '<p><strong>Payment Method:</strong> ' . $order->payment_method_title . '</p>';
  }
}
2. Дополнительные товары на странице/в ряду
Код:
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 );
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_upsells', 15 );
if ( ! function_exists( 'woocommerce_output_upsells' ) ) {
    function woocommerce_output_upsells() {
        woocommerce_upsell_display( 3,3 ); // Display 3 products in rows of 3
    }
}
3. Удаление товарной категории с главной страницы магазина
Код:
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );

function custom_pre_get_posts_query( $q ) {
    if ( ! $q->is_main_query() ) return;
    if ( ! $q->is_post_type_archive() ) return;
  
    if ( ! is_admin() && is_shop() && ! is_user_logged_in() ) {
        $q->set( 'tax_query', array(array(
            'taxonomy' => 'product_cat',
            'field' => 'slug',
            'terms' => array( 'color', 'flavor', 'spices', 'vanilla' ), // Don't display products in these categories on the shop page
            'operator' => 'NOT IN'
        )));
  
    }
    remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
4. Быстрый перевод любого ярлыка-ценника
Код:
add_filter('gettext',  'translate_text');
add_filter('ngettext',  'translate_text');
function translate_text($translated) {
     $translated = str_ireplace('Choose and option',  'Select',  $translated);
     return $translated;
}
5. Исключить категорию из виджета woocommerce -категории
Код:
add_filter( 'woocommerce_product_categories_widget_args', 'woo_product_cat_widget_args' );

function woo_product_cat_widget_args( $cat_args ) {
  
    $cat_args['exclude'] = array('16');
  
    return $cat_args;
}
6. Добавить произвольное поле во вкладку «вариативный товар»
Код:
//Display Fields
add_action( 'woocommerce_product_after_variable_attributes', 'variable_fields', 10, 2 );
//JS to add fields for new variations
add_action( 'woocommerce_product_after_variable_attributes_js', 'variable_fields_js' );
//Save variation fields
add_action( 'woocommerce_process_product_meta_variable', 'variable_fields_process', 10, 1 );
function variable_fields( $loop, $variation_data ) {
?>  
    <tr>
        <td>
            <div>
                    <label></label>
                    <input type="text" size="5" name="my_custom_field[]" value=""/>
            </div>
        </td>
    </tr>

<tr>
        <td>
            <div>
                    <label></label>
                  
            </div>
        </td>
    </tr>
<?php
}
function variable_fields_process( $post_id ) {
    if (isset( $_POST['variable_sku'] ) ) :
        $variable_sku = $_POST['variable_sku'];
        $variable_post_id = $_POST['variable_post_id'];
        $variable_custom_field = $_POST['my_custom_field'];
        for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
            $variation_id = (int) $variable_post_id[$i];
            if ( isset( $variable_custom_field[$i] ) ) {
                update_post_meta( $variation_id, '_my_custom_field', stripslashes( $variable_custom_field[$i] ) );
            }
        endfor;
    endif;
}
7. Заменить «Товар отсутствует» на «Продано»
Код:
add_filter('woocommerce_get_availability', 'availability_filter_func');

function availability_filter_func($availability)
{
    $availability['availability'] = str_ireplace('Out of stock', 'Sold', $availability['availability']);
    return $availability;
}
8. Отображать «товар уже в корзине» вместо кнопки «добавить в корзину». Изменить текст «добавить в корзину» на странице товара.
Код:
/**
* Change the add to cart text on single product pages
*/
add_filter('single_add_to_cart_text', 'woo_custom_cart_button_text');

function woo_custom_cart_button_text() {

    global $woocommerce;
  
    foreach($woocommerce->cart->get_cart() as $cart_item_key => $values ) {
        $_product = $values['data'];
  
        if( get_the_ID() == $_product->id ) {
            return __('Already in cart - Add Again?', 'woocommerce');
        }
    }
  
    return __('Add to cart', 'woocommerce');
}

/**
* Change the add to cart text on product archives
*/
add_filter( 'add_to_cart_text', 'woo_archive_custom_cart_button_text' );

function woo_archive_custom_cart_button_text() {

    global $woocommerce;
  
    foreach($woocommerce->cart->get_cart() as $cart_item_key => $values ) {
        $_product = $values['data'];
  
        if( get_the_ID() == $_product->id ) {
            return __('Already in cart', 'woocommerce');
        }
    }
  
    return __('Add to cart', 'woocommerce');
}
9. Скрыть количество товара в выводимых категориях
Код:
add_filter( 'woocommerce_subcategory_count_html', 'woo_remove_category_products_count' );

function woo_remove_category_products_count() {
    return;
}
10. Сделать поля для регистрации при оформлении заказа обязательными для заполнения
Код:
add_filter( 'woocommerce_checkout_fields', 'woo_filter_account_checkout_fields' );
function woo_filter_account_checkout_fields( $fields ) {
    $fields['account']['account_username']['required'] = true;
    $fields['account']['account_password']['required'] = true;
    $fields['account']['account_password-2']['required'] = true;

    return $fields;
}
11. Переименовать какую-либо вкладку на странице «Добавить товар»
Код:
add_filter( 'woocommerce_product_tabs', 'woo_rename_tab', 98);
function woo_rename_tab($tabs) {

$tabs['description']['title'] = 'More info';

return $tabs;
}
12. Вывести список категорий товаров woocommerce
Код:
$args = array(
    'number'     => $number,
    'orderby'    => $orderby,
    'order'      => $order,
    'hide_empty' => $hide_empty,
    'include'    => $ids
);

$product_categories = get_terms( 'product_cat', $args );

$count = count($product_categories);
if ( $count > 0 ){
     echo "<ul>";
     foreach ( $product_categories as $product_category ) {
       echo '<li><a href="' . get_term_link( $product_category ) . '">' . $product_category->name . '</li>';
      
     }
     echo "</ul>";
}
13. Заменить заголовок главной страницы магазина
Код:
add_filter( 'woocommerce_page_title', 'woo_shop_page_title');

function woo_shop_page_title( $page_title ) {
  
    if( 'Shop' == $page_title) {
        return "My new title";
    }
}
14. Изменить заголовок виджета
Код:
/*
* Change widget title
*/
add_filter( 'widget_title', 'woo_widget_title', 10, 3);

function woo_widget_title( $title, $instance, $id_base ) {
  
    if( 'onsale' == $id_base) {
        return "My new title";
    }
}
15. Удалить дефолтные установки woocommerce
Код:
add_filter( 'woocommerce_catalog_settings', 'woo_remove_catalog_options' );

function woo_remove_catalog_options( $catalog ) {

    unset($catalog[23]); //Trim zeros (no)
    unset($catalog[22]); //2 decimals
    unset($catalog[21]); //decimal sep (.)
    unset($catalog[20]); //thousand sep (,)
    unset($catalog[19]); //currency position (left)  
    unset($catalog[18]); //currency position (left)  
    unset($catalog[5]); // ajax add to cart (no)  
  
    return $catalog;
}
16. Изменить электронный адрес отправителя в поле «от кого»
Код:
function woo_custom_wp_mail_from() {
        global $woocommerce;
        return html_entity_decode( 'your@email.com' );
}
add_filter(
17. Убрать код из имени в строке «От кого» в электронном сообщении woocommerce
Код:
function woo_custom_wp_mail_from_name() {
        global $woocommerce;
        return html_entity_decode( get_option( 'woocommerce_email_from_name' ) );
}
add_filter( 'wp_mail_from_name', 'woo_custom_wp_mail_from_name', 99 );

function woo_custom_wp_mail_from() {
        global $woocommerce;
        return html_entity_decode( get_option( 'woocommerce_email_from' ) );
}
add_filter( 'wp_mail_from_name', 'woo_custom_wp_mail_from_name', 99 );
18. Вернуть колонку, в которой отображаются ID рекомендуемых товаров
Код:
function woo_get_featured_product_ids() {
    // Load from cache
    $featured_product_ids = get_transient( 'wc_featured_products' );

    // Valid cache found
    if ( false !== $featured_product_ids )
        return $featured_product_ids;

    $featured = get_posts( array(
        'post_type'      => array( 'product', 'product_variation' ),
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'         => '_visibility',
                'value'     => array('catalog', 'visible'),
                'compare'     => 'IN'
            ),
            array(
                'key'     => '_featured',
                'value' => 'yes'
            )
        ),
        'fields' => 'id=>parent'
    ) );

    $product_ids = array_keys( $featured );
    $parent_ids  = array_values( $featured );
    $featured_product_ids = array_unique( array_merge( $product_ids, $parent_ids ) );

    set_transient( 'wc_featured_products', $featured_product_ids );

    return $featured_product_ids;
}
19. Добавить произвольное поле на страницу редактирования адреса
Код:
// add fields to edit address page
function woo_add_edit_address_fields( $fields ) {

    $new_fields = array(
                'date_of_birth'     => array(
                'label'             => __( 'Date of birth', 'woocommerce' ),
                'required'          => false,
                'class'             => array( 'form-row' ),
            ),
        );
      
    $fields = array_merge( $fields, $new_fields );
  
    return $fields;
  
}

add_filter( 'woocommerce_default_address_fields', 'woo_add_edit_address_fields' );
20. Отображать шорткод для товаров, которые в каталоге выставлены на распродажу
Код:
function woocommerce_sale_products( $atts ) {

    global $woocommerce_loop;

    extract(shortcode_atts(array(
        'per_page'  => '12',
        'columns'   => '4',
        'orderby' => 'date',
        'order' => 'desc'
    ), $atts));

    $woocommerce_loop['columns'] = $columns;

    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'ignore_sticky_posts'   => 1,
        'posts_per_page' => $per_page,
        'orderby' => $orderby,
        'order' => $order,
        'meta_query' => array(
            array(
                'key' => '_visibility',
                'value' => array('catalog', 'visible'),
                'compare' => 'IN'
            ),
            array(
                'key' => '_sale_price',
                'value' =>  0,
                'compare'   => '>',
                'type'      => 'NUMERIC'
            )
        )
    );
    query_posts($args);
    ob_start();
    woocommerce_get_template_part( 'loop', 'shop' );
    wp_reset_query();

    return ob_get_clean();
}

add_shortcode('sale_products', 'woocommerce_sale_products');
21. Товары, выставленные на распродажу
Код:
function woo_have_onsale_products() {
  
    global $woocommerce;

    // Get products on sale
    $product_ids_on_sale = array_filter( woocommerce_get_product_ids_on_sale() );

    if( !empty( $product_ids_on_sale ) ) {
        return true;
    } else {
        return false;
    }
  
}

// Example:
if( woo_have_onsale_products() ) {
    echo 'have onsale products';
} else {
    echo 'no onsale product';
}
22. Установить минимальную сумму заказа
Код:
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
function wc_minimum_order_amount() {
    global $woocommerce;
    $minimum = 50;
    if ( $woocommerce->cart->get_cart_total(); < $minimum ) {
           $woocommerce->add_error( sprintf( 'You must have an order with a minimum of %s to place your order.' , $minimum ) );
    }
}
23. Сортировать товары на главной странице магазина по цене, дате поступления или названию
Код:
add_filter('woocommerce_default_catalog_orderby', 'custom_default_catalog_orderby');
function custom_default_catalog_orderby() {
     return 'date'; // Can also use title and price
}
24. Перенаправление на страницу оформления заказа после нажатия кнопки «добавить в корзину»
Код:
add_filter ('add_to_cart_redirect', 'redirect_to_checkout');

function redirect_to_checkout() {
    global $woocommerce;
    $checkout_url = $woocommerce->cart->get_checkout_url();
    return $checkout_url;
}
25. Пересылать копию электронного сообщения реципиенту после того, как заказ оформлен
Код:
function woo_extra_email_recipient($recipient, $object) {
    $recipient = $recipient . ', your@email.com';
    return $recipient;
}
add_filter( 'woocommerce_email_recipient_customer_completed_order', 'woo_extra_email_recipient', 10, 2);

Вторая часть тут
 
Последнее редактирование:

zelart

Новичок
если не затруднит, объясните как поменять в woocommerce текст кнопки Распродажа на свой текст
 

den1984

Новичок
Народ, а подскажите такой момент: вот я добавил код для определения минимальной суммы в корзине. Выводится он по-английски. Как и куда через POedit нужно впихнуть перевод этой фразы?
 

D&B

Администратор
Команда форума
Местный
Видимо прямо в этом коде и меняйте. При чем тут POEDIT?
 

den1984

Новичок
Менял, вылезают кракозябры. Пишит мол несоответствие типов данных. Но все равно спасибо, что ответили. сейчас еще раз внимательно все проверю
 

Stork.71

Гуру
Местный
Меняем вкладку "Дополнительная информация" на "технические характеристики" на странице товара. Первый кусок - надпись на вкладке, второй - заголовок перед текстом при активной вкладке.
Код:
/**
* Меняем вкладку "Дополнительная информация" на "Технические характеристики" на странице товара
**/
add_filter ( 'woocommerce_product_additional_information_tab_title', 'custom_product_additional_information_tab_title' ) ;
function custom_product_additional_information_tab_title() {
return 'Технические характеристики'; // Change Me!
}
add_filter ( 'woocommerce_product_additional_information_heading', 'custom_product_additional_information_heading' ) ;
function custom_product_additional_information_heading() {
return 'Технические характеристики'; // Change Me!
}
 

damag0

Новичок
22. Установить минимальную сумму заказа
Код:
Код:
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
function wc_minimum_order_amount() {
    global $woocommerce;
    $minimum = 50;
    if ( $woocommerce->cart->get_cart_total(); < $minimum ) {
           $woocommerce->add_error( sprintf( 'You must have an order with a minimum of %s to place your order.' , $minimum ) );
    }
}

Помогите разобраться с этим кодом. Очень нужен этот снипет. Вставляю его, после чего белый экран. убираю все работает.
 

raintug

Новичок
22. Установить минимальную сумму заказа
Помогите разобраться с этим кодом. Очень нужен этот снипет. Вставляю его, после чего белый экран. убираю все работает.

Этот сниппет для версии 2.0.x
Для последних версий:

Код:
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' );
function wc_minimum_order_amount() {
    // Set this variable to specify a minimum order value
    $minimum = 50;

    if ( WC()->cart->total < $minimum ) {

        if( is_cart() ) {

            wc_print_notice(
                sprintf( 'You must have an order with a minimum of %s to place your order, your current order total is %s.' ,
                    woocommerce_price( $minimum ),
                    woocommerce_price( WC()->cart->total )
                ), 'error'
            );

        } else {

            wc_add_notice(
                sprintf( 'You must have an order with a minimum of %s to place your order, your current order total is %s.' ,
                    woocommerce_price( $minimum ),
                    woocommerce_price( WC()->cart->total )
                ), 'error'
            );

        }
    }

}
 

Kirill8

Новичок
Этот сниппет для версии 2.0.x
Для последних версий:

....

Огромное спасибо за актуализацию сниппета!
Подскажите как изменить код, чтобы не учитывалась сумма доставки, т.е действовало условие минимальной суммы только по товарам?
 
Вечер добрый !Пытаюсь убрать категорию . согласно приведенного кода без изменений. Или для сегодняшней версии , что то другое .
 

novov

Форумчанин
Подскажите пожалуйста как сделать минимальное кол-во в заказе, а не сумму заказа? Спасибо!
 

D&B

Администратор
Команда форума
Местный
Какое отношение имеет сумма к минимальному количеству? Формулируйте вопрос понятнее.
 

novov

Форумчанин
Ну есть сниппет 22. Установить минимальную сумму заказа.
Мне необходимо в корзине фиксить общее минимальное кол-во. Например меньше 10 шт. не продадим, т.к. минимальное кол-во заказа 15 шт. Спасибо!
 
Сверху Снизу