Задать вопрос
  • Как сделать в woocommerce в каждой категории свой поиск?

    Grarnik
    @Grarnik Автор вопроса
    web-мастер
    Каким-то образом нашел инфу, как сделать поиск по категориям. Всего-то 3 дня искал)
    Заходим в файл /ваша_тема/woocommerce/product-searchform.php и заменяем на приведенный ниже.
    <form method="get" id="searchform" class="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>" role="search">
    
    <?php if (class_exists('WooCommerce')) : ?>
    <?php
    if(isset($_REQUEST['product_cat']) && !empty($_REQUEST['product_cat']))
    {
    $optsetlect=$_REQUEST['product_cat'];
    }
    else{
    $optsetlect=0;
    }
    $args = array(
    'show_option_all' => esc_html__( 'Все категории', 'woocommerce' ),
    'hierarchical' => 1,
    'depth' => 2,
    'class' => 'cat',
    'echo' => 1,
    'value_field' => 'slug',
    'selected' => $optsetlect
    );
    $args['taxonomy'] = 'product_cat';
    $args['name'] = 'product_cat';
    $args['class'] = 'cate-dropdown hidden-xs';
    wp_dropdown_categories($args);
    
    ?>
    
    <input type="hidden" value="product" name="post_type">
    <?php endif; ?>
    
    <input type="text" name="s" class="" id="s2" value="<?php echo get_search_query(); ?>" placeholder="Поиск по товарам.." />
    
    <button type="submit" class="pic-sea" value=""><i class="fa fa-search"></i></button>
    
    </form>

    depth - это уровень вложенности категорий, если нужно, то ставим 1.

    Источник: https://opttour.ru/web/wordpress/poisk-po-kategoriyam/
    Ответ написан
    Комментировать
  • Как раз в сутки автоматически загружать страницу или выполнять определенный php фавйл?

    @YanAlexandrov
    Чайник со стажем
    Если используете wordpress, смотрите в сторону функции wp_schedule_event
    Ответ написан
    Комментировать
  • Как вывести минимальную и максимальную стоимость товара в категории?

    @Alex-Woo
    full stack developer
    Если товар без вариаций самый быстродействующий способ - прямой запрос к базе, но если вдруг разработчики Woocommerce решат изменить структуру базы данных в последующих версиях, этот запрос потребует корректировки.

    global $wp_query;
    	global $wpdb;
    	$current_category_id =  $wp_query->queried_object->term_id;
    
    	$min_price = $wpdb->get_var($wpdb->prepare("SELECT MIN(CAST(m.meta_value AS UNSIGNED INTEGER)) FROM wp_posts p INNER JOIN wp_term_relationships r ON (p.ID = r.object_id) INNER JOIN wp_term_taxonomy t  ON (r.term_taxonomy_id = t.term_taxonomy_id) INNER JOIN wp_postmeta m ON (p.ID = m.post_id) WHERE t.term_id = %s AND t.taxonomy = 'product_cat' AND p.post_type = 'product' AND p.post_status = 'publish' AND m.meta_key = '_price'", $current_category_id));
    
    	$max_price = $wpdb->get_var($wpdb->prepare("SELECT MAX(CAST(m.meta_value AS UNSIGNED INTEGER)) FROM wp_posts p INNER JOIN wp_term_relationships r ON (p.ID = r.object_id) INNER JOIN wp_term_taxonomy t  ON (r.term_taxonomy_id = t.term_taxonomy_id) INNER JOIN wp_postmeta m ON (p.ID = m.post_id) WHERE t.term_id = %s AND t.taxonomy = 'product_cat' AND p.post_type = 'product' AND p.post_status = 'publish' AND m.meta_key = '_price'", $current_category_id));


    Теперь в переменных $min_price и $max_price минимальные и максимальные цены в данной категории.
    Ответ написан
  • Можно ли выводить товары Woocommerce своими силами?

    MikeKosulin
    @MikeKosulin
    Если не нравится вывод, который используется стандартно, то лучше использовать хуки.
    Визуальные хуки можно посмотреть тут
    Для использования самих хуков лучше использовать Code Snippets или дочернюю тему + functions.php

    А так, конечно же можно и кастомный запрос делать.
    Ответ написан
    4 комментария
  • Как получить последние добавленные продукты (WooCommerce)?

    Mike_Ro
    @Mike_Ro Автор вопроса
    Python, JS, WordPress, SEO, Bots, Adversting
    Отсортировать по дате, задать количество:

    $query_args = array(
        'showposts'   => 5,
        'post_status' => 'publish',
        'post_type'   => 'product',
        'orderby'     => 'date',
        'order'       => 'DESC',
    );
    $r = new WP_Query( $query_args );
    if ( $r->have_posts() ) {
        while ( $r->have_posts() ) {
            $r->the_post();
            // Вывод
        }
    }
    wp_reset_postdata();
    Ответ написан
    Комментировать
  • Как записать несколько значений для одного атрибута товара в WooCoommerce?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Разобрался сам, вот код:

    function save_wc_custom_attributes($post_id, $custom_attributes) {
        foreach ($custom_attributes as $name => $value) {
            $product_attributes[] = array(
                'name' => htmlspecialchars( stripslashes( $name ) ), // set attribute name
                'value' => $value, // set attribute value
                'position' => 1,
                'is_visible' => 1,
                'is_variation' => 0,
                'is_taxonomy' => is_array($value) ? 1 : 0,
            );
        }
        update_post_meta($post_id, '_product_attributes', $product_attributes);
    }
    
    // пример записи значений типа текст, для товара с ID = $id
    $_product_attributes = array();
    $_product_attributes['pa_weight'] = '140';        
    
    // $_product_attributes['pa_color'] = 'red'; 
    
    // допустим, нам нужно записать значения разных цветов:
    $colors = array('red', 'green', 'yellow');
    
    // записываем:
    wp_set_object_terms($id, $colors, 'pa_color', false);
    // обновляем такие свойства атрибута как: position, is_visible, is_taxonomy
    $_product_attributes['pa_color'] = $colors;
    
    
    save_wc_custom_attributes($id, $_product_attributes);
    Ответ написан
    Комментировать
  • Каким плагином удобней всего с woocommerce передавать данные товара в Google Analytics?

    darkleviathan
    @darkleviathan Автор вопроса
    Решение выше оказалось хорошим.Но покопавшись часик в документации google нашел альтернативу.Просто выложу здесь.Возможно кому-то пригодится.

    Подойдет для тех, кто не боится лезть в код wordpress

    Код необходимо поместить в файл functions.php

    function devise_wc_ga_integration( $order_id ) {
    	$order = new WC_Order( $order_id ); ?>
    	
    	<script type="text/javascript">
    	ga('require', 'ecommerce', 'ecommerce.js'); 
    		
    		
    		ga('ecommerce:addTransaction', {
    			'id': '<?php echo $order_id;?>',
    			'affiliation': '<?php echo get_option( "blogname" );?>',
    			'revenue': '<?php echo $order->get_total();?>',
    			'shipping': '<?php echo $order->get_total_shipping();?>',
    			'tax': '<?php echo $order->get_total_tax();?>',
    			'currency': '<?php echo get_woocommerce_currency();?>'
    		});
    
    	
    	<?php
    		
    	if ( sizeof( $order->get_items() ) > 0 ) {
    		foreach( $order->get_items() as $item ) {
    			$product_cats = get_the_terms( $item["product_id"], 'product_cat' );
    				if ($product_cats) { 
    					$cat = $product_cats[0];
    				} ?>
    			ga('ecommerce:addItem', {
    				'id': '<?php echo $order_id;?>',
    				'name': '<?php echo $item['name'];?>',
    				'sku': '<?php echo get_post_meta($item["product_id"], '_sku', true);?>',
    				'category': '<?php echo $cat->name;?>',
    				'price': '<?php echo $item['line_subtotal'];?>',
    				'quantity': '<?php echo $item['qty'];?>',
    				'currency': '<?php echo get_woocommerce_currency();?>'
    			});
    	<?php
    		}	
    	} ?>
    		ga('ecommerce:send');
    		</script>
    <?php }
    add_action( 'woocommerce_thankyou', 'devise_wc_ga_integration' );
    Ответ написан
    1 комментарий
  • Как вывести статус в Наличии в Woocommerce?

    Sc0undRel
    @Sc0undRel Автор вопроса
    Ну видимо вот так можно:

    global $product;
        $variations = $product->get_available_variations();
        foreach($variations as $variation){
             $variation_id = $variation['variation_id'];
             $variation_obj = new WC_Product_variation($variation_id);
             $stock = $variation_obj->get_stock_quantity();
             if($stock) $varstock++;
        }
        if($varstock) print "В наличии";
    Ответ написан
    Комментировать
  • Стал работать по часам и обнаружил, что выходит 6 часов в день. Это нормально?

    Maksclub
    @Maksclub Куратор тега Карьера в IT
    maksfedorov.ru
    Не забывайте, НИКОГДА не забывайте, что в ваше рабочее время входит не только полезная работа (написание кода):
    - разобраться с той или иной информацией, изучение проблемы
    - анализ и преоктирование
    - просто изучение нового (подходы, библиотеки)
    - отдых в определенном проценте (не считая обеда)

    Если за вас это не делает работодатель, делайте за него.
    В будущем, если будете управлять коллегами — делайте это для них.

    Главное для любого человека — он сам, никакая зп не переплюнет эгоизм, помните это.
    Ответ написан
    Комментировать
  • Как добавить поле ввода произвольных данных в админку при добавлении таксономии?

    Как то так:
    <?php
    
    add_action( 'category_add_form_fields', 'wpb_category_add_meta_columns', 10 );
    add_action( 'category_edit_form_fields', 'wpb_category_add_meta_columns', 10, 2 );
    add_action( 'edited_category', 'save_category_custom_meta', 10, 2 );
    add_action( 'create_category', 'save_category_custom_meta', 10, 2 );
    
    // Добавление очень нужного поля для категории
    function wpb_category_add_meta_columns($term) {
    
    ?>
    <tr class="form-field">
    <th scope="row" valign="top">
    	<label for="vipcf"><?php _e( 'Очень нужное поле' ); ?></label>
    </th>
    	<td>
    		<textarea class="large-text" rows="5" cols="50" name="vipcf" id="vipcf"><?php echo get_term_meta( $term->term_id, 'vipcf', true); ?></textarea>
    	</td>
    </tr>
    
    <?php
    }
    
    // Сохранение очень нужного поля для категории
    function save_category_custom_meta( $term_id ) {
       	$term_id  = $_POST['tag_ID'];
    
    	if ( isset( $_POST['vipcf'] ) ) {
    	delete_term_meta( $term_id, 'vipcf' );
    	add_term_meta( $term_id, 'vipcf', $_POST['vipcf'], true );
    	}
    }
    Ответ написан
    Комментировать
  • Реально ли спарсить товары с одного магазина на вебархиве и форматировать данные в виде sql чтобы затем засунуть это на другой магазин на woocommerce?

    SEOBot
    @SEOBot
    SEO Noob
    Делал подобную задачу для нескольких магазинов потерявших все данные.
    1) Сгружаем данные в виде HTML страниц из разных источников. WebArchive я покупал тут www.webarchivedownloader.com . Есть альтернативы на торентах, есть онлайн решения.
    2) Сгружаем Google И Yandex Cache. (Если сайт недавно пропал и поисковики еще не успели выкинуть сайт из индекса)
    3) Локально разворачиваем сайт на базе полученных HTML страниц (XAMP, Denver etc)
    4) Парсим локальные сайты с теми настройками и параметрами, которые вам необходимы. Я пользовал Screaming Frog.
    Парсил все Title, Meta Description, Breadcrumbs, H1, URL, Images, Description, Content, Price и тд
    5) Данные после парсинга можно сохранить как CSV и обработать вручную в Excel (почистить ненужные теги, убрать переспамы от предыдущих сеошников в татйлах и тд)
    6) Импортировать CSV в WP WooCommerce.
    Как то так.
    Ответ написан
    Комментировать
  • Как редактировать контент в wordpress?

    zorca
    @zorca Куратор тега WordPress
    59e6fcac94e29669204967.jpeg
    Ответ написан
    Комментировать
  • Слетают мои переводы плагинов и темы в Loco Translate после обновления - как сделать так чтобы всё сохранялось?

    sashkets
    @sashkets
    Прекратил отвечать после 24.02.2022
    Я в свой блог хотел платную тему. Вендор на сайте указал, что дает бесплатную лицензию на год за перевод. Я сделал перевод на русский и его включили в бесплатную версию темы, а я получил свою годичную лицензию
    Полагаю если Вы вендору пришлете Ваш перевод, то скорее всего они его включат в дистру и тогда проблем с обновами не будет
    Ответ написан
    Комментировать
  • Запрет добавления товара в корзину на woocommerce с 00:00 часов ночи до 10:00 утра?

    kawabanga
    @kawabanga
    Там больше вопрос к тому, как это подать клиентам.
    На мой взгляд - баннер с 12 ночи до 10 утра, типа Извините, но ваши заказы мы сможем обработать только утром гораздо полезнее, чем блокировка действия на каком то этапе.
    А так, у вас будет контакт человека, и вы можете его обыграть, например предложив скидку 20% на следующий день.
    Ответ написан
    6 комментариев
  • Как осуществить массовую установка изображений по атрибуту для каждой вариации?

    @IgorNoskov Автор вопроса
    Не нашёл нигде ответа, поэтому написал небольшой снипет, который решает эту проблему. Пригодится в тех случаях, когда создаётся много вариаций и для каждой нужно задать своё изображение. К примеру, если сейчас у меня на сайте дверь имеет 12 размеров и 10 цветов, получается 120 вариаций. Ранее приходилось устанавливать для каждой из 120 вариаций своё изображение. Затрата времени - до 10 минут на каждый товар! Теперь тоже самое можно сделать, примерно, за 30 секунд!

    Инструкция:
    1. Вставляем код в functions.php вашей темы.
    1. Если код вставлен верно, в поле variation_actions появятся дополнительные варианты, на основе атрибутов, выбранных для вариаций.
    2. Выбираем нужный атрибут, нажимает "Применить".

    5c91c619eb2c44fb9278884aecc1e74b.png

    3. В открывшемся окне загружаем изображение с локального диска или выбираем из библиотеки, а затем жмём "Задать изображение для вариаций с выбранным атрибутом".

    4819a0eb833c4eec993ea22fe9e8ca40.png

    4. Повторяем операцию для каждого выбранного атрибута.

    Код:
    add_action( 'woocommerce_variable_product_bulk_edit_actions', 'set_image_by_attributes', 10); 
    
    function set_image_by_attributes() {
    	global $post, $woocommerce;
     
        $attributes = maybe_unserialize( get_post_meta( $post->ID, '_product_attributes', true ) );
    	
    	$out = "";
    
    	foreach( $attributes as $attribute ) {
    		if ($attribute['is_variation']) {
    
    			$out .= '<optgroup label="Изображение по aтрибуту «' . wc_attribute_label($attribute['name']) . '»">';
    			
    				foreach( wc_get_product_terms( $post->ID, $attribute['name'] ) as $attribute_value ){
    					$term = get_term_by('name', $attribute_value, $attribute['name']);
    					$out .= '<option value="set_image_attribute" data-attribute-name="' . $attribute['name'] . '" data-attribute-value="' . $term->slug . '">' . $attribute_value . '</option>';
    				}
    				
    			$out .= '</optgroup>';
    		}
    	}
    	?>
    	<script>
    		jQuery('.wc-metaboxes-wrapper').on('click', 'a.bulk_edit', function(event) {
    			var field_to_edit = jQuery('select#field_to_edit').val();
    
    			if ( field_to_edit == 'set_image_attribute' ) {
    				var input_tag = jQuery('select#field_to_edit :selected').attr('rel') ? jQuery('select#field_to_edit :selected').attr('rel') : 'input';
    				
    				var mediaUploader,
    					data = {};
    					
    				data.attribute_name = jQuery('select#field_to_edit :selected').data('attribute-name');
    				data.attribute_value = jQuery('select#field_to_edit :selected').data('attribute-value');
    				
    				if (mediaUploader) {
    					mediaUploader.open();
    					return;
    				}
    
    				mediaUploader = wp.media.frames.file_frame = wp.media({
    					title: 'Выберите изображение',
    					button: {
    					text: 'Задать изображение для вариаций с выбранным атрибутом'
    				}, multiple: false });
    
    				mediaUploader.on('select', function() {
    					var attachment = mediaUploader.state().get('selection').first().toJSON();
    					data.attachment_id = attachment.id;
    					jQuery( '#woocommerce-product-data' ).block({
    						message: null,
    						overlayCSS: {
    							background: '#fff',
    							opacity: 0.6
    						}
    					});
    					
    					jQuery.ajax({
    						url: woocommerce_admin_meta_boxes_variations.ajax_url,
    						data: {
    							action:       'woocommerce_bulk_edit_variations',
    							security:     woocommerce_admin_meta_boxes_variations.bulk_edit_variations_nonce,
    							product_id:   <?php echo $post->ID; ?>,
    							product_type: jQuery( '#product-type' ).val(),
    							bulk_action:  field_to_edit,
    							data:         data
    						},
    						type: 'POST',
    						success: function(data) {
    							jQuery( '.variations-pagenav .page-selector' ).val( 1 ).first().change();
    						}
    					});
    					
    					jQuery( '#woocommerce-product-data' ).unblock();
    
    				});
    				
    				mediaUploader.open();
    				
    				return false;
    			}
    		});
    	
    	</script>
    	<?php
    	
    	echo $out;
    	
    }
    
    add_action( 'woocommerce_bulk_edit_variations_default', 'action_woocommerce_bulk_edit_variations_default', 10, 4 );
    
    function action_woocommerce_bulk_edit_variations_default( $bulk_action, $data, $product_id, $variations ) {
    	
        if ($bulk_action == 'set_image_attribute') {
    		
    		foreach($variations as $variation) {
    			$attribute_name = "attribute_" . $data["attribute_name"];
    			$meta = get_post_meta($variation);
    			
    			if( $meta[$attribute_name][0] === $data["attribute_value"]) {
    				set_post_thumbnail( $variation, $data["attachment_id"] );
    			}
    		}
    	}
    	
    	exit;
    };
    Ответ написан
    2 комментария
  • Woocommerce вывод в шапке кол. отложенных товаров ajax?

    Palych_tw
    @Palych_tw
    Типа веб-разработчик
    Вот рабочий пример.

    functions.php :

    /**
         * Cart Fragments.
         *
         * Ensure cart contents update when products are added to the cart via AJAX.
         *
         * @param array $fragments Fragments to refresh via AJAX.
         * @return array Fragments to refresh via AJAX.
         */
        function my_woocommerce_cart_link_fragment( $fragments ) {
            ob_start();
            my_woocommerce_cart_link();
            $fragments['#header-cart-contents'] = ob_get_clean();
    
            return $fragments;
        }
    }
    add_filter( 'woocommerce_add_to_cart_fragments', 'my_woocommerce_cart_link_fragment' );
    
      /**
         * Cart Link.
         *
         * Displayed a link to the cart including the number of items present and the cart total.
         *
         * @return void
         */
        function my_woocommerce_cart_link() {
            ?>
            <div id="header-cart-contents" class="header-cart">
                <span><?= wp_kses_data( WC()->cart->get_cart_contents_count());?></span>
                <a href="<?php echo esc_url( wc_get_cart_url() ); ?>"><img src="<?= get_template_directory_uri();?>/img/header-cart.png" alt="shop-cart"></a>
            </div>
            <?php
        }
    }


    В шаблоне, в нужном месте вызываете my_woocommerce_cart_link();
    Разметку меняйте под себя. Главное, что бы в
    $fragments['#header-cart-contents'] = ob_get_clean();
    Обязательно был верный селектор вашего блока с корзиной

    Полный список методов класса WC_Cart https://docs.woocommerce.com/wc-apidocs/class-WC_C...
    Обращаться к нему нужно через WC()->cart, как в примере
    Ответ написан
    2 комментария
  • Как вывести разные способы оплаты при разной итоговой цене на woocommerce?

    deniscopro
    @deniscopro
    WordPress-разработчик, denisco.pro
    Вероятно, как-то так:
    function my_custom_available_payment_gateways($gateways) {
        global $woocommerce;
    
        if (!$woocommerce || !isset($woocommerce->cart)) {
            return $gateways;
        }
    
        $total = WC()->cart->cart_contents_total;
        if ($total >= 100000) {
            unset($rates['cod']);
        }
    
        return $gateways;
    }
    
    add_filter('woocommerce_available_payment_gateways', 'my_custom_available_payment_gateways');

    С помощью unset($rates['cod']); скрывается способ оплаты с указанным id, в данном случае cod.
    Ответ написан
    2 комментария
  • Как исправить ошибки в плагине на wordpress?

    Stargot
    @Stargot
    Just Do It
    Добавить в wp-config.php

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true );
    define( 'WP_DEBUG_DISPLAY', false );
    @ini_set( 'display_errors', 0 );
    define( 'SCRIPT_DEBUG', true );


    После этого обновить страницу и открыть лог отладки (в папке /wp-content)
    Ответ написан
    9 комментариев
  • Где найти нормальное описание WP (add_action)?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Хук admin_menu срабатывает в админке (wp-admin), а не для админа. Он отвечает за сборку меню в админке.
    2. Работа с ограничениями по ролям (админ, обычный пользователь и тд) идет с помощью проверок capabilities и roles.
    3. Все хуки можно найти на hookr.io, в документации WordPress и, самое главное, в исходном коде как самого ядра, так и плагинов, которые вы используете.
    4. Понимаете вы в целом правильно. Хуки - это контрольные точки, в которые можно подключаться и что-то делать - либо выполнять действия (action), модифицировать данные (filter). Важный нюанс - на один хук может навешиваться множество функций, каждой можно задавать свой приоритет. Также, не забывайте, что многие хуки принимают параметры. А еще фильтры, например, всегда должны возвращать данные (return $x).

    Впрочем, все это есть в документации.
    Ответ написан
    Комментировать
  • Woocommerce страницы конфликтуют с категориями?

    kumaxim
    @kumaxim
    Web-программист
    === VANGA MODE ON ===
    Вам нужно ознакомиться с принципом работы Rewrite API в Wordpress. Если очень коротко, то есть список из 16-ти базовых правил: категории(/category/), теги(/tags/), страницы, посты и навигация/пагинация, т.е. циферки внизу страниц категорий/тегов(/page/1/ или /page/2 и т.п.).

    Разумеется, WP дает возможность разработчику самому добавить новое правило, если ему это необходимо. Новое правило может быть добавлено либо в начало(рекомендуется) либо в конец стандартного списка правил.
    Для добавления нового правила, чаще всего используют функцию add_rewrite_rule, однако, если ты начнешь копать в старые плагины, то ты увидишь, что на ряду с этим также, новое правило может добавляться на фильтре generate_rewrite_rules.

    Оба этих способа приводят к одному результату, про различия можешь в сети почитать, где-то на StackOverflow было довольно грамотное описание.

    На сколько я помню, Woocommerce добавляет свои правила через функцию add_rewrite_rule в начала списка правил, поэтому, если у Вас есть две страницы с одним УРЛом(товар в Woocommerce и категория/страница/тег), то Wordpress отправит Вас на первое что ему попадется. Ранее, по всей видимости, у Вас первым был товар Woocommerce, потом категория.

    Как Вы думайте где WP хранит правила? Я вариантов кроме таблицы wp_option в БД не знаю. При переносе Вашей БД между серверами, возможно, при экспорте/импорте там чего-то оптимизировалось, и теперь Ваше правило Woocommerce упало вниз, т.е. стало идти после стандартных правил Wordpress. По этой причине Вы и наблюдайте такое поведение.
    === VANGA MODE OFF

    Как такое исправить:
    • Самый правильный, на мой взгляд, способ - добавить префикс категории и тегу, чтобы они не пересекались. Смотреть внизу странице Settings => Rewrite в админке.
    • Второй - попробуйте деактивировать все плагины и обновить/переустановить Wordpress из самого Wordpress(страница Home => Updates). После активируйте снова все плагины. Гипотетически, это должно запустить где-то функцию flush_rewtire_reles(), которая очищает все УРЛ-правила для WP и Ваше ожидаемое поведение должно восстановиться. Хотя, лично мне это кажется "тугим" методом....


    Если вариант 1 и 2 не выгорают - ставите плагин Query Monitor и начинайте дебажить
    Ответ написан
    Комментировать