• Как вывести значения свойств атрибутов вне товара woocommerce?

    wp_panda
    @wp_panda
    Вот так один атрибут без пустых терминов
    $tax = 'pa_заданный_вами_слаг_атрибута'
    $pa_args = get_terms( $tax, array(
    			'hide_empty' => false,
    		)
     );


    Вот так все атрибуты без пустых терминов
    $pa_args = array();
        $attribute_taxonomies = wc_get_attribute_taxonomies();
        if ( 0 !== count( $attribute_taxonomies ) ) {
            foreach ( $attribute_taxonomies as $one_tax ) {
                $pa_args[] = get_terms( $one_tax, array(
                        'hide_empty' => false,
                    ) );
            }
        }
    Ответ написан
    3 комментария
  • Как вывести атрибуты товаров woocommerce?

    Palych_tw
    @Palych_tw
    Типа веб-разработчик
    Что бы не получать таких ошибок, нужно делать проверку, а не пуста ли переменная $subheadingvalues. Но это так. А вообще в самом плагине все до вас написано. Атрибуты выводятся в товаре в табе "доп информация", посмотрим код этой табы. plugins/woocommerce/templates/single-product/tabs/additional-information.php
    Код там такой <?php $product->list_attributes(); ?> используется метот list_attributes(); Можно на этом остановиться и в своем шаблоне написать
    global $product;
    $product->list_attributes();

    Но получим готовую разметку в виде таблицы. Посмотрим, что делает функция list_attributes();
    public function list_attributes() {
    		wc_get_template( 'single-product/product-attributes.php', array(
    			'product'    => $this
    		) );
    	}

    Идем в папку за нужным файлом plugins/woocommerce/templates/single-product/product-attributes.php
    Помимо прочего в нем видим
    $attributes = $product->get_attributes();
    .........
    <?php foreach ( $attributes as $attribute ) :
    		if ( empty( $attribute['is_visible'] ) || ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) ) {
    			continue;
    		} else {
    			$has_row = true;
    		}
    		?>
    		<tr class="<?php if ( ( $alt = $alt * -1 ) == 1 ) echo 'alt'; ?>">
    			<th><?php echo wc_attribute_label( $attribute['name'] ); ?></th>
    			<td><?php
    				if ( $attribute['is_taxonomy'] ) {
    
    					$values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) );
    					echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );
    
    				} else {
    
    					// Convert pipes to commas and display values
    					$values = array_map( 'trim', explode( WC_DELIMITER, $attribute['value'] ) );
    					echo apply_filters( 'woocommerce_attribute', wpautop( wptexturize( implode( ', ', $values ) ) ), $attribute, $values );
    
    				}
    			?></td>
    		</tr>
    	<?php endforeach; ?>

    Адаптируйте под свои нужды. Я думаю, должно работать)

    P.S. Не забываем поглядывать в документацию. Вот полный список того, что можно сделать с $product https://docs.woocommerce.com/wc-apidocs/class-WC_P...
    Ответ написан
    Комментировать
  • Как заполнить flex-блок элементами разной ширины аналогично тому как это происходит в таблице?

    SowingSadness
    @SowingSadness
    web-разработчик
    Если вас интересует именно flex, то это можно провернуть различными способами.
    Например можно расставить всем блокам ширину 100% и указать коэффициент сжатия колонок.
    Тогда всё будет как вы хотите, но нужно заранее знать где будет больше, а где будет меньше текста.

    #container {
        box-sizing: border-box;
        display: flex;
        flex-wrap: nowrap;  
        width: 100%;
    }
    
    #container > div {
        flex-basis: 100%;
    }
    #container > div:nth-child(1) {
        flex-shrink: 4;
    }
    #container > div:nth-child(2) {
        flex-shrink: 3;
    }
    #container > div:nth-child(3) {
        flex-shrink: 2;
    }
    Ответ написан
    Комментировать
  • Как отключить zoom в woocomerce, в своей теме?

    roman_tlt
    @roman_tlt
    Разработка и продвижение сайтов
    azerphoenix предложил верное решение, но нужно использовать хук after_setup_theme. Нижеприведённый код размещаем в functions.php.

    add_action('after_setup_theme', 'remove_zoom_theme_support', 100);
    function remove_zoom_theme_support() {
        remove_theme_support('wc-product-gallery-zoom');
    }
    Ответ написан
    3 комментария
  • Php, слеш перед именем класса

    janson
    @janson
    PHP-разработчик
    1. Читаем мануал по namespace в PHP. Обязательно пригодится.
    2. Запись \DateTime() означает, что нужно использовать встроенный тип DateTime() который есть в PHP (он находится в корне пространств имён, т.е. начинается с '\' хотя если нет конфликтов, то слэш можно не указывать). Например у вас есть свой класс DateTime, находящийся в вашем собственном пространстве имён MySpace.

    Какой-то ваш файл app/MySpace/DateTime.php:
    <?php
    namespace MySpace;
    
    class DateTime {...}


    Где-то в своём index.php вы используете его:
    <?php
    ...
    ...
    require_once 'app/MySpace/DateTime.php';
    
    // если мы хотим создать объект СВОЕГО КЛАССА:
    $myDateTime = new \MySpace\DateTime();
    
    //Или так:
    use \MySpace\DateTime;
    $myDateTime2 = new DateTime();
    
    // а вот если хотим использовать встроенный класс DateTime в данной ситуации:
    $intDateTime = new \DateTime();


    Так что, если вы хотите использовать в определённый момент именно встроенный тип данных PHP, то безопаснее вписать слэш перед именем файла - избавляемся от неоднозначностей.
    Ответ написан
    Комментировать
  • DOMDocument php, как получить содержимое блока, с html тегами?

    @Mikhail555 Автор вопроса
    После публикации вопроса, прошло время и вот что я добился!
    Перекурил документацию по php, и сделал вот так:
    $file = file_get_contents('../test.html');
    libxml_use_internal_errors(TRUE);
    $node = new DOMDocument();
    $text = $node->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . $file);
    $id = $node->getElementById('firstElement');
    $html = $node->saveHTML($id);


    Тут я добился, что переменная $html - представляет собой 'string' со всем содержимым тут все понятно.

    Но дальше необходимо вставить $html в другой документ в блок с известным идентификатором, рабочее решение будет с использованием регулярки (написана прям тут) таким:
    $file = file_get_contents('./какой-тоФайл.html');
    preg_replace('/(\<[\s\S]*?myId[\s\S]*?\>)/', '\\1 $html', $file);


    А вот используя DOMDocument и все такое, я не могу вставить узел, не могу понять (или еще не дочитал) как! Причем пытаюсь использовать DOMNode::appendChild и передаю ей $id из кода выше, но не работает!
    Ответ написан
    Комментировать
  • Как определить какие скрипты нагружают сервер?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    График ISP полная бубуйня. Показывает дичь полнейшую.

    Смотреть нужно непосредственно в (h)top на сервере.
    А так же munin.

    Искать откуда нагрузка: https://blackfire.io
    OpenCart не очень оптимизированная вещь.
    А модули под него еще хуже порой.

    • Смотреть/включить php slowlog.
    • Найти долгие страницы на сайте.
    • Снять дампы xdebug/blackfire.
    • Изучить.
    • Поправить
    • ...
    • Профит
    Ответ написан
    Комментировать
  • Как добиться такого эффекта при наведении?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Интересная задача. В общем весь фокус в том, что поверх видимых карточек, лежит точно такая же сетка с невидимыми карточками у которых есть только синий border. На сетку, которая лежит сверху, наложена маска:
    mask: radial-gradient(320px 320px at var(--x) var(--y), black 1%, transparent 40%);

    То есть у всего блока с синими border остается видимым только радиальный градиент в 320px, а x и y это координаты курсора. Ну и грубо говоря получается такая картина:

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

    photozoom
    @photozoom
    Если пользуетесь яндекс метрикой, то там можно сделать такой отчет.
    Отчеты>Стандартные отчеты>Источники>Поисковые запросы.
    Потом настроить группировку как Страница входа, Поисковая фраза.
    https://metrika.yandex.ru/
    Ответ написан
    1 комментарий
  • Как настроить отправку писем о заказе в 1С-битрикс если не заполнен email?

    @vardoLP
    Ват ю сэй эбаут май мама?!
    В шаблонах писем посмотрите, что стоит в поле кому и от кого. Сделайте sql запрос в админке и посмотрите какой статус у письма

    select * from b_event order by id desc

    SUCCESS_EXEC = Y — значит все в порядке, сообщение отправлено (если не пришло на почту, проблема с сервером)

    SUCCESS_EXEC = N — не обработано событие (а значит не отправлено)

    SUCCESS_EXEC = 0 — не найден шаблон (указан не верный шаблон)
    Ответ написан
    2 комментария
  • Как правильно добавить слеш в конце адреса?

    shambler81
    @shambler81 Куратор тега htaccess
    отнють не всегда его можно добавлять, а иногда нужно наоборот
    ############################################################################
    #### Убираем слеши в конце URL для статических файлов (содержит точку)  ####
    ############################################################################
    RewriteCond %{REQUEST_URI} \..+$
       # Если файл содержит точку.
    RewriteCond %{REQUEST_FILENAME} !-d
       # И это не директория.
    RewriteCond %{REQUEST_FILENAME} -f
       # Является файлом.
    RewriteCond %{REQUEST_URI} ^(.+)/$
       # И в конце URL есть слеш.
    RewriteRule ^(.+)/$ /$1 [R=301,L]
       # Исключить слеш.
    
    ############################################################################
    #### Добавляем слеш(/), если его нет, и это не файл.                    ####
    ############################################################################
    RewriteCond %{REQUEST_URI} !(.*)/$
       # Если слеша в конце нет.
    RewriteCond %{REQUEST_FILENAME} !-f
       # Не является файлом.
    RewriteCond %{REQUEST_URI} !\..+$
       # В URL нет точки (файл).
    RewriteRule ^(.*)$ $1/ [L,R=301]
       # Добавляем слеш в конце.

    Часто используемые правила я более подробно описывал тут.
    https://klondike-studio.ru/standards/standartnyy-h...
    Ответ написан
    4 комментария
  • Как сделать кликабельный логотип на всех страницах, кроме главной?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    Заменяете

    <div class="logo-up"><a href="<?=SITE_DIR?>"><img src="<?=SITE_TEMPLATE_PATH?>/images/logo-up.png"  alt="" /></a></div>


    на

    <?php
    $curPage = $APPLICATION->GetCurPage(true);
    if (
                $curPage == SITE_DIR."index.php"
    ){?>
    
    <div class="logo-up"><img src="<?=SITE_TEMPLATE_PATH?>/images/logo-up.png"  alt="" /></div>
    
    <?}else{?>
    
    <div class="logo-up"><a href="<?=SITE_DIR?>"><img src="<?=SITE_TEMPLATE_PATH?>/images/logo-up.png"  alt="" /></a></div>
    
    <?}?>
    Ответ написан
    2 комментария
  • Bitrix: Как сгруппировать свойства?

    Вы их хотите где сгруппировать?
    Если в карточке редактирования товара, то через настройку формы редактирования, если в публичной части, то либо выставляя в свойствах сортировку, либо кастомизацией шаблона.
    Ответ написан
    7 комментариев
  • Как изменить расположение элементов WooCommerce в WordPress?

    Punkie
    @Punkie
    В папке плагина woocommerce есть файл со всеми хуками - woocommerce_hooks.php . Находите в нем отрезок, который отвечает за нужный вам кусок шаблона (в вашем случае woocommerce_single_product_summary), смотрите вызовы add_action.
    У вас они будут как раз такие, как закоментировано в коде выше, то есть:
    @hooked woocommerce_template_single_title - 5
                 * @hooked woocommerce_template_single_price - 10
                 * @hooked woocommerce_template_single_excerpt - 20
                 * @hooked woocommerce_template_single_add_to_cart - 30
                 * @hooked woocommerce_template_single_meta - 40
                 * @hooked woocommerce_template_single_sharing - 50


    В данном случае числа - это последовательность (приоритет) активации action'ов.
    Теперь вам нужно в functions.php вашей темы деактивировать эти action'ы методом remove_action и выполнить их активацию в нужном вам порядке.
    Например, вам нужно, чтобы сначала выводилось название товара, затем краткое описание, затем цена и тд.
    Код будет примерно такой:
    *тут перечисляем все строки с методом remove_action:
    
    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_title', 5);
    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10);
    ... и т.д.
    
    *Теперь вызываем те же действия по хуку woocommerce_single_product_summary, но в нужной нам последовательности:
    add_action('woocommerce_single_product_summary', 'woocommerce_template_single_title', 5);
    add_action('woocommerce_single_product_summary', 'woocommerce_template_single_excerpt', 10);
    add_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 15);
    ... и т.д.

    Числовой приоритет вызова обычно делают кратным 5 для того, чтобы можно было потом еще что нибудь впихнуть между вызовами. Например, захотите потом добавить вывод ключевых слов или уникального поля товара между названием и кратким описанием. Тогда приоритет вызова можно будет сделать 6-9 без необходимости заново перебирать весь массив вызова хука.

    Подробнее про понятия hook, action и filter читайте в официальном руководстве: Introduction to hooks: actions and filters
    Ответ написан
    7 комментариев
  • Woocommerce как вытащить сумму всех товаров находящихся в корзине?

    MetaDone
    @MetaDone
    Хорошо сформулированный вопрос - 50% решения
    WC()->cart->cart_contents_total
    Вроде оно
    Ответ написан
    1 комментарий
  • Как в 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>


    Подробнее читайте тут
    Ответ написан
    Комментировать
  • Как в 1С-Битрикс сделать рандомную сортировку в каталоге?

    Делаем обычную сортировку по SORT, а дальше:

    1 в шаблоне выводим только элементы с сортировкой меньше 23, остальные вываливаем в виде данных и рендерим на на странице js'ом (тупой вариант: выводить в тег script с невыполняемым type, и оттуда добавлять js'ом в страницу), страницы по набору элементов будут одинаковые, но порядок каждый раз будет разным. Кэш работает.

    2 Добавляем 2-4 дополнительных свойства скажем SORT1, SORT2 и т.д. зафигачиваем эти свойства случайными числами и делаем вторую сортировку по одному из них. При этом выбираем по какому именно рандомно. Получаем 4 кэша с разными страницами по составу.

    3 Раз в сутки ночью, агентом переписываем эти допсвойства на другие случайные значения.

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

    UPD:
    Про решение с двумя компонентами - да просто во втором компоненте на первой странице скройте 22 элемента первые и все. Естественно страница должна быть больше 22 элементов.
    Возможно вы сразу возразите, что тогда посетитель в постраничной выборке не увидит эти 22 элемента, поэтому сразу отвечу - вас это вообще не должно волновать, так как у вас посетитель вообще не увидит почти половину каталога (так на вскидку 40-45%) при случайной выборке + пагинации. Вообще пагинация при настоящей случайной выборке полностью лишена смысла.
    Рабочее решение близкое к вашим требованиям я выше привел.
    Если хотите избавится в нем от того что часть элементов каталога будет невидна при пагинации - передавайте в свойствах пагинации еще и свойство сортировки случайно выставленное на первой стартовой странице.
    Ответ написан
    Комментировать
  • Как при создании CSV сделать другой разделитель?

    BuriK666
    @BuriK666
    Компьютерный псих
    Плохо смотрели
    id1.php.net/manual/ru/function.fputcsv.php
    int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' [, string $escape_char = "\" ]]] )
    fputcsv($fp, $fields, ';');
    Ответ написан
    1 комментарий