• Как осуществить массовую установка изображений по атрибуту для каждой вариации?

    @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 комментария
  • Как сделать плавное изменение высоты родительского блока при изменении высоты дочернего?

    @ha100790tag
    предлагаю вам рассмотреть следующий пример, надеюсь натолкнет на какие то мысли. Во всяком случае прошу поправить 2 момента: 1) во имя всех богов семантики умоляю вас не строить аккордеон на чекбоксах, 2) не используйте transition all.

    в данный момент все происходит резко тк когда вы убираете max-height: 0; вы не задаете новое максимальное значение и браузер попросту присваивает значение max-height: none;. Значение none не является числовым и выполнить какие то математические операции с ним для плавной анимации браузеру не представляется возможным - как результат рывки. Во избежание этого, если у вас есть какоето понимание, что блок никогда не будет больше определенной высоты - установите ее в цсс, если же высота блоков абсолютно вариативна - лучше использовать JS анимации, Jquery предлагает ряд неплохих встроенных вариантов. Если не используется Jquery - всегда можно реализовать это нативно, но это уже совсем другая история...

    Надеюсь данный ответ был вам полезен, хорошего дня.
    Ответ написан
    2 комментария
  • Как сделать подобные кнопки в contact form7 wordpress?

    Kozack
    @Kozack Куратор тега WordPress
    Thinking about a11y
    Это обычные радио кнопки. Просто они так оформлены
    Читайте, как доступно стилизировать чекбоксы.
    На скорую руку, примерно так
    Ответ написан
    1 комментарий
  • Как увеличить количество вариаций woocommerce больше 30?

    vagono
    @vagono Автор вопроса
    Нашел решение.

    Добавляем в functions.php следующий код:

    function iconic_wc_ajax_variation_threshold( $qty, $product ) {
        return 50;
    }
    
    add_filter( 'woocommerce_ajax_variation_threshold', 'iconic_wc_ajax_variation_threshold', 10, 2 );


    Где return 50; нужное количество вариаций для динамического отображения
    Ответ написан
    Комментировать
  • Проблема с выводом категории WordPress?

    Palych_tw
    @Palych_tw
    Типа веб-разработчик
    Я бы сделал так.
    В файле taxonomy-catg.php первым делом получите объект текущего термина и проверьте есть ли у него родитель
    $category = get_queried_object();
    if ( $category->parent === 0 ) {
      // если это верхний уровень
      // выводим подкатегории
    } else {
       // выводим продукты обычным циклом
    }
    Ответ написан
    Комментировать
  • Как создать категорию в Gutenberg?

    RGameShow
    @RGameShow Автор вопроса
    В поисках ответов на глупые вопросы
    add_filter('block_categories','rstheme_block_categories');
    function rstheme_block_categories($categories){
        return array_merge(
            array(
                array(
                    'slug'=>'my_category',
                    'title'=> 'Моя категория',
                    'icon'=>'feedback',
                    ),
                ),
            $categories
        );
    }
    Ответ написан
    Комментировать
  • Как в Gutenberg создать обертывающий блок, и добавлять внутрь него контент?

    RGameShow
    @RGameShow Автор вопроса
    В поисках ответов на глупые вопросы
    Решение:

    ( function( blocks, element, blockEditor ) {
    	let el = element.createElement;
    	let InnerBlocks = blockEditor.InnerBlocks;
    
    	blocks.registerBlockType( 'gutenberg-custom-block/section', {
    		title: 'Section', 					
    		description: 'section description', 
    		category: 'layout', 				
    		keywords: 'section', 				
    		icon: {
    			background: '#7e70af',
    			foreground: '#fff',
    			src: 'book-alt'
    		},
    
    		edit: function( props ) {
    			return el(
    				'section',
    				{ className: props.className},
    				el( InnerBlocks )
    			);
    		},
    
    		save: function( props ) {
    			return el(
    				'section',
    				{ className: props.className },
    				el( InnerBlocks.Content )
    			);
    		},
    	} );
    
    } (
    	window.wp.blocks,
    	window.wp.element,
    	window.wp.blockEditor,
    ) );


    На выходе получаем:
    <section class="wp-block-gutenberg-custom-block-section">
        <!-- ТУТ ВЛОЖЕННЫЕ БЛОКИ -->
    </section>


    Подробнее читайте тут
    Ответ написан
    Комментировать
  • Какое сочетание клавиш обернет каждое слово тегом выделяя весь список слов в visual studio code?

    Предложу только вариант с мультикурсором:
    1. поставить курсор перед первым словом
    2. Option + Shift + Click перед последним

    В результате перед каждым из слов появится курсор. Дальше редактировать как обычно:
    • написать открывающий тег,
    • Cmd + стрелка_вправо перекинет курсор в конец строки (у каждой строки в своей позиции)
    • набрать закрывающий тег.
    Ответ написан
    Комментировать
  • Wordpress: как предотвратить сохранение поста, если не задан отрывок?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    как-то так
    https://gist.github.com/swalkinshaw/2695510
    Там же ниже есть вариации и указания по кастомизации этого дела
    Ответ написан
    Комментировать
  • Как изменить количество товаров на странице WooCommerce?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    /**
    	 * Изменение количества продуктов на странице
    	 * 
    	 * @compatible    WooCommerce 3.2.0 +
    	 * @see           https://github.com/woocommerce/woocommerce/blob/7701d4b57cb20dc89e25bb7bf2ff872d85f4c535/includes/class-wc-query.php#L412
    	 */
    
    
    	function loop_product_per_page( $per_page ) {
    
    		if ( ! empty( $_GET[ 'products-per-page' ] ) ) {
    			$per_page = (int) ( $_GET[ 'products-per-page' ] );
    		} else {
    			$per_page = 12;
    		}
    
    		return $per_page;
    	}
    
    	add_filter( 'loop_shop_per_page', 'loop_product_per_page', 9999 );
    Ответ написан
    Комментировать
  • Как при протягивании таблицы вправо сделать изменение букв?

    Volounteer
    @Volounteer
    Формула:
    =ИНДЕКС($A:$A;СТРОКА(A1)+(СТОЛБЕЦ(A1)-1)*3)

    Вставляем в нужную ячейку, тянем вниз и вправо
    Ответ написан
    Комментировать
  • Как перевести все изображения сайта в webp?

    @xXxSPYxXx
    Сисадмин
    Если у вас свой сервер, то конвертируйте изображения в webp с помощью cwebp, вот пример sh скрипта:
    # cat webpconverter.sh
    #!/usr/bin/env bash
    
    # converting JPEG images
    find /path/to/img/ -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \) \
    -exec bash -c '
    webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
    if [ ! -f "$webp_path" ]; then
    cwebp -quiet -q 90 "$0" -o "$webp_path";
    fi;' {} \;
    
    # converting PNG images
    find /path/to/img/ -type f -and -iname "*.png" \
    -exec bash -c '
    webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
    if [ ! -f "$webp_path" ]; then
    cwebp -quiet -lossless "$0" -o "$webp_path";
    fi;' {} \;


    Потом добавляете правило в nginx-e
    ap $http_accept $webp_ext {
      default "";
      "~image/webp" ".webp";
    }
    map $uri $file_ext {
      default "";
      "~(\.\w+)$" $1;
    }
    
    server{
    ...
    location  ~* "^(?<path>.+)\.(css|js|gif|png|jpg|jpeg|ico|ogg|ttf|woff|eot|otf|svg|woff2|webp)$" {
      try_files $path$webp_ext $uri =404;
      expires 30d;
    }
    ...
    }


    В итоге у вас получится, что если браузер поддерживает webp, то ему отдадут webp, иначе исходный формат.
    Ответ написан
    1 комментарий
  • Как задать терм таксономии по умолчанию?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    /**
    * Define default terms for custom taxonomies in WordPress 3.0.1
    *
    * @author Michael Fields http://wordpress.mfields.org/
    * @props John P. Bloch http://www.johnpbloch.com/
    * @props Evan Mulins https://circlecube.com/circlecube/
    *
    * @since 2010-09-13
    * @alter 2013-01-31
    *
    * @license GPLv2
    */
    function mfields_set_default_object_terms( $post_id, $post ) {
    	if ( 'publish' === $post->post_status && $post->post_type === 'your_custom_post_type' ) {
    		$defaults = array(
    			'your_taxonomy_id' => array( 'your_term_slug' )
    		);
    		$taxonomies = get_object_taxonomies( $post->post_type );
    
    		foreach ( (array) $taxonomies as $taxonomy ) {
    			$terms = wp_get_post_terms( $post_id, $taxonomy );
    			if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
    				wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
    			}
    		}
    	}
    }
    add_action( 'save_post', 'mfields_set_default_object_terms', 100, 2 );
    Ответ написан
    1 комментарий
  • Как отредактировать выбор товара в админке Woocommerce?

    @castetus Автор вопроса
    Вроде разобрался. Если надо кому - фильтр 'woocommerce_json_search_found_products' за это отвечает. И через него уже переопределяется WC_AJAX::json_search_products() а там уже просто все делается.
    Ответ написан
    Комментировать
  • Как в VS CODE выполнить замену с увеличением значения на 1?

    Dimox
    @Dimox
    Верстаю сайты
    Ответ написан
    Комментировать
  • Как все изображения товаров сделать квадратными?

    SmthTo
    @SmthTo
    Все перепёлки мира будут оплакивать мою смерть.
    Можно через CSS сделать. Решение работает, начиная с древнего IE11 (т. к. без object-fit). Плюс, картинки не будут подвержены лишней обработке на сервере. Код включает в себя всевозможные хаки для разных браузеров.

    Оно не зависит ни от соотношения сторон самой картинки, ни от ширины контейнера (можно делать адаптивно без px, как в моем примере) + поддержка браузерами, можно сказать, максимальная + место под картинку не скачет, пока картинка грузится (lazyload оценит):

    Ответ написан
    4 комментария
  • Как реализовать базу клиентов на сайте вордпрес?

    webaxpro
    @webaxpro Автор вопроса
    Решил проблему очень легко с помощью плагина dataTables...нужно еще со стилями поработать
    5de10ac14a966946117752.png
    Ответ написан
    Комментировать
  • Как вывести в админке WP "назначение" страницы сбоку от заголовка?

    maksym1991
    @maksym1991
    WordPress adept
    Используйте фильтр display_post_states:
    add_filter('display_post_states', 'custom_post_state', 10, 2);
    
    function custom_post_state( $states, $post ) { 
    
                $states[] = __('Custom state'); 
    
        return $states;
    }
    Ответ написан
    1 комментарий
  • Как отключить автоматическое уменьшение изображений в Wordpress?

    deniscopro
    @deniscopro Куратор тега WordPress
    WordPress-разработчик, denisco.pro
    add_filter( 'big_image_size_threshold', '__return_false' );

    Подробнее в блоге WP.
    Ответ написан
    Комментировать
  • Как разделить строку по словам?

    dark_rain
    @dark_rain
    Admin
    https://support.office.com/ru-ru/article/%D0%A0%D0...
    Разделитель - пробел.
    Ответ написан
    Комментировать