• Как вывести атрибуты товаров 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...
    Ответ написан
    Комментировать
  • Почему не работает код jquery в setTimeout?

    SagePtr
    @SagePtr
    Еда - это святое
    Контекст функции поменялся, this тоже поменялся. Используйте стрелочные функции, чтобы контекст не менялся, или внутри обработчика присваивайте this другой переменной, а в колбэке таймаута обращайтесь к ней и забудьте про this.
    Ответ написан
    Комментировать
  • Есть вариант обойти попадание в спам писем отправленных с помощью wp_mail без создания почты?

    @Fenix957
    1) Все эти DKIM, SPF, DMARC добавлять нужно на хостинге
    На яндексе не нужно. Но учтите Много писем будете слать яндекс блокнет отправку писем если вы делаете рассылки и тд. Даже если сделаете доменную почту на самом яндексе. Примерно через 30-90 писем. Такчто лучше настроить свой сервер
    2) Ответ исходя из первого делайте свою
    3) Нет не нужно. Вы из одного почтового ящика всем будете отправлять
    4) Грубо говоря да )
    5) если используйте яндекс то да. Но учтите яндекс потом блокнет рассылки. Если письма будут шаблонные
    6) Вам нужно подвердить что вы владелец домена и все письма подписывать от имени своего сервера. Т.к всем спам порядком надоел и многие без DKIM, SPF, DMARC не доверяют и шлют в спам
    Коротка так
    Может еще кто напишет покидает ссылки
    Ответ написан
    Комментировать
  • Как сделать поиск по полям ACF?

    @weart
    У меня на одном из последних проектов вот такая комбинация работает

    function cf_search_join( $join ) {
    	global $wpdb;
    	if ( is_search() ) {
    		$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    	}
    	return $join;
    }
    add_filter( 'posts_join', 'cf_search_join' );
    
    
    function cf_search_where( $where ) {
    	global $pagenow, $wpdb;
    	if ( is_search() ) {
    		$where = preg_replace(
    			"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
    			"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    	}
    	return $where;
    }
    add_filter( 'posts_where', 'cf_search_where' );
    
    
    function cf_search_distinct( $where ) {
    	global $wpdb;
    	if ( is_search() ) {
    		return "DISTINCT";
    	}
    	return $where;
    }
    add_filter( 'posts_distinct', 'cf_search_distinct' );
    Ответ написан
    1 комментарий
  • Почему the_date() в WordPress выводится через раз в цикле?

    dimasmagadan
    @dimasmagadan
    это стандартное поведение этой функции

    When there are multiple posts on a page published under the SAME DAY, the_date() only displays the date for the first post (that is, the first instance of the_date()). To repeat the date for posts published under the same day, you should use the Template Tag the_time() or get_the_date() (since 3.0) with a date-specific format string.

    https://codex.wordpress.org/Function_Reference/the_date

    используйте the_time() или get_the_date()
    Ответ написан
    Комментировать
  • Что имел в виду автор учебника, устанавливая свойство overflow?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Что имелось в виду?

    Это и имелось в виду. То, что написано в комментарии.

    Родитель ничего не знает о высоте дочерних флоатов.
    Если все дети флоаты, то высота родителя будет нулевой.
    Чтобы она перестала быть нулевой и стала вести себя как высота по контенту, использовали overflow.

    Если вы зададите родителю фон или даже лучше бордер и проведете эксперимент, то всё сами увидите.
    Ответ написан
    4 комментария
  • Посыпалась разметка - дробные значения у параметров высоты?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    Ctrl+0 проверь, чувствую, масштаб экрана неправильный.
    Ответ написан
    Комментировать
  • Как растянуть фон svg на весь экран?

    RAX7
    @RAX7
    Ответ написан
    Комментировать
  • Как закрывать выпадающее меню при клике вне его самого?

    @everdimension
    Использовать e.stopPropagation() — плохая идея. Читайте

    Правильный способ — проверять, является ли target сделанного клика элементом меню или чем-то другим. Если это не меню — закрывать меню.

    Появляется правильный вопрос, что делать, если кликнутый элемент — дочерний элемент меню? Для этого есть офигенный метод node.contains()

    Собственно, вся требуемая проверка получается совсем несложная — gist
    var el = document.getElementById('el');
    
    document.addEventListener('click', outsideEvtListener);
    
    function outsideEvtListener(evt) {
        if (evt.target === el || el.contains(evt.target)) {
            // клик внутри
            return;
        }
        // код для закрытия меню, например el.classList.add('hidden')
       
        // не забыть убрать слушатель событий (не для каждой имплементации требуется)
        document.removeEventListener(outsideEvtListener);
    }
    Ответ написан
    1 комментарий
  • Как переключить на нужный слайд если loop?

    0xD34F
    @0xD34F Куратор тега JavaScript
    let linkIndex = link.dataset.first;
    <...>
    mySwiper.slideToLoop(linkIndex);

    Значения какого типа содержаться в dataset? Строки. А индекс - это что? Число. Ну так сделайте из строки число.
    Ответ написан
    Комментировать
  • Почему не адаптивится svg в IE11?

    profesor08
    @profesor08
    Забудь про IE11. Не трать на него время.
    Ответ написан
    Комментировать
  • Как в инпуте убрать отрицательное значение?

    politon
    @politon
    HTML5,CSS3,JS,PHP,SQL,API,canvas,animation...
    input type="number" min="0" value="1"
    Ответ написан
    Комментировать
  • Можно ли наложить прозрачный градиент на img?

    @fredaev
    Вот хорошая коллекция
    imagehover.io
    Ответ написан
    Комментировать
  • Почему slick slider сбивается при использовании fancybox?

    iamd503
    @iamd503 Куратор тега CSS
    Верстальщик
    Попробуйте эти свойства по переключать
    // Focus handling
      // ==============
    
      // Try to focus on the first focusable element after opening
      autoFocus: true,
    
      // Put focus back to active element after closing
      backFocus: true,
    
      // Do not let user to focus on element outside modal content
      trapFocus: true,
    Ответ написан
    1 комментарий
  • Как сделать вот это на СSS?

    rek888
    @rek888
    Интернет коммерция
    <html>
      <head>
        <style>@keyframes telik{0%{box-shadow:0 5px 10px 2px #fff}to{box-shadow:0 5px 10px 3px #fff}}body{background:#000}.circle{position:absolute;left:400px;top:80px;border:1px solid #000;border-radius:100%;width:10px;height:10px}.telik{background:#fff;width:500;height:250;position:relative;margin:100px auto;border-radius:3px;animation:.01s linear 0s infinite alternate telik}</style>
    </head>
    <body>
      <div class="telik">
        <span class="circle"></span>
      </div>
    </body>
    </html>
    Ответ написан
    1 комментарий
  • Как настроить стиль выходного файла SASS в gulp?

    Eridani
    @Eridani
    Мимо проходил
    outputStyle
    :nested
    :compact
    :expanded
    :compressed
    gulp.task('sass', function () {
     return gulp.src('./sass/**/*.scss')
       .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
       .pipe(gulp.dest('./css'));
    });
    Ответ написан
    4 комментария
  • Как по id в чанке проверить не удален ли ресурс?

    alelunegov
    @alelunegov
    Фрилансер. Разработка сайтов на MODX, верстка
    Можно попробовать таким образом.
    Сначала сниппетом getImageList создаем список id ресурсов через запятую:
    [[!getImageList?
        &tvname=`migx_recommended_brands`
        &tpl=`@CODE: [[+brand]]`
        &toPlaceholder=`kakoytoplaceholder`
        &outputSeparator=`,`
    ]]

    Инструкция по параметрам getImageList.

    А потом используем для вывода сниппет pdoResources, который отфильтрует неопубликованные и удаленные.
    [[!pdoResources?
        &parents=`0`
        &depth=`0`
        &resources=`[[+kakoytoplaceholder]]`
        &tpl=`recommended_service`
        &includeTVs=`preview_image`
    ]]


    Чанк recommended_service:
    <div class="col-md-6 mb-base col-xl-3" style="">
        <a class="brand" href="[[~[[+id]]]]">
            <span class="brandtext">[[+pagetitle]]</span>
            <img class="img-fluid" src="[[+tv.preview_image:pThumb=`&w=250&h=200&zc=0`]]" alt="">
        </a>
    </div>


    Но, если бы это был мой проект, то я бы прежде попробовал написать свой сниппет, который сначала проверял TV migx_recommended_brands: удалял бы там id несуществующих ресурсов, отфильтровывал неопубликованные и самостоятельно делал бы вывод.
    Ответ написан
    2 комментария
  • Как дублировать товар вместе с галереей ms2 на modx?

    ruslan_aleev
    @ruslan_aleev
    MODX с cat-Art.ru
    Никак, они же грузятся в папку с id ресурса, условно: img/5/, где 5 это id ресурса.
    А если вы копируете, но не сохраняете, то вообще id нету, куда картинки размещать? А если вы копируете и сохраняете, то id уже другой.
    Можно плагин написать, который по сохранению брал бы картинки из копии, но в сети не видел.
    Ответ написан
    Комментировать
  • Как научиться работать быстро?

    glaphire
    @glaphire
    PHP developer
    На рутинные задачи можно готовить бойлерплейты (базовые проекты, модули), иметь свой список готовых модулей с минимальной донастройкой, иметь свою "библиотеку рецептов"... Надо просто по мере набивания проектов вычленять повторяющиеся манипуляции и автоматизировать их по-максимуму
    Ответ написан
    Комментировать