Задать вопрос
  • Как настроить обработку sitemap.php как sitemap.xml на nginx?

    @dodo512
    rewrite ^/sitemap\.xml$ /sitemap.php last;
    Ответ написан
    Комментировать
  • Автоматизация переноса сотни WordPress-сайтов с одного VPS на другой?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    DEST_WWW_PATH="/path/to/www/folder"
    CURRENT_PATH=$(pwd)
    SITE_FOLDERS=("site.ru" "site2.ru")
    
    for SITE_FOLDER in ${SITE_FOLDERS[@]}; do
      CURRENT_FOLDER="${CURRENT_PATH}/${SITE_FOLDER}"
      DB_NAME=$(/bin/grep -oP "define\(['\"]DB_NAME['\"],\s*['\"]\K[^'\"]+(?=[\'\"]\s*\)\s*;)" "${CURRENT_FOLDER}/wp-config.php")
      DB_USER=$(/bin/grep -oP "define\(['\"]DB_USER['\"],\s*['\"]\K[^'\"]+(?=[\'\"]\s*\)\s*;)" "${CURRENT_FOLDER}/wp-config.php")
      DB_PASSWORD=$(/bin/grep -oP "define\(['\"]DB_PASSWORD['\"],\s*['\"]\K[^'\"]+(?=[\'\"]\s*\)\s*;)" "${CURRENT_FOLDER}/wp-config.php")
      /usr/bin/mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME | /bin/gzip -9 > dump.sql.gz
      /usr/bin/rsync -rvp user@XXX.XXX.XXX.XXX:"${DEST_WWW_PATH}/${SITE_FOLDER}/" $CURRENT_FOLDER
      /bin/rm -f dump.sql.gz
    done
    Ответ написан
    Комментировать
  • Надо ли отказаться от 100vh?

    @neuroscript
    Попробуйте
    https://css-tricks.com/the-trick-to-viewport-units...
    или
    body {
      min-height: 100vh;
      min-height: -webkit-fill-available;
    }
    
    html {
      height: -webkit-fill-available;
    }
    Ответ написан
    Комментировать
  • Может ли php-fpm обрабатывать больше коннектов, чем pm.max_children?

    Jsty
    @Jsty Автор вопроса
    Как решение
    listen.backlog = 1024
    Ответ написан
    Комментировать
  • Как сделать плавную прокрутку на странице?

    Vlad_IT
    @Vlad_IT Куратор тега CSS
    Front-end разработчик
    Все решения будут дико тормозить. Сайт по ссылке тормозит на macbook pro 2018 с i7, во время скролла лишь появляется желание побыстрее закрыть сайт.
    Лучше нативного скролла нет ничего, убеждался в этом множество раз. Если нужна плавная прокрутка к нужной позиции, то тоже есть нативные решения: css scroll-behavior или на js параметр behavior у scrollTo
    Ответ написан
    5 комментариев
  • Как правильно сделать редирект со всего раздела, в новый раздел?

    shambler81
    @shambler81 Куратор тега htaccess
    Перенаправляет все содержимое каталогов http://site.ru/dir1/любое/любое → в site.ru dir2 /любое/любое .

    RewriteCond %{REQUEST_URI} ^/dir1/(.*)$ 
    # если строка начинается с /dir1/ 
    RewriteRule ^(.*)$ /dir1%1 [R=301,L]

    #Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
    Перенаправляет все содержимое каталогов/любое/dir1/любое/любое → в /любое/dir2/любое/любое
    RewriteCond %{REQUEST_URI} ^(.*)/dir1/(.*)$ 
    # если строка содержит /dir1/ 
    RewriteRule ^(.*)$ %1/dir2/%2 [R=301,L]

    #Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
    Ответ написан
    7 комментариев
  • Несколько разных popup на одной странице. Как?

    @yarnstart
    Превозмогание и React
    Нужно для каждого инициатора открытия модального окна(кнопки) задать атрибут(в моем примере data-modal, в котором будет храниться идентификатор(например id) нужного вам модального окна, ваш код может выглядеть так - https://jsfiddle.net/jtLvyrco/4/
    Ответ написан
    3 комментария
  • Какие плагины вы считаете стандартными для работы в WordPress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Как уже написали, универсального набора не существует, ибо задачи разные. Но есть некоторые наметки по этому поводу. Сразу оговорюсь - у меня всех без исключения WP-проекты построены на базе Composer, зависимостями (а плагины ими и являются) управлять просто и удобно, плюс autoload. Это позволяет динамически включать-выключать плагины в зависимости от переменных среды или feature flags. А теперь сами плагины. Разобьем им сразу на 2 категории - development и production. Первые нужны для облегчения разработки и отладки проекта, вторые - всегда.

    Development-only плагины:

    - Query Monitor
    - Transients Manager
    - WP Crontrol
    - Airplane Mode
    - Debug wp_redirect
    - User Switching
    - Rewrite Rules Inspector
    - rarst/wps (обертка для Whoops)
    - rarst/laps (профайлер)
    - Regenerate Thumbnails
    - Парочка кастомных mu-plugins которые облегчают жизнь (обертка для symfony/var-dumper и тд)

    Production:

    - ACF Pro
    - Кеширование - WP Super Cache, Batcache, WP Fastest Cache. Redis/Memcached для объектного кеша (все есть от именитых команд типа 10Up, Humanmade и тд) - какой конкретно зависит от проекта
    - Для форм использую свою наработку, HTML чистый который делает верстальщик, обработчик - своя кухня которая использует внешний transactional email service (SendGrid, Amazon SES и другие - адаптеры пишутся по необходимости) с их темплейтами для писем, использует composer-библиотеки для валидации и тд. Для всех форм также создается custom post type, все сабмишны пишутся туда с логом (сами данные формы, статус отправки транзакционного письма, лог мейлера и тд - удобно для отладки). На первый взгляд звучит сложно, но благодаря ООП-архитектуре по принципу Laravel / Laravel Nova все настраивается буквально за считанные минуты. Но если бы использовал готовый плагин, то скорее всего CF7.
    - Disable Comment - потому что на большинстве сайтов они не нужны
    - Classic Editor - потому что все еще не везде подходит/заходит Gutenberg
    - Duplicate Post - удобно для работы с контентом, активируется по необходимости
    - Enable Media Replace - иногда полезен, активируется по необходимости
    - EWWW Image Optimizer Cloud - удобно, дешево
    - Lazy Load Optimizer - полезная штука для frontend performance
    - Safe SVG - SVG сейчас везде, так что без него никуда
    - Cyr-To-Lat - если сайт кириллический / мультиязычный
    - Для мультиязычных сайтов чаще всего останавливаемся на WPML
    - ElasticPress - для поиска/фильтров
    - WP-Minions или Cavalcade - для асинхронных фоновых задач
    - humanmade/S3-Uploads - для медиа-библиотеки в S3

    Дальше, для разных задач есть свои "фавориты" и/или свои кастомные наработки.

    Ну и, конечно же, WP CLI.
    Ответ написан
    Комментировать
  • Как сделать анимацию логотипа?

    SmthTo
    @SmthTo Куратор тега CSS
    Все перепёлки мира будут оплакивать мою смерть.
    Что первое, что второе, по описанию, требуют WebGL. Второй вариант проще и легче в плане кода будет: статичная сфера с текстурой + текст, который описывает движение по её орбите.

    Можно на CSS сделать достаточно убогую бесконечную прокрутку карты, но она не будет учитывать геометрию шара.

    Типа так:


    UPDATE. Увидел такой баг в Android Chrome в результате совместной работы border-radius и overflow:
    5d694ce0ed71b148762968.png
    Нашел решение хаком. Нужно добавить следующее к такому блоку:
    -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC); /* this fixes the overflow:hidden in Chrome/Opera */


    Это исправило проблему, обновил песочницу.
    Ответ написан
    3 комментария
  • Как отправить данные из браузера на сервер ( JS -> PHP) методом POST?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Если вы устанавливаете заголовок 'application/x-www-form-urlencoded', то и кодировать строку надо с помощью encode​URIComponent(), а не JSON.stringify. Тогда на сервере можно будет просто вытащить данные из массива $_POST безо всяких json_decode.
    Альтернативным вариантом является смена заголовка на 'Content-Type: application/json' и кодирвоание данных с помощью JSON.stringify, но тогда на стороне php данные надо искать в php://input, а не в $_POST и декодировать с помощью json_decode
    Ответ написан
    1 комментарий
  • Как дать клиенту прямую ссылку на покупку через WooCommerce?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Грубо:
    function prefix_automatically_add_to_cart()
    {
    	// Сначала решите как будете передавать ID товара - через 
    	// GET в ссылке, через кастомный rewrite, POST, куки и тд.
    	// Далее, здесь получаете этот ID, в зависимости от решения выше.
    	$product_id = 1;
    
    	if ( WC()->cart->get_cart_contents_count() === 0 ) {
    		// Програмно добавляем товар в корзину
    		WC()->cart->add_to_cart( $product_id );
    
    		// Переадресовываем на корзину (или чекаут)
    		wp_redirect( WC()->cart->get_cart_url() );
    		// wp_redirect( WC()->cart->get_checkout_url() );
    		
    		die;
    	}
    }
    add_action( 'template_redirect', 'prefix_automatically_add_to_cart' );
    Ответ написан
    2 комментария
  • Как на основе slick slider сделать такой слайдер?

    $('.owl-carousel').owlCarousel({
            loop:true,
            nav:true,
            items:5,
            center:true,
            onInitialized: carouselFirstLastActive
        });
        
        $('.owl-carousel').on('translate.owl.carousel', function(e){
            carouselFirstLastActive(e);
        });
        
        function carouselFirstLastActive(e){
            var idx = e.item.index;
            $('.owl-item').removeClass('last last_second first second');
            $('.owl-item').eq(idx-1).addClass('second');
            $('.owl-item').eq(idx-2).addClass('first');
            $('.owl-item').eq(idx+1).addClass('last_second');
            $('.owl-item').eq(idx+2).addClass('last');
        }


    Можно добавить классы на активные слайды и уже работать со стилями
    Ответ написан
    Комментировать
  • Как самому написать систему скидок woocommerce?

    Я думаю Вам следует посмотреть в сторону хука woocommerce_cart_calculate_fees Примеров его использования достаточно в нете. И В обработчике этого хука комбинировать условия и выполнять пересчет скидки. Так же думаю стоит посмотреть в сторону купонов. Это стандартный функционал Woocommerce. Вы можете комбинировать условия предыдущего хука и купонов.

    Вот как это работает у меня. Достаточно кинуть код в functions.php и выставить верный номер категории.
    /************************************************************************/
    /************************************************************************/
    /*	
    *	Добавляем возможность скидки 50% на второй (самый дешевый) товар к корзине
    * 	только для товаров категории $category_id = 914; // slag = 'aktsiya-2-1'
    */
    add_action( 'woocommerce_cart_calculate_fees','hml_fee_two_plus_one', 10, 1 );
    function hml_fee_two_plus_one( WC_Cart $cart_object ) {
    	global $wpdb, $woocommerce;
    
        if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; }
    	
    	$arr_cart = $cart_object->get_cart();
    	if ( 0 == sizeof($arr_cart) ) { return; }
    		
    	//if ( is_user_logged_in() ) {
    	//	$customer_id = get_current_user_id();
    	//}
    	//if ( 1 == $customer_id ) { // only for admin
    		
      		$count = 0;
    		$min_price = 0;
    		$category_id = 914; // slag = 'aktsiya-2-1'
    		$cats = hml_get_category_gender_line( $category_id );    // смотри ниже
    		
     		foreach( $arr_cart as $item_key => $value ) {
     			if ( has_term($cats, 'product_cat', $value['product_id'] ) ) {
    				$count += $value["quantity"];
    				$product = $value['data'];
    				$price = $product->get_price();
    				if ( $price ) {	$prices[] = floatval($price); }
    			}
    		}
    		
    		$min_price = max( $min_price, min($prices) );
    		
    		if ( $count >= 2 && $min_price > 0 ) {
    			$fee = -1 * $min_price/2;
    			$cart_object->add_fee( __('Акция: 2я вещь -50%'), $fee );
    		}
        //}   
    }
    
    // получаем массив всех вложенных категорий
    function hml_get_category_gender_line( $cat_parent ){
    	// get_term_children() accepts integer ID only
    	$line = get_term_children( (int) $cat_parent, 'product_cat');
    	$line[] = $cat_parent;
    	return $line;
    }
    /************************************************************************/
    Ответ написан
  • Плагин для наценки стоимости товаров в wordpress woocommerce?

    @nazgulalex
    Dynamic Price and Discounts for Woocommerce
    вкладка fee
    Ответ написан
    Комментировать
  • Как обрезать длинное слово?

    @pocifis
    PHP-разработчик
    $text = preg_replace_callback('/[\w-]{21,}/ui',
        function ($matches) { 
            return mb_substr($matches[0], 0, 20); 
        },
    $text);


    Символ "-" добавил для слов через дефис, если не нужно, можете убрать.
    Ответ написан
    1 комментарий
  • Имеет ли смысл заинлайнить CSS сразу в HTML?

    Zhandos
    @Zhandos
    Имеет смысл инлайнить критический css для отображения первого экрана (верхняя часть сайта) для пользователя. Эта методика является также официальной рекомендацией https://developers.google.com/speed/pagespeed/insights/ .
    Основной же css должен подгружаться асинхронно, например используя библиотеку https://github.com/filamentgroup/loadCSS
    Ответ написан
    2 комментария
  • Оптимизация больших изображений для сайта?

    @pu6elozed
    Bitrix, fullstack
    По пунктам:
    1. Используйте современные форматы изображений - гугл хочет чтобы на сайте использовались более легкие(не всегда, но в большинстве случаев) варианты изображений в формате допустим .webp
    2. Настройте эффективную кодировку изображений - значит что изображения слишком много весят
    4. И самое главное, что влияет на все предыдущие пункты - некорректное соотношение размера отображаемого изображения - его визуальному размеру. К примеру - у вас изображение 2500px, действительно ли его нужно отображать на смартфонах в полный размер. или достаточно превью?
    <article>
      <img srcset="https://dummyimage.com/2560x400/333/fff 2x,
                   https://dummyimage.com/1280x400/333/fff 1x"
           sizes="(min-width: 1280px) 1280px, 100vw"
           alt="A title">
    </article>

    По вышеописанному коду для современных мобильных используется srcset=https://dummyimage.com/2560x400/333/fffтак как у них плотность пикселей 2x. PageSpeedInsights эмулирует отображение на аналогичном смартфоне.
    Для более гибкого подхода в html5 появился элемент picture. Подробнее посмотреть советую у Вадима Макеева в этом же видео подробно разбирается оптимизация графики для сайта.
    На примере вашего кода можно сделать набросок
    <picture>
        <!-- source для браузеров поддерживающих webp, соответственно srcset тоже должен указывать на webp-->
        <source type="image/webp" srcset="https://dummyimage.com/575x150/333/fff 1x, https://dummyimage.com/1150x300/333/fff 2x," media="(max-width: 575px)">
         <!-- source для браузеров не поддерживающих webp -->
         <source srcset="https://dummyimage.com/575x150/333/fff 1x, https://dummyimage.com/1150x300/333/fff 2x," media="(max-width: 575px)">
        ...  <!-- все остальные необходимые размеры, вроде планшетов и т.д. -->
        <!-- fallback для браузеров не поддерживающих элемент picture -->
        <img src="https://dummyimage.com/2560x400/333/fff" alt="A title">
    </picture
    Ответ написан
    1 комментарий
  • Актуальна ли ниша PHP на Upwork?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Как во Frontend куча индусов рвётся за заказами или нет?

    Дело не в индусах, дело в скиле. Если скил нормальный и стек длинный, то ценник ты поставишь нормальный не зависимо от того индус ты или нет. А если кроме wp + css в стеке пусто, то соответственно. Если есть технология, которой можно научить обезьяну - она обречена на низкий ценник. Русские школьники тут не меньше индусов мешают. Выход? Делать то, что они не могут или на таком уровне на котором они не могут.
    Ответ написан
    Комментировать
  • Больше время ttfb. Как уменьшить?

    MedVedar
    @MedVedar
    e-commerce developer
    Нужно дебажить.
    Попробуйте отловить медленные запросы: https://wordpress.org/plugins/query-monitor/

    Попробуйте отловить медленные хуки, фильтры и тп. : https://wordpress.org/plugins/debug-bar-slow-actions/

    А там уже думайте, как оптимизировать и что делать дальше.

    Если все ровно и медленно вцелом, то попробуйте запустить свой сайт на другом хостинге и оценить скорость.
    Ответ написан
    Комментировать