• Как сделать размер скидки в деньгах?

    Загляните в плагин под капот.

    Итам можно найти такой код
    /**
     * SMART labels.
     *
     * Add filter to convert SMART labels.
     *
     * @since 1.0.0
     *
     * @param  string $label Label text value.
     * @return string        Modified label text value.
     */
    function wapl_smart_product_label_filter( $label ) {
    
    	global $product;
    
            ... 
    
    	$label = str_replace( '{percentage}', round( $highest_percentage, apply_filters( 'wapl_filter_discount_round', 1 ) ) . '%', $label );
    	$label = str_replace( '{discount}', wc_price( (float) $regular_price - (float) $sale_price ), $label );
    	$label = str_replace( '{price}', wc_price( $regular_price ), $label );
    	$label = str_replace( '{saleprice}', wc_price( $sale_price ), $label );
    	$label = str_replace( '{delprice}', '<del>' . wc_price( $regular_price ) . '</del>', $label );
    
    	return $label;
    }
    add_filter( 'wapl_product_label', 'wapl_smart_product_label_filter' );


    В результате все что Вам нужно , так это заполнить в поле "Текст" созданного ярлычка нужное replace-слово {discount} или {price} или ..., либо обработать фильтр 'wapl_product_label'
    Ответ написан
  • Использую Woof и не работает поиск через шорткод?

    У Woof очень живая поддержка, кстати рускоязычная. Пишите в поддержку.
    Ответ написан
    Комментировать
  • Как можно оптимизировать woocomerce?

    Woocommerce из коробки делает нормальные запросы учитывая пагинацию. Зачем нужно было выкручивать ему мозг.
    Но если вы все таки хотите таких запросов, то Вам нужно кэшировать результат запроса в объектном кэше. К тому же для адекватной работы объектного кэша, в вашем случае , нужен Redis. Он позволит хранить промежучные результаты бд-запросов между http-запросами. Тогда у Вас будет долго длиться только первое обращение к странице.
    Ответ написан
  • Как имитировать выбор select?

    Здравствуйте Александр
    Все что нужно сделать так это добавить собитие изменения select-а
    скрин
    5f19e39490d88928413890.jpeg
    Ответ написан
  • Программная запись артикула в WooCommerce. Несрабатывает поиск. Что делать?

    $product = wc_get_product( $ID );
    $product->set_sku('Значение артикула');
    $product->save();


    Только исключения обязательно обработайте.
    Ответ написан
    Комментировать
  • В WooCommerce в админке поиск по артикулу?

    Поиск по артикулу уже организаван в админке из коробки.
    5f1415aeba0c3123325612.png
    Ответ написан
    Комментировать
  • Как в Woocommerce заменить select на slider js?

    Решение можно увидеть в тех же плагинах, которые заменяют стандартный select на любой другой тип (ярлычки, опции, флажки).

    Алгоритм следующий:
    • Прикрепляемся к любому хуку на странице товара. Все зависит от места , где вы хотите расположить Ваш элемент.
    • Добавляете свой элемент.
    • Скрываете родной select средствами css.
    • В js при изменении своего элемента менете значение родного select-a и ннаоборот.


    JS код можно подсмотреть в плагине variation swatches. Можете даже взять его за основу и переделать на свой лад.
    Ответ написан
    Комментировать
  • Как массово редактировать категории товаров?

    как вариант, SQL запросом или кодом
    Ответ написан
    Комментировать
  • Как из H1 убрать подстановку слова например: категория?

    Судя по названиям css классов это надо искать в Вашей теме. Попробуйте поиском по коду.

    а так за вывод заголовка отвечает функция woocommerce_page_title()
    Ответ написан
    2 комментария
  • Как сделать такое?

    Вот буквально вчера поднимался вопрос
    Посмотрите здесь
    Ответ написан
    1 комментарий
  • Как оптимизировать работу с файлами в Python?

    Или лучше в VBA погрузиться для решения подобных задач?

    VBA - однопоточный, расспаралелить не получится.

    но если только собрать названия листов, то странно большое время у Вас для такой задачи.
    Я тут на коленке набросал код на VBA, так он 200 файлов за 4 минуты обработал, и это без оптимизации кода (excel 32, win 10, 4ядра по 3ГГц).
    Можете запустить у себя, для этого открыть новую книгу, открыть редактор макросов, выбрать лист на котором будете работать и вставить следующий код (полной заменой)
    Код для сбора списка листов из всех книг директории
    Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _
                                 Optional ByVal SearchDeep As Long = 999) As Collection
        ' © EducatedFool  excelvba.ru/code/FilenamesCollection
        ' Получает в качестве параметра путь к папке FolderPath,
        ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением)
        ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются).
        ' Возвращает коллекцию, содержащую полные пути найденных файлов
        ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO)
    
        Set FilenamesCollection = New Collection    ' создаём пустую коллекцию
        Set FSO = CreateObject("Scripting.FileSystemObject")    ' создаём экземпляр FileSystemObject
        GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск
        Set FSO = Nothing     ' очистка строки состояния Excel
    End Function
     
    Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _
                                     ByRef FileNamesColl As Collection, ByVal SearchDeep As Long)
        ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO
        ' перебор папок осуществляется в том случае, если SearchDeep > 1
        ' добавляет пути найденных файлов в коллекцию FileNamesColl
        On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath)
        If Not curfold Is Nothing Then    ' если удалось получить доступ к папке
    
            ' раскомментируйте эту строку для вывода пути к просматриваемой
            ' в текущий момент папке в строку состояния Excel
            ' Application.StatusBar = "Поиск в папке: " & FolderPath
    
            For Each fil In curfold.Files    ' перебираем все файлы в папке FolderPath
                If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path
            Next
            SearchDeep = SearchDeep - 1    ' уменьшаем глубину поиска в подпапках
            If SearchDeep Then    ' если надо искать глубже
                For Each sfol In curfold.SubFolders    ' перебираем все подпапки в папке FolderPath
                    GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep
                Next
            End If
            Set fil = Nothing: Set curfold = Nothing    ' очищаем переменные
        End If
    End Function
    
    Sub LoopThroughFiles(ByVal sDirName As String, ByRef lRow As Long, ByVal sMask As String)
       On Error Resume Next
       Dim folder$, coll As Collection
       Dim EX As Excel.Application
       Dim wkb As Workbook
       Dim wks As Worksheet
       Dim file As Variant
       Dim i As Long
       Dim v As Variant
       
     
        folder$ = sDirName
        If Dir(folder$, vbDirectory) = "" Then
            MsgBox "Не найдена папка «" & folder$ & "»", vbCritical
            Exit Sub        ' выход, если папка не найдена
        End If
     
        Set coll = FilenamesCollection(folder$, sMask)        ' получаем список файлов по маске из папки
        If coll.Count = 0 Then
    '        MsgBox "В папке «" & Split(folder$, "\")(UBound(Split(folder$, "\")) - 1) & "» нет ни одного подходящего файла!", _
                   vbCritical, "Файлы для обработки не найдены"
            Exit Sub        ' выход, если нет файлов
        End If
     
       Set EX = New Application
       EX.Visible = False
       
       ' перебираем все найденные файлы
       For Each file In coll
        
          Cells(lRow, 2) = CStr(file)
          
          Set wkb = EX.Workbooks.Open(Filename:=file)
    
          ' Если книга не пуста
          If wkb.Sheets.Count > 0 Then
             i = 1
             ReDim v(1 To wkb.Sheets.Count)
             ' Получаем названия листов
             For Each wks In wkb.Sheets
                v(i) = wks.Name
                i = i + 1
             Next wks
    
          End If
    
          Cells(lRow, 3) = Join(v, ",")
    
          wkb.Close False
                
          DoEvents
          
          lRow = lRow + 1
        
          DoEvents
        Next file
        
       Set wks = Nothing: Set wkb = Nothing: Set EX = Nothing
       Set colShts = Nothing
        
    End Sub
    
    Sub LoopThroughDirs()
       Dim lLastRow As Long
       Dim lRow As Long
       Dim i As Long
       Dim v As Variant
       Dim dTime As Double
    
       lRow = 2
       lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
       
       v = Range(Cells(2, 1), Cells(lLastRow, 2))
       
       dTime = Time()
       For i = LBound(v) To UBound(v)
          Application.StatusBar = "Обрабатывается директория " & i & " из " & UBound(v)
          Call LoopThroughFiles(v(i, 1), lRow, "*.xls")
          Call LoopThroughFiles(v(i, 1), lRow, "*.xlsx")
          Call LoopThroughFiles(v(i, 1), lRow, "*.xlsm")
          DoEvents
       Next i
       MsgBox "Готово за " & CStr(CDate(Time() - dTime))
    End Sub


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

    Запустить процедуру LoopThroughDirs, для этого поставить курсор на название и нажать F5

    Результат
    5f05adc35867d361594006.png
    Ответ написан
    1 комментарий
  • Как в описание категории товаров добавить картинки?

    Можно
    Замена редактора на WYSIWYG для категорий
    /**
     * Заменяет стандартное поле "Описание" полем с редактором WYSIWYG
     * на странице правки категории
     *
     * @since 2.1.0
     *
     * @param object $term Current category term object.
     */
    function pc_term_wysiwyg_description_field( $term ) {
    	?>
    	<tr class="form-field">
    		<th scope="row" valign="top"><label for="description"><?php _e('Description'); ?></label></th>
    		<td>
    			<?php
    			$settings = array('wpautop' => true, 'media_buttons' => true, 'quicktags' => true, 'textarea_rows' => '15', 'textarea_name' => 'description' );
    			wp_editor(html_entity_decode($term->description), 'cat_description', $settings);
    			?>
    			<br />
    			<script>
                    jQuery(window).ready(function(){
                        jQuery( jQuery('label[for=description]')[0] ).parent().parent().remove();
                        //jQuery('#description').parent().parent().remove();
                    });
    			</script>
    			<style>#edittag{max-width:1100px;}</style>
    			<span class="description"><?php _e('The description is not prominent by default; however, some themes may show it.'); ?></span>
    		</td>
    	</tr>
    	<?php
    }
    // для категорий
    add_action( 'product_cat_edit_form_fields', 'pc_term_wysiwyg_description_field', 10, 2 );
    // для меток
    add_action( 'product_tag_edit_form_fields', 'pc_term_wysiwyg_description_field', 10, 2 );
    // для любых других таксономий по аналогии.


    Но учтите, что по умолчанию в категориях запрещен вывод html тегов. Что бы это отключить можно воспользоваться плагином

    В итоге
    5f044bc8b7093051754040.png
    Ответ написан
    Комментировать
  • Вывод названия категории конкретного товара?

    Возможно Вам это поможет.
    У меня организовано так
    5f03035b33cc4823224711.png
    Для этого я использовал вспомогателную функцию, которая собирает все категории текущего товара по иерархии. Это нужно , что бы получить все номера родительских категорий верхнего уровня, все зависимости подключен ли товар непосредственно к родительской категории или только к дочерней.
    function get_unique_deep_term_ids
    /**
    	 * Получает список иерархических линий терминов для указанного или текущего поста в цикле.
    	 *
    	 * Возвращается ассоциативный массив вида id => строка id терминов разделенных символом "-" (минус)
    	 *
    	 * @param string $taxonomy Название таксономии
    	 * @param integer/object  [$post_id = 0] ID или объект поста
    	 *
    	 * @return array Массив id=>hi_line
    	 */
    	function get_unique_deep_term_ids( $taxonomy, $post_id = 0 ) {
    		if ( isset( $post_id->ID ) ) {
    			$post_id = $post_id->ID;
    		}
    		if ( ! $post_id ) {
    			$post_id = get_the_ID();
    		}
    
    		$terms = get_the_terms( $post_id, $taxonomy );
    
    		if ( ! $terms || is_wp_error( $terms ) ) {
    			return array();
    		}
    
    		$hierarchies = array();
    		foreach ( $terms as $term ) {
    			$ancestors = get_ancestors( $term->term_id, 'product_cat' );
    			array_unshift( $ancestors, $term->term_id );
    			$hierarchies[ $term->term_id ] = implode( '-', array_reverse( $ancestors ) );
    		}
    		arsort( $hierarchies, SORT_STRING );
    
    		$old = '';
    		$hierarchies = array_filter( $hierarchies, function ( $value ) use ( &$old ) {
    			$success = false === strpos( $old, $value );
    			$old     = $value;
    
    			return $success;
    		} );
    
    		return $hierarchies;
    	}

    Далее просто собираем массив строк и выводим в нужном месте
    /** @var WC_Product $product */
    global $product;
    
    $hi_lines = get_unique_deep_term_ids( 'product_cat', $product->get_id() );
    foreach ( $hi_lines as $key => $value ) {
    	$hi_lines[ $key ] = get_term_parents_list( $key, 'product_cat', $args = array( 'separator' => ' / ' ) );
    }
    
    ...
    
    // Взято по аналогии из шаблона woocommerce/single-product/meta.php
    <?php echo '<div class="posted_in">' . _n( 'Category:', 'Categories:', count( $product->get_category_ids() ), 'woocommerce' ) . '<br>' . implode('<br>', $hi_lines) . '</div>' ?>
    Ответ написан
  • Как перевести формат ДАТА в ТЕКСТ в ячейках Excel?

    На самом деле все очень просто если есть в руках VBA

    Создаем модуль, добавляем функцию, вызываем функцию на листе.
    Public Function ToText(ByRef rng As Range) As String
       ToText = rng.Text
    End Function


    Результат
    5ef1cd94efcf3920919701.png
    Ответ написан
  • Как отправить данные заказа Woocoomerce через api?

    Для подобной задачи я вешался на хук woocommerce_checkout_order_processed
    Он вызывается в аккурат, когда заказ оформлен. Причем, если оплата по безналу, то он вызывается до проведения оплаты, но когда покупатель уже нажал кнопку перехода к оплате. Таким образом можно отловить неудавшуюся оплату и показать менеджеру, который может быстро связаться с покупателем и помочь в решении.

    А за отправку заказа на почту отвечает класс WC_Email_New_Order. Можно посмотреть хуки к которым он подключается по его обработчику trigger
    Ответ написан
    Комментировать
  • Фильтрация в woocomerce. Какие есть способы кроме аттрибутов?

    Атрибуты это по сути таксономии.
    Как вариант сделайте новую таксономию, специально для характеристик фильтров и тогда делайте те же запросы на фильтрацию только по другой таксономии. Это конечно добавит работы Вам и менеджерам.

    Вариант 2. Завести в систему учета Ваши характеристики фильтров и тогда они будут обновляться вместе с остальными атрибутами. И тогда любой фильтр Вам в руки. И менеджер будет править характеристики в одном месте один раз.
    Ответ написан
    Комментировать
  • Как оптимизировать функцию wc_get_attribute_taxonomies?

    Как вариант включить на хостинге объектное кэширование (Redis или MemCache). Тогда будет только один, первый, запрос.
    Ответ написан
    2 комментария
  • Как сделать купон-скидку на каждый 3 товар в корзине?

    Вам надо перестроить массив prices.
    Сейчас он содержит цены всех товаров находящихся в корзине. Вам надо собрать массив prices учитывая количество каждого товара. т.е. если какогото товара 2шт то в массиве prices должно быть две записи цены этого товара.
    Далее все просто
    - Сортируете prices по возрастанию
    - находите кратность количества трем ( количество / 3 )
    - берете полученное количество элементов из prices - это Ваша акционная сумма.
    Ответ написан
  • Существует ли максимально легкий и быстрый плагин для всплывающего окна по таймеру в WordPress?

    любой плагин формы который работает через шотркод + PopupMaker
    Ответ написан
    Комментировать
  • Как изменить кодировку ответа от rest api woocommerce?

    Вы смотрите на json кодированную строку
    Прогоните ее через любой декодер json и получите удобочитаемые данные с декодированными символами
    5ecbb9c91a0ed447313030.png
    Ответ написан