• WooCommerce полезная информация

 #10383   IgorA100
 21 май 2021, 14:01
Получить SLUG текущей категории товараможно несколькими способами:
Код: Выделить всё      if (is_product_category()){
         $curent_cat = get_queried_object()->slug;
      } else $curent_cat = false;
      
      return($curent_cat);

Код: Выделить всё$wp_query->get_queried_object()->term_id;

Код: Выделить всё$wp_query->get_queried_object()->name;

Код: Выделить всё$term = get_queried_object();
echo $term->slug;

https://www.wphook.ru/cats/get-category-slug.html
 #10387   IgorA100
 27 май 2021, 13:35
Добавить еще одно поле с ценой в woocommerce

Добавление поле в админке
Код: Выделить всёadd_action( 'woocommerce_product_options_pricing', 'custom_woocommerce_product_options_pricing' );

function custom_woocommerce_product_options_pricing() {
    $price_index = '_custom_price';

    woocommerce_wp_text_input(
        array(
            'id' => $price_index,
            'value' => get_post_meta( get_the_ID(), $price_index, true ),
            'data_type' => 'price',
            'label' => __( 'Custom price', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')'
        )
    );
}

add_action( 'woocommerce_admin_process_product_object', 'custom_woocommerce_admin_process_product_object', 10, 1 );

function custom_woocommerce_admin_process_product_object( $product ) {
    $price_index = '_custom_price';

    $price = wc_clean( wp_unslash( $_POST[ $price_index ] ) );

    update_post_meta( $product->get_id(), $price_index, $price );
}


Вывод в шаблоне
Код: Выделить всё$price_index = '_custom_price';

    echo wc_price( get_post_meta( get_the_ID(), $price_index, true  ) );

https://qna.habr.com/q/577857
 #10388   IgorA100
 27 май 2021, 13:39
Изменяем цену программно (делаем скидку для авторизованных пользователей)
Код: Выделить всёadd_filter( 'woocommerce_get_price_html', 'truemisha_display_price', 25, 2 );
 
function truemisha_display_price( $price_html, $product ) {
 
   // ничего не делаем в админке
   if ( is_admin() ) {
      return $price_html;
   }
 
   // если цена пустая, тоже забиваем
   if ( '' === $product->get_price() ) {
      return $price_html;
   }
 
   // класс, это наш пользователь сайта, ему вешаем скидку 20%
   if ( wc_current_user_has_role( 'customer' ) ) {
      $price_html = wc_price( wc_get_price_to_display( $product ) * 0.80 );
   }
 
   return $price_html;
 
}
 
 
add_action( 'woocommerce_before_calculate_totals', 'truemisha_alter_price', 25 );
 
function truemisha_alter_price( $cart ) {
 
   // не делаем ничего в админке и если это не расчет через ajax
   if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
      return;
   }
 
   // не наш пользователь
   if ( ! wc_current_user_has_role( 'customer' ) ) {
      return;
   }
 
   // запускаем цикл для всей корзины и вешаем на каждый товар доп 20%
   foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
      $price = $cart_item['data']->get_price();
      $cart_item['data']->set_price( $price * 0.80 );
   }
 
}

https://misha.agency/woocommerce/izmene ... ammno.html
 #10389   IgorA100
 27 май 2021, 13:47
Программное добавление и изменение, товаров в WooCommerce (в том числе и цен)

Пример кода, добавления простого товара в вукомерц:
Код: Выделить всё   $post = array(
       'post_author' => 1,
       'post_content' => '', //Описание товара   
       'post_status' => "publish",
       'post_title' => "Мой товар", // Название товара
       'post_type' => "product",
   );
   $post_id = wp_insert_post($post); //Создаем запись
   
   wp_set_object_terms($post_id, 22, 'product_cat'); //Задаем категорию товара
   
   $puthUpload = wp_upload_dir();   
   $PhotoProd = "mainimg.jpg";
   //Картинка
   if($PhotoProd){      
      $PhotoProd = trim($PhotoProd);
      $PhotoProd = $puthUpload["baseurl"]."/productimg/images/".$PhotoProd;
      $thumbid = media_sideload_image($PhotoProd, $post_id, $desc = null, $return = 'id');
      
      set_post_thumbnail($post_id, $thumbid);      
   }
   
   $PhotosProd = "img1.jpg,img2.jpg,img3.jpg";
   //Доп. картинка
   if($PhotosProd){
      $arPhotosProd = explode(",",$PhotosProd);
      
      foreach($arPhotosProd as $key=>$Item){
         if($Item){
            $Item = trim($Item);
            $Item = $puthUpload["baseurl"]."/productimg/images/".$Item;
            $imgID[$key] = media_sideload_image($Item, $post_id, $desc = null, $return = 'id');
         }
      }
      update_post_meta( $post_id, '_product_image_gallery', implode(", ", $imgID));
   }
   
   update_post_meta($post_id, '_sku', 123); //Артикул
   update_post_meta( $post_id, '_visibility', 'visible' ); // Видимость: открыто
   //update_post_meta( $post_id, 'total_sales', '0');   //Создается произвольное поле
   update_post_meta( $post_id, '_downloadable', 'no'); //Не скачиваемый
   update_post_meta( $post_id, '_virtual', 'no'); //Не виртуальный
   
   wp_set_object_terms($post_id, "simple", 'product_type'); //Задаем тип товара      
   
   update_post_meta( $post_id, '_regular_price', 1000); //Базовая цена
   update_post_meta( $post_id, '_sale_price', 500); //Цена распродажи


Я постарался подробно прокомментировать этот код, но навсякий случай сделаю небольшие пояснения. Строчкой wp_set_object_terms($post_id, 22, 'product_cat'); - вы задаете категорию вашего продукта где 22 это id категории. Строчкой update_post_meta($post_id, '_sku', 123); - вы устанавливаете артикул, где 123 и есть ваш артикул.

Также обратите внимание как добавляются картинки товара, в моем примере картинки находятся в папке /productimg/images/

Теперь приведу чуть более сложный пример, добавления вариативного товара. Для этого вам надо вставить код, и убрать в нем все, что идет после строчки update_post_meta( $post_id, '_virtual', 'no');. После этой строчки будет следующий код:
Код: Выделить всё   wp_set_object_terms($post_id, "variable", 'product_type');
   
   $VariationAttribute = "Цвет";
   $VariationAttributesValue[] = "Красный";
   $VariationAttributesValue[] = "Желтый";
   $VariationAttributesValue[] = "Зеленый";
   $PriceVariation["Красный"] = 100;
   $PriceVariation["Желтый"] = 200;
   $PriceVariation["Зеленый"] = 350;
   
   add_variation_product($post_id,$VariationAttribute,$VariationAttributesValue,$PriceVariation);
   
   function add_variation_product( $post_id, $select_attributes, $select_attribute_terms, $PriceVariation)
   {
      /*
      $select_attributes -  атрибут по которому у нас будет вариация
      $select_attribute_terms - значения атрибутов для вариации
      */

      $product_attributes = $select_attributes; //Атрибут
      
      $attributes = wc_attribute_taxonomy_name( $product_attributes );
      $pa_attr = 'pa_' . $product_attributes;
      wp_set_object_terms( $post_id, $select_attribute_terms, $pa_attr );
    
      $thedata = array( $pa_attr => array(
         'name' => $pa_attr,
         'value' => '',
         'postion' => '0',
         'is_visible' => '1',
         'is_variation' => '1',
         'is_taxonomy' => '1'
         ) );
      update_post_meta( $post_id, '_product_attributes', $thedata );
   
      foreach($select_attribute_terms as $key => $attribute_term)
      {
         $variation = array(
           'post_title'   => 'Product #' . $post_id . ' Variation',
           'post_content' => '',
           'post_status'  => 'publish',
           'post_parent'  => $post_id,
           'post_type'    => 'product_variation'
           );
      
         $variation_id = wp_insert_post( $variation );
         
         if(!$variation_id){
            echo "Ошибка создания вариации
";
         }else{
            echo "Вариация создана
";
         }   
         
         update_post_meta( $variation_id, '_regular_price', $PriceVariation[$attribute_term] );
         update_post_meta( $variation_id, '_price', $PriceVariation[$attribute_term] );
      
         update_post_meta( $variation_id, 'attribute_' . $attributes, $attribute_term );
      }
   
      WC_Product_Variable::sync( $post_id );
   }

По этому коду тоже дам небольшие пояснения. Как вы наверное уже заметили, мы написали свою небольшую функцию для добавления товара и назвали ее add_variation_product. Мы передаем ей следующие парамметры: $post_id - id нашей записи, $VariationAttribute - название атрибута (хар-ки) по которому у нас будет вариация, $VariationAttributesValue - массив значений атрибута (хар-ки), $PriceVariation - массив с ценами для каждого атрибута (характеристики)

И наконец рассмотрим пример добавления сгруппированного товара, как и в прошлом и случае стираем все, что идет после строчки update_post_meta( $post_id, '_virtual', 'no'); и вставляем после нее такой код:
Код: Выделить всё   wp_set_object_terms($post_id, "grouped", 'product_type');
   update_post_meta( $postId, '_children', array(97,100));

Тут по сути добавляется одна строчка - update_post_meta( $postId, '_children', array(97,100));, где $postId - id записи сгруппированного товара, массив array(97,100) содержит id, которые надо сгруппировать, в данном случае это 97 и 100.

Если вам надо изменить какие-то данные у товара, то используете к примеру update_post_meta(25, '_sku', 5467); Этой строчкой вы измените артикул на 5467 у товара с id 25. В случае, когда вам надо изменить не '_sku', а другой парамметр, который вы не нашли в моем примере, то могу посоветовать посмотреть в базе данных, как он пишется, т.е. к примеру: _sku, _sale_price, _visibility и.т.д.

https://skosta.ru/wordpress/woocommerce/
 #10390   IgorA100
 27 май 2021, 15:56
Обновление цен через update_post_meta
Код: Выделить всёupdate_post_meta($id, '_price', $sale_price);

update_post_meta($id, '_sale_price', $sale_price);

update_post_meta($id, '_regular_price', $regular_price);

$id= post_id of variation and parent (loop)

https://stackoverflow.com/questions/351 ... -post-meta
 #10392   IgorA100
 30 май 2021, 00:07
Удаление всех товаров SQL запросом:
Только обычные:
Код: Выделить всёDELETE FROM wp_term_relationships WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type = 'product');
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'product');
DELETE FROM wp_posts WHERE post_type = 'product';

Обычные и вариативные
Код: Выделить всёDELETE FROM wp_term_relationships WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
DELETE FROM wp_posts WHERE post_type IN ('product','product_variation');

Удалить осиротевшую постмету
Код: Выделить всёDELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL

Удалить все атрибуты из WooCommerce
Код: Выделить всёDELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%');
DELETE FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%';
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN
(SELECT term_taxonomy_id FROM wp_term_taxonomy);

https://techblog.sdstudio.top/wordpress ... ocommerce/
 #10393   IgorA100
 30 май 2021, 00:45
Удаление фото при удалении товара
Код: Выделить всё function o99_delete_post_children($post_id) {
        global $wpdb;

        $child_atts = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_parent = $post_id AND post_type = 'attachment'");

        foreach ( $child_atts as $id )
            wp_delete_attachment($id);
    }
    add_action('before_delete_post', ' o99_delete_post_children');
    add_action('trash_post', 'o99_delete_post_children')


Или как вариант система автоматизации удаления фото не привязанных к товарам:
Код: Выделить всё<?php
/* Short and sweet */
define('WP_USE_THEMES', false);
require('./wp-blog-header.php');

$unattachedmediaargs = array(
'post_type' => 'attachment',
'numberposts' => -1,
'post_status' => null,
'post_parent' => 0
);
$unattachedmedia = get_posts($unattachedmediaargs);
if ($unattachedmedia) {
foreach ($unattachedmedia as $unattached) {
    wp_delete_attachment( $unattached->ID, true );
            }
}
?>

https://stackoverflow.com/questions/129 ... after-post
 #10394   IgorA100
 26 июн 2021, 19:19
Сравнение данных при использовании сериализованных мета-запросов
Код: Выделить всё$args = array(
    'posts_per_page'   => -1,
    'orderby'          => 'post_date',
    'order'            => 'DESC',
    'post_status'      => 'publish',
    'meta_query' => array(
        array(
            'key'     => 'enterprise_on_page',
            'value'   => serialize(strval('trainees')),
            'compare' => 'LIKE',
        ),
    ),
);

$enterprise_posts = get_posts( $args );

https://wordpress.stackexchange.com/que ... meta-value

НО! Так делать не рекомендуется.
Вот хорошая статья, на английском на тему "Почему нельзя запрашивать сериализованные данные?"
https://wordpress.stackexchange.com/que ... ize-arrays
 #10395   IgorA100
 26 июн 2021, 20:38
Получить все типы существующих постов (записей)
Код: Выделить всёget_post_types( )

Array
(
    [post] => post
    [page] => page
    [attachment] => attachment
    [revision] => revision
    [nav_menu_item] => nav_menu_item
    [custom_css] => custom_css
    [customize_changeset] => customize_changeset
    [oembed_cache] => oembed_cache
    [user_request] => user_request
    [wp_block] => wp_block
    [wpforms] => wpforms
    [acf-field-group] => acf-field-group
    [acf-field] => acf-field
    [mas_static_content] => mas_static_content
    [product] => product
    [product_variation] => product_variation
    [shop_order] => shop_order
    [shop_order_refund] => shop_order_refund
    [shop_coupon] => shop_coupon
    [vc_grid_item] => vc_grid_item
    [vc4_templates] => vc4_templates
)


Получить все таксономии:
Код: Выделить всё$args = array(
    'public'   => true,
    '_builtin' => false
);
$taxonomies = get_taxonomies( $args, 'objects' );

https://wp-kama.ru/function/get_taxonomies

Получить все категории товаров
Код: Выделить всё$args = array('taxonomy' => 'product_cat');
$categories = get_categories( $args );   


Получить категории товаров с фильтром по произвольному полю
Код: Выделить всё$args = array(
        'taxonomy' => 'product_cat',
        'hide_empty' => false,
        'meta_query' => array(
             array(
                'key'       => 'Имя произвольного поля',
                'value'     => 'Значение произвольного поля',
                'compare'   => '='
             )
        )
    );   

$terms = get_terms( $args );


Для случая, когда необходимо получить все термы с частичным совпадением, необходимо использовать следущий код:
Предположим, что мы ищем ВХОЖДЕНИЕ строки $search_data
1. Получить все слагы, которые являются частичным совпадением.
Используйте get_terms, чтобы получить список всех терминов, включающих ваш поисковый запрос $search_data.
get_terms уже имеет аргумент name__like, который будет выполнять частичное совпадение вместо полного совпадения.
Код: Выделить всё$matching_terms = get_terms( array(
    'taxonomy' => 'pa_version',
    'fields' => 'slugs', // searches in the slug and returns an array of matching slugs
    'name__like' => $search_data,
) );

Это вернет массив всех слагов, которые частично соответствуют вашему поисковому запросу, например, ('4000342', 'XC-KK-4000342-8', '123440003425') .
( Примечание. get_terms не возвращает термины, которые по умолчанию пусты. Если вы хотите включить пустые термины, вы можете включить 'hide_empty' => false в аргументы.)

2. Используйте полученные данные в своем tax_query для поиска всех слагов, которые есть в этом списке
Код: Выделить всё$args =  array (
    'post_type' => 'product',
    'tax_query' => array(
          array(
              'taxonomy' => 'pa_version',
              'field' => 'slug',
              'terms' => $matching_terms
          )
      ),
 );

https://question-it.com/questions/59507 ... taksonomii

СОРТИРОВКА категорий товаров по произвольному полю.
Как известно, если использовать функцию get_terms($args) таким образом:
Код: Выделить всё            $args['meta_key'] = $KEY;
            $args['orderby'] = 'meta_value' ;
            return get_terms($args);

то НЕ будут вообще выводиться объекты, у которых поле $KEY отсутствует!
Но, выход есть, небходимо задействовать meta_query. Код будет таким:
Код: Выделить всё            $args['orderby'] = 'meta_value' ;
            $args['meta_query'] = array(
                     'relation' => 'OR',
                     array(
                        'key' => $KEY,
                        'compare' => 'EXISTS'
                     ),
                     array(
                        'key' => $KEY,
                        'compare' => 'NOT EXISTS'
                     )
                  );      
            return get_terms($args);

https://qastack.ru/wordpress/102447/sor ... t-have-one
 #10399   IgorA100
 05 июл 2021, 23:53
Удалить продукт (товар):
Код: Выделить всё/**
* Method to delete Woo Product
*
* @param int $id the product ID.
* @param bool $force true to permanently delete product, false to move to trash.
* @return \WP_Error|boolean
*/
function wh_deleteProduct($id, $force = FALSE)
{
$product = wc_get_product($id);

if(empty($product))
return new WP_Error(999, sprintf(__('No %s is associated with #%d', 'woocommerce'), 'product', $id));

// If we're forcing, then delete permanently.
if ($force)
{
if ($product->is_type('variable'))
{
foreach ($product->get_children() as $child_id)
{
$child = wc_get_product($child_id);
$child->delete(true);
}
}
elseif ($product->is_type('grouped'))
{
foreach ($product->get_children() as $child_id)
{
$child = wc_get_product($child_id);
$child->set_parent_id(0);
$child->save();
}
}

$product->delete(true);
$result = $product->get_id() > 0 ? false : true;
}
else
{
$product->delete();
$result = 'trash' === $product->get_status();
}

if (!$result)
{
return new WP_Error(999, sprintf(__('This %s cannot be deleted', 'woocommerce'), 'product'));
}

// Delete parent product transients.
if ($parent_id = wp_get_post_parent_id($id))
{
wc_delete_product_transients($parent_id);
}
return true;
}

Код входит в functions.php файл вашей активной дочерней темы (или темы). Или также в любом файле плагина php.

ИСПОЛЬЗОВАНИЕ
Код: Выделить всёwh_deleteProduct(170); //to trash a product
wh_deleteProduct(170, TRUE); //to permanently delete a product

https://web-answers.ru/php/wordpress-ud ... oru-s.html