<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>сайт Wordpress - Олексій Шибко</title>
	<atom:link href="https://www.alex-shybko.com.ua/tag/sajt-wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.alex-shybko.com.ua</link>
	<description>Індивідуальне проєктування будівель і споруд</description>
	<lastBuildDate>Fri, 16 Dec 2022 03:24:11 +0000</lastBuildDate>
	<language>uk</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/cropped-logo-32x32.png</url>
	<title>сайт Wordpress - Олексій Шибко</title>
	<link>https://www.alex-shybko.com.ua</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Ускорение WordPress. Тотальный разбор плагинов для кэширования</title>
		<link>https://www.alex-shybko.com.ua/2022/12/16/uskorenye-wordpress-totaln%d1%8bj-razbor-plagynov-dlya-k%d1%8dshyrovanyya/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=uskorenye-wordpress-totaln%25d1%258bj-razbor-plagynov-dlya-k%25d1%258dshyrovanyya</link>
					<comments>https://www.alex-shybko.com.ua/2022/12/16/uskorenye-wordpress-totaln%d1%8bj-razbor-plagynov-dlya-k%d1%8dshyrovanyya/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 16 Dec 2022 03:24:10 +0000</pubDate>
				<category><![CDATA[Створення сайтів]]></category>
		<category><![CDATA[сайт Wordpress]]></category>
		<guid isPermaLink="false">https://www.alex-shybko.com.ua/?p=1967</guid>

					<description><![CDATA[<p>WP Super Cache На сегодняшний день &#8211; это самый популярный плагин для кеширования WordPress. Его я выбрал в самом...</p>
<p>The post <a href="https://www.alex-shybko.com.ua/2022/12/16/uskorenye-wordpress-totaln%d1%8bj-razbor-plagynov-dlya-k%d1%8dshyrovanyya/">Ускорение WordPress. Тотальный разбор плагинов для кэширования</a> first appeared on <a href="https://www.alex-shybko.com.ua">Олексій Шибко</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">WP Super Cache</h2>



<p>На сегодняшний день &#8211; это самый популярный плагин для кеширования WordPress. Его я выбрал в самом начале своих потуг в оптимизации WordPress. В процессе эксплуатации выявлялись разные «косяки» в его работе, и я периодически правил настройки, чтобы подобрать оптимальные. На текущий момент у тех сайтов, где я использую этот плагин, настройки выглядят следующим образом:</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/2e8/ca9/353/2e8ca9353cedfce584749400dbca8e4d.png" alt="Настройки WP Super Cache" title="Настройки WP Super Cache"/><figcaption class="wp-element-caption">Настройки WP Super Cache</figcaption></figure>



<p>Почему именно так? И почему многие настройки отличаются от рекомендованных разработчиком и рекомендаций со StackOverflow.</p>



<ul class="wp-block-list">
<li><strong>Метод доставки кеша: «Простой»</strong>. Эта настройка отвечает за то, кто будет обрабатывать доставку кеша. При простом методе этим будет заниматься сам WordPress с помощью PHP, а при режиме «Эксперт» все правила будут записаны в файл .htaccess, и при попытке зайти на страницу, Apache отдаст уже готовый HTML-файл, если он существует. Действительно, на цифрах второй способ работает процентов на 10-20% быстрее. Но это, если сравнивать доставку с помощью PHP (положим, TTFB: 80 мс) и доставку с помощью mod_rewrite (положим, TTFB: 60 мс). Если же сравнивать с загрузкой страницы без применения кеширования (положим, TTFB: 6 000 мс) &#8211; разница получается не столь велика. При этом, выбрав первый («простой») способ доставки кеша, код, который мы можем разместить в корневом index.php, будет исполнен. Это позволит нам реализовать свой кастомный трекинг и другую нестандартную логику. Если же нет необходимости в исполнении каких-либо PHP-скриптов на сайте, то нужно выбирать вторую настройку «Эксперт».</li>



<li><strong>Отключить кеширование для авторизованных пользователей. (Рекомендовано).</strong>&nbsp;Это позволит редакторам и контент-менеджерам, которые работают с сайтом регулярно, не нажимать &#8220;Удалить весь кеш&#8221;, чтобы посмотреть внесенные ими изменения на страницах.</li>



<li><strong>Отключить «Сжимать файлы кэша чтобы ускорить работу (Рекомендовано)»</strong>. WP Super Cache создает 3 файла: HTML-копию страницы, GZIP-архив с этой страницей (чтобы браузер мог быстрее её получить, распаковать локально на ПК пользователя и быстрее её отобразить), а также php-файл, содержащий тот же самый HTML в случае, если кеш был создан не автоматически. Именно последний php-файл и будет отдаваться пользователям, пришедшим по рекламе, при этом для PHP-файла GZIP-архив не создается. Если же мы хотим, чтобы абсолютно всем пользователям (включая привлеченных с помощью рекламы) страница отдавалась в сжатом виде, то это лучше реализовать с помощью конфига Apache. В этом случае веб-сервер самостоятельно будет сжимать с помощью GZIP любую страницу вне зависимости от типа кеширования и в случае, если кеш-файл создан вообще не был. С помощью этой настройки мы просто сэкономим место на хостинге, которое выделяется под хранение GZIP-архивов с кешем.</li>



<li><strong>Авто перестройка кэша</strong>.&nbsp;<strong>Гости блога увидят устаревшие версии страниц кэша пока новые будут генерироваться. (Рекомендовано)</strong>. Эта настройка позволит отдавать всем пользователям всегда закешированные страницы, даже если срок жизни кеша уже истёк (в то время, пока новый кеш только создается).</li>



<li><strong>Отключить &#8220;Дополнительная сверка кэша (очень редко может нарушить работу кэширования). (Рекомендовано)&#8221;</strong>. Если функция будет включена, наша кастомная логика из index.php будет постоянно ломать кеш, и он будет постоянно пересоздаваться, принуждая пользователей видеть долгую загрузку.</li>



<li><strong>Отключить &#8220;Создать список страниц в кэше (выводится на этой странице)&#8221;</strong>. Нам это не нужно, список страниц всегда можно обновить и посмотреть в разделе «Состояние кеша».</li>
</ul>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/157/c84/e61/157c84e61ecec5e1e46678bcf650a8e9.png" alt="Настройки WP Super Cache" title="Настройки WP Super Cache"/><figcaption class="wp-element-caption">Настройки WP Super Cache</figcaption></figure>



<p>Отключаем таймаут кеширования. Позже мы включим автокеширование, которое не позволит очищать автоматически созданные файлы, при этом созданные кеш-файлы по заходам пользователей из рекламы будут удаляться по таймауту. Но нам это не нужно, эти файлы будут удалены при следующем запуске автокеширования, а если мы укажем таймаут меньше, чем интервал запуска автокеширования &#8211; они попросту удаляться раньше, чем нужно. Поэтому устанавливаем значение: &#8220;0&#8221;, при этом не стоит переживать за накопление мусора, при запуске автокеширования ВЕСЬ мусор будет удален.</p>



<p>Далее переходим на вкладку «Общий кеш», где реализуем автокеширование.</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/b77/afb/8e4/b77afb8e4dbcafd0cd46a6ee4e1f008b.png" alt="Настройка WP Super Cache" title="Настройка WP Super Cache"/><figcaption class="wp-element-caption">Настройка WP Super Cache</figcaption></figure>



<p>Нужно проставить все галки, а также подобрать оптимальный период обновления кеша для настраиваемого сайта.</p>



<p>Не стоит указывать слишком большой промежуток обновления кеша, чтобы при публикации контента, который доступен на нескольких страницах, не попасть в ситуацию, когда была опубликована новость или важный пресс-релиз, а на сайте эта публикация появляется только спустя сутки.</p>



<p>Да, WP Super Cache самостоятельно обновит кеш страницы при внесении в неё изменений, НО он не будет обновлять другие страницы, где может присутствовать эта запись (например, на главной, в подвале или в сайдбаре).</p>



<p>Слишком маленький промежуток устанавливать тоже не стоит, т.к. при запуске автокеширования будут удалены все кеш-файлы, которые были созданы, в том числе неавтоматическим способом (например, при переходе из рекламы), и пользователи, заходя на эти страницы, будут опять видеть медленную загрузку.</p>



<p>В общем, если на сайте активно публикуются новости или статьи, стоит указать промежуток от 1 до 2 часов. Если же сайт по большей части статичный, и на нём редко что-либо публикуется или редактируется, спокойно можно выставить интервал в 24 часа.</p>



<p>Также полезно будет включить галку у параметра «Сообщения о статусе кэша» на вкладке «Обслуживание», для того чтобы периодически поглядывать, когда фактически был создан кеш той или иной страницы, не отвалилось ли кеширование в принципе, нет ли проблем с автоматическим кешированием.</p>



<p>На этом настройка плагина завершена.</p>



<h3 class="wp-block-heading">Проблемы WP Super Cache</h3>



<p>Единственная (но критичная) проблема WP Super Cache заключается в том, что он не умеет вычленять из URL необходимые GET-параметры, и все страницы с UTM-метками и прочими аналитическими параметрами считает за уникальные.</p>



<p>Разработчики плагина как будто бы знали о такой проблеме, потому что предусмотрели настройку «Не кешировать страницы с параметрами GET (?x=y в конце URL)». Тем не менее, она ничего не даёт, кроме экономии места на диске, потому что кеш не будет создаваться для страниц с GET-параметрами.</p>



<p>Единственный способ избежать этой проблемы &#8211; это «колхозить» плагин. Колхоз и допилы чужих решений &#8211; это то, за что я проклинаю всех разработчиков, потому что так делать нельзя (как минимум, после обновления плагина &#8211; все твои изменения будут отменены).</p>



<p>Ничего умнее я не смог придумать, как добавить в файл&nbsp;<strong>wp-content/plugins/wp-super-cache/wp-cache-phase1.php&nbsp;</strong>следующий код:</p>



<pre class="wp-block-code"><code><strong>function</strong> <strong>removeGetParameter</strong>($url, $varname) {
	<strong>return</strong> preg_replace('#\\?$#', '', preg_replace('/(&#91;?&amp;])'.$varname.'=&#91;^&amp;]+(&amp;|$)/','$1',$url));
}
$wp_cache_request_uri = removeGetParameter($wp_cache_request_uri, "utm_source");
$wp_cache_request_uri = removeGetParameter($wp_cache_request_uri, "utm_medium");
$wp_cache_request_uri = removeGetParameter($wp_cache_request_uri, "utm_campaign");
$wp_cache_request_uri = removeGetParameter($wp_cache_request_uri, "utm_content");
$wp_cache_request_uri = removeGetParameter($wp_cache_request_uri, "utm_term");
$wp_cache_request_uri = removeGetParameter($wp_cache_request_uri, "gclid");
$wp_cache_request_uri = removeGetParameter($wp_cache_request_uri, "yclid");</code></pre>



<p>после строчки<strong>&nbsp;$wp_cache_request_uri</strong></p>



<p>Это позволяет указать плагину на то, какую страницу мы хотим достать из кеша, при этом не перенаправляя никуда пользователя (в адресной строке UTM-метки у пользователя останутся).</p>



<p>В итоге, проблема устранена, но не до конца. Даже если страница https://www.site.com/landing-page/ была ранее уже закеширована, при попытке зайти по ссылке https://www.site.com/landing-page/?utm_source=yandex&amp;utm_medium=cpc&amp;utm_campaign=promo&amp;utm_content=banner&amp;utm_term=i-wan-to-buy-something&amp;yclid=93473892748392743473829 рядом создается еще один файл кеша (естественно страница грузится медленно). В разделе «Статистика кеша» на странице плагина мы увидим 2 идентичных элемента: https://www.site.com/landing-page/ &nbsp;в разделе &#8220;WP Super Cached Files&#8221; и точно такую же https://www.site.com/landing-page/ в разделе &#8220;WP Fresh Cached Files&#8221;. Тем не менее, до момента истечения срока жизни кеша, при попытке обратиться с любым набором из описанных GET-параметров, который мы «приколхозили» с любым их значением (например, https://www.site.com/landing-page/?gclid=666), пользователю уже будет отдаваться кешированная версия (т.е. страница загрузится быстро).</p>



<p>Таким образом, если реклама ведется только на одну страницу сайта, а срок жизни кеша 1 час, то раз в час один пользователь будет грузить страницу медленно (пока создается кеш), при этом все остальные пользователи будут получать страницу быстро, ровно, как и те люди, которые заходят на сайт из поиска или по другим источникам без GET-параметров.</p>



<p>Ситуация стала значительно лучше, но до сих пор не идеальна. Представим, что реклама ведется на 100 страниц, реклама очень сильно таргетированная и с урезанными бюджетами. Так что не факт, что в час хотя бы один человек зайдет на ту или иную страницу (по рекламе). В этом случае профит не столь очевидный. При таком раскладе каждый привлеченный по рекламе человек будет долго ждать пока страница будет загружена.</p>



<p>Перелопатив тысячи строк кода, я так и не нашел способ это победить. Поэтому для себя, пока что, я нашел очень «костыльный», но всё же работающий способ решить эту проблему:</p>



<ol class="wp-block-list">
<li>Пишем PHP-скрипт, который поштучно обходит файл sitemap.xml и дёргает за раз по 10 ссылок (поочередно)</li>



<li>Добавляем к каждой ссылке «/?utm_source=test» и с помощью file_get_contents «открываем» эти страницы</li>



<li>Вешаем этот скрипт на CRON с запуском каждую минуту</li>
</ol>



<p>10 хитов в минуту — это не слишком много, а при условии, что по большей части будет отдаваться уже существующей кеш, то ощутимой нагрузки это не создаст. Тем не менее, WP Super Cache создаст кеш-файлы для всех страниц сайта, которые могут игнорировать указанные нами GET-параметры.</p>



<p>Да, в лоб, но это работает! Если кто-то найдет более элегантный способ подружить WP Super Cache с GET-параметрами &#8211; приглашаю в комментарии.</p>



<h2 class="wp-block-heading">WP Rocket</h2>



<p>В попытках найти более элегантный способ для реализации кеширования с GET-параметрами, я решил попробовать другой плагин &#8211; WP Rocket. И это полный провал. Несмотря на то, что плагин распространяется исключительно платно (по подписке), имеет красивый интерфейс и кучу настроек &#8211; все они бесполезны!</p>



<p><strong>Во-первых</strong>, возможности выбора метода доставки кеша (mod_rewrite или PHP) нет, он работает исключительно через mod_rewrite, поэтому реализовать кастомный трекинг (как и любую другю PHP-логику) невозможно.</p>



<p><strong>Во-вторых</strong>, автокеширование даже сравнительно небольшого сайта (~100 страниц) убивает напрочь сервер, на котором он крутится (скорее всего WP Rocket пытается осуществить обход всех страниц разом).</p>



<p><strong>В-третьих</strong>, уже созданный кеш на половине страниц отваливается буквально через пару минут после его создания по неизвестной причине.</p>



<p>В общем, я даже не стал тратить время на доработки этого плагина.</p>



<h2 class="wp-block-heading">W3 Total Cache</h2>



<p>Следующим на очереди у меня был W3 Total Cache. Он хорошо себя показал, и имеет право на жизнь. Он имеет настройку, которая позволяет игнорировать указанные GET-параметры, и это работает без «костылей», как с WP Super Cache. Также W3 Total Cache имеет возможность работать через PHP (выбрав в разделе &#8220;Page Cache&#8221; настройку хранилища &#8220;Disk: Basic&#8221;, код, размещенный в корневом index.php, будет исполнен, а скорость загрузки закешированных страниц будет высокая, сопоставимая с результатами WP Super Cache). В целом, функционал W3 Total Cache значительно превосходит WP Super Cache. Помимо множества вариантов более сложного кеширования (Memcached, APC, Zend OPcache, Redis), он из коробки умеет объединять и сжимать HTML, CSS и JS, а также выполнять Lazy Loading изображений.</p>



<p>Тем не менее для меня критичными оказались 2 проблемы:</p>



<ol class="wp-block-list">
<li>По неизвестной причине страницы, периодически, грузятся очень долго. При этом на странице присутствует комментарий, что она была давно закеширована и, по логике, должна отдаваться быстро, но страница грузится долго. Чаще всего такое поведение наблюдается на втором клике визита (вне зависимости от того, какую страницу открыть). Кеш таких страниц в момент долгой загрузки не обновляется, т.е. после перезагрузки страницы, или, при открытии её с другого устройства, комментарий, содержащий информацию о времени кеширования, остается неизменным. Решается эта проблема переключением обработчика на mod_rewrite (в настройках Page Cahe эта опция называется &#8220;Disk: Enhanced&#8221;). Но в моём случае это неприменимо, т.к. мне требуется выполнение PHP-кода при посещении страниц.</li>



<li>Вторая очень болезненная проблема &#8211; это процесс обновления кеша. W3 Total Cache конечно имеет функцию пребилда, т.е. он автоматически с заданным интервалом обходит сайт согласно sitemap.xml для создания кеш-файлов. При этом обход он осуществляет непрерывно, но пересоздает кеш-файлы лишь в тот момент времени, когда кеш уже устарел. В итоге получается следующая ситуация &#8211; в момент, когда время жизни кеша истекло, W3 Total Cache не успевает быстро обойти весь сайт, чтобы обновить кеш-файлы, и когда пользователь пытается зайти на страницу, с большой вероятностью она окажется с просроченным кешем и будет грузиться медленно. Ротация обхода тоже вряд ли совпадет с датами истечения кеша страниц, потому что обход запускается не в какой-то определенный момент времени, а работает непрерывно. И если страница была закеширована в 21:00, то далеко не факт, что после истечения срока жизни кеша (например, 1 час) эта страница попадет в обход ровно в 22:00.</li>
</ol>



<p>В итоге имеем ситуацию:</p>



<ul class="wp-block-list">
<li>Сайт 100 страниц</li>



<li>Время жизни кеша: 1 час</li>



<li>TTFB без кеширования: 5-6 сек (5 000 – 6 000 мс)</li>



<li>Обход: 1 раз в минуту по 10 страниц (за указанный промежуток времени больше 10 страниц при таких характеристиках лучше не обходить, т.к. если страницы не будут успевать кешироваться, то будет забиваться Cron и расти нагрузка на сервер. Меньше 1 раза в минуту указать нельзя, т.к. минута &#8211; это минимальный интервал Cron-а WordPress).</li>
</ul>



<p>В этом случае каждый час у нас будет промежуток в +/- 10 минут, когда пользователь может попасть на страницу, кеш которой истек, а новый кеш будет создаваться во время загрузки страницы для этого пользователя. Пользователь увидит долгую загрузку страницы (чего мы пытаемся избежать).</p>



<p>Увеличивать время жизни кеша не хочется. Да, при обновлении страниц или новостей кеш для них автоматически будет обновлен, но на других страницах, куда могут быть подгружены эти записи, например, на главную, кеш обновлен не будет, а соответственно, добавленная или измененная запись там не появятся ровно до тех пор, пока не истечет время жизни предыдущего кеша.</p>



<p>Тем не менее в случае, если нет желания дорабатывать WP Super Cache, то W3 Total Cache вполне себе альтернатива. Также W3 Total Cache отлично подойдет для статичных сайтов, где можно обновлять кеш раз в сутки &#8211; запустил один раз ночью, и пусть он всё обновляет пока на сайте трафика мало. Либо вообще не использовать функцию автокеширования и обновлять кеш вручную при изменении сайта.</p>



<h3 class="wp-block-heading">Настройка W3 Total Cache</h3>



<p>После установки и активации плагина, нас встречает &#8220;Мастер настройки&#8221;. Для каждого типа кеширования он проведет наглядные тесты и предложит на выбор разные параметры кеширования.</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/6b4/e26/359/6b4e263593a531dbfbc8850382eae5d4.png" alt="Настройка W3 Total Cache" title="Настройка W3 Total Cache"/><figcaption class="wp-element-caption">Настройка W3 Total Cache</figcaption></figure>



<ul class="wp-block-list">
<li>На вкладке &#8220;Page Cache&#8221; выбираем &#8220;Диск: базовое&#8221;, если хотим использовать кастомную PHP-логику. Если наличие такой возможности не критично, то выбираем &#8220;Диск: расширенное&#8221;, в этом случае рулить доставкой кеша будет mod_rewrite, а скорость загрузки страниц будет немного выше.</li>



<li>На вкладке &#8220;Кеш БД&#8221; выбираем &#8220;Отсутствует&#8221;, т.к. у нас уже есть закешированные копии HTML-страниц. Кеширование БД нам потребуется только в том случае, если по какой-то причине кеширование страниц (Page Cache) отключено.</li>



<li>На вкладке &#8220;Объектное кеширование&#8221; выбираем &#8220;Отсутствует&#8221;, т.к. у нас уже есть закешированные копии HTML-страниц. Кеширование объектов нам потребуется только в том случае, если по какой-то причине кеширование страниц (Page Cache) отключено.</li>



<li>На вкладке &#8220;Browser Cache&#8221; выбираем &#8220;Включено&#8221;, это позволит сохранить на непродолжительное время копию страницы сайта в браузере пользователя. И, если он повторно попытается зайти на эту страницу, она мгновенно будет загружена браузером из локального хранилища устройства пользователя.</li>



<li>&#8220;Lazy Load изображений&#8221; сейчас мы не включаем, это уже относится к оптимизации контента на сайте. Способы оптимизации HTML, JS, CSS и изображений можно рассмотреть в отдельной статье.</li>
</ul>



<p>Далее переходим в админке в раздел &#8220;Perfomance&#8221; &#8211; &#8220;Page cache&#8221;</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/bcc/2ff/d29/bcc2ffd2952dc944f668e86c89c361c5.png" alt="Настройка W3 Total Cache" title="Настройка W3 Total Cache"/><figcaption class="wp-element-caption">Настройка W3 Total Cache</figcaption></figure>



<p>Включаем автокеширование (&#8220;Автоматическая настройка кеша страницы&#8221;), указываем интервал обновления (минимум 60 секунд, т.к. WP Cron не умеет работать быстрее), указываем кол-во страниц в интервале &#8211; выбираем в зависимости от скорости загрузки страниц без применения кеширования (если без кеширующего плагина в среднем TTFB страниц ~5 сек., то стоит указать кол-во не более 12, чтобы не нагружать лишний раз сервер). Также необходимо указать путь к Sitemap.XML, на основе которого будет осуществляться обход сайта. Рекомендую использовать для построения Sitemap.XML плагин &#8220;Yoast SEO&#8221;, т.к. для интеграции с Yoast SEO у W3 Total Cache есть отдельное расширение, а это значит, что сайтпамы, сгенерированные Yoast SEO будут поглощаться плагином W3 Total Cache без каких-либо ошибок.</p>



<p>Чтобы отключить автокеширование у плагина W3 Total Cache достаточно поставить 0 в интервале обновления.</p>



<p>Далее спускаемся к разделу &#8220;Advanced&#8221;:</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/fa5/a33/8e1/fa5a338e14fd76c168284457bac94fb2.png" alt="Настройка W3 Total Cache" title="Настройка W3 Total Cache"/><figcaption class="wp-element-caption">Настройка W3 Total Cache</figcaption></figure>



<p>В блоке &#8220;Принятые строки запроса&#8221; указываем те GET-параметры URL-адресов, которые мы не хотим кешировать отдельно. Также укажем значения &#8220;Максимальное время жизни кэшированых объектов&#8221; и &#8220;Период удаления устаревшего кэша&#8221; в зависимости от того как часто мы хотим обновлять кеш. Нажимаем &#8220;Сохранить настройки и очистить кэш&#8221;. На этом настройка плагина завершена.</p>



<p>Выше я уже писал о том, что периодически, несмотря на то, что кеш для определенных страниц уже создан, они все равно грузятся медленно. Частично исправить эту проблему поможет включение PHP-расширения &#8220;Zend Opcache&#8221; на сервере с сайтом.</p>



<p>Тем не менее вторую проблему (долгая загрузка страниц в период обновления кеша) решить невозможно, т.к. это особенность логики работы плагина W3 Total Cache, поэтому я продолжаю свои изыскания.</p>



<h2 class="wp-block-heading">LiteSpeed Cache</h2>



<p>Еще один популярный плагин для кеширования WordPress. Как оказалось, это попросту рекламный инструмент, вынуждающий пользователей использовать веб-сервер LiteSpeed вместо Apache или nginx, обещая при этом космическую скорость работы сайта (несмотря на то, что половина шаблонов и плагинов не будут работать на LiteSpeed, т.к. не оптимизированы под него). Что вообще за зверь этот LiteSpeed лучше всего продемонстрируют&nbsp;<a href="https://qna.habr.com/q/5543">комментарии</a>&nbsp;на Хабре.</p>



<p>Не интересно, едем дальше.</p>



<h2 class="wp-block-heading">Swift performance</h2>



<p>Очередной плагин, распространяющийся исключительно по подписке.</p>



<p>По началу я отнесся к нему крайне скептически, очередной «миллион-в-одном-плагин» с кучей «свистелок», но он смог меня удивить.</p>



<p>Человеческая настройка исключения GET-параметров из URL-адресов, которая работает без «колхоза», возможность работы без mod_rewrite (что позволяет исполнять кастомную PHP-логику), умное автокеширование, инструменты оптимизации контента (html/js/css minify, lazy loading, генерация WebP-изображений). И это чудо работает без танцев с бубном.</p>



<p>Правда, на практике всё оказалось не столь радужно. О недостатках ниже.</p>



<h3 class="wp-block-heading">Настройка Swift perfomance</h3>



<p>Параметров для настройки у Swift perfomance огромное множество. Поэтому будет проще не перечислять их все, а указать лишь те, которые отличаются от дефолтных.</p>



<p>После установки и активации плагина нас встречает вот такое меню:</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/954/7ae/d3a/9547aed3a828d2e53573522f7ed4b0c5.png" alt="Настройка Swift performance" title="Настройка Swift performance"/><figcaption class="wp-element-caption">Настройка Swift performance</figcaption></figure>



<p>Нажимаем &#8220;Manual configuration&#8221; и попадаем в консоль Swift perfomance, где сразу же нажимаем &#8220;Advanced view&#8221;:</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/7e9/784/e99/7e9784e99699e79c953abd6f1020933a.png" alt="Настройка Swift perfomance" title="Настройка Swift perfomance"/><figcaption class="wp-element-caption">Настройка Swift perfomance</figcaption></figure>



<ul class="wp-block-list">
<li><strong>Раздел Media → Images</strong>&nbsp;отключаем функции&nbsp;<strong>&#8220;Generate WebP&#8221;</strong>&nbsp;и&nbsp;<strong>&#8220;Lazyload Images&#8221;</strong>, так как, повторюсь, мы сейчас работаем именно с кешированием, а не с оптимизацией контента на сайте. К тому же этот функционал требует тестирования, т.к. не везде он работает адекватно и даёт ощутимый прирост в производительности.</li>



<li><strong>Раздел Optimization → General</strong>&nbsp;отключаем&nbsp;<strong>&#8220;Fix Invalid HTML&#8221;</strong>&nbsp;(всё по той же причине, что и выше).</li>



<li><strong>Раздел Caching → General</strong>&nbsp;оставляем значение параметра&nbsp;<strong>&#8220;Caching Mode&#8221; = &#8220;Disk Cache with PHP&#8221;</strong>, чтобы иметь возможность выполнять свои PHP-скрипты в корневом index.php или же выбираем<strong>&nbsp;&#8220;Disk Cache with Rewrites&#8221;</strong>, чтобы слегка увеличить скорость загрузки сайта.</li>



<li><strong>Раздел Caching → General&nbsp;</strong>устанавливаем значение параметра&nbsp;<strong>&#8220;Cache Expiry Mode&#8221; = &#8220;Action based mode&#8221;</strong>&nbsp;чтобы кеш обновлялся не по таймеру, а только при внесении изменений.</li>



<li><strong>Раздел Caching → Tweaks&nbsp;</strong>в разделе<strong>&nbsp;&#8220;Ignore GET Params&#8221;</strong>&nbsp;указываем перечень наших GET-параметров для исключения из обработки URL при кешировании и отдачи кеш-файлов.</li>
</ul>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/888/dcd/738/888dcd7385857cccd0ad1f23e07bca89.png" alt="Настройка Swift perfomance" title="Настройка Swift perfomance"/><figcaption class="wp-element-caption">Настройка Swift perfomance</figcaption></figure>



<ul class="wp-block-list">
<li><strong>Раздел Caching → Warmup</strong>&nbsp;включаем&nbsp;<strong>&#8220;Prebuild Cache Automatically&#8221;,</strong>&nbsp;как раз для автокеширования, скорость выбираем согласно рекомендациям (Moderate для shared-хостинга, Multi thread &#8211; если сайт крутится на своей VDS), а также включаем опцию&nbsp;<strong>&#8220;Discover New Pages&#8221;</strong>, чтобы плагин искал и кешировал новые страницы автоматически.</li>
</ul>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/547/1ca/532/5471ca5324b8013bd48322f05e23548d.png" alt="Настройка Swift perfomance" title="Настройка Swift perfomance"/><figcaption class="wp-element-caption">Настройка Swift perfomance</figcaption></figure>



<p>Нажимаем «Save changes». На этом настройка плагина закончена.</p>



<h3 class="wp-block-heading">Недостатки Swift perfomance</h3>



<ol class="wp-block-list">
<li>Он не умеет в кириллицу. Swift perfomance создает кеш ровно по тем адресам, которые имеют страницы сайта, т.е. если у нас URL страницы выглядит как&nbsp;<a href="https://example.com/%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D1%8B">https://example.com/контакты</a>, он не будет переводить &#8220;контакты&#8221; в URL-encoded для создания кеша. Но браузер будет обращаться именно к&nbsp;<a href="https://example.com/%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D1%8B">https://example.com/%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D1%8B</a>, поэтому страницы, содержащие кириллицу, будут загружаться всегда медленно. Мелочь, но неприятно.</li>



<li>Скорость загрузки закешированных страниц с помощью Swift Perfomance всё же в 2-3 раза медленней, чем у WP Super Cache или у W3 Total Cache. Опять же, это не столь критично, когда при использовании кеширующего плагина скорость загрузки страницы упала с 8 000 мс до 300 мс, а не до 100 мс. Ведь не стоит забывать, что в этот момент пользователь всё равно не может пользоваться сайтом, т.к. страница должна отрендериться в браузере, должны загрузиться статичные файлы (css, js, картинки), а это явно не 100 и даже не 300 миллисекунд (если, конечно, сайт &#8211; это не черный текст на белом фоне).</li>



<li>Критичной стала проблема в работе «умного» кеширования в режиме «Action based mode». Разработчики заявляют, что при внесении изменений на сайте, запускается процесс обхода всех страниц сайта, при котором создаются новые кеш-копии файлов, а посетителям сайта продолжают отдаваться старые, пока новые не создадутся. В теории сайт всегда должен работать быстро, кеш перестраиваться максимально оперативно после обновления какой-либо информации на сайте, при этом нагрузка на сервер должна быть минимальной, т.к. процесс кеширования не происходит ровно до того момента, пока на сайте не были внесены изменения. По началу так и работает, но в какой-то момент всё ломается. На практике это «умное» автокеширование работает нестабильно. В какой-то момент созданные ранее кеш-файлы просто пропадают, плагин их удаляет или происходит какой-то рассинхрон, хотя новые копии под них ещё не были созданы, и сайт остаётся без какого-либо кеширования. Приходится запускать переобход вручную, а это ведёт к сильной нагрузке на сервер.<br><br>Если же выбрать классический вариант обновления кеша (по таймауту) &#8211; &#8220;Time based mode&#8221; &#8211; проявятся все те же проблемы как у WP Rocket или W3 Total Cache &#8211; то отвалится автокеширование, то кеш-файлы будут удалены буквально через пару минут после их генерации. В общем, пользоваться Time based mode я не смог.<br><br>Когда мы вручную обновляем весь кеш сайта, далеко не все страницы работают быстро. Через несколько минут после ручного запуска переобхода сайта, часть страниц уже имеют новый кеш (работают быстро), часть страниц еще отдаются со старым кешем (видим, что свежая новость в сайдбарах на этих страницах еще не появилась), но часть страниц (причем, немалая) грузится ужасно долго (8 – 12 сек. против 3-4 сек. без использования кеширования вообще).</li>
</ol>



<p>В общем, я возлагал большие надежды на Swift Perfomance, но из-за нестабильной работы своего основного функционала, пришлось от него отказаться. На текущий момент я его не использую ни на одном из проектов.</p>



<h2 class="wp-block-heading">WP Fastest Cache</h2>



<p>WP Fastest Cache — это еще один популярный плагин для кеширования WordPress.</p>



<p>Забегая вперед, WP Fastest Cache вернул меня обратно к «колхозу». Но несмотря на это, на сегодня он попал в мои фавориты.</p>



<h3 class="wp-block-heading">Настройка WP Fastest Cache</h3>



<ul class="wp-block-list">
<li>Скачиваем и активируем плагин</li>



<li>Ставим три галки как показано на скриншоте</li>
</ul>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/a41/f79/f05/a41f79f0502a3129141d73a1fd66dc84.png" alt="Настройка WP Fastest Cache" title="Настройка WP Fastest Cache"/><figcaption class="wp-element-caption">Настройка WP Fastest Cache</figcaption></figure>



<ul class="wp-block-list">
<li>Готово</li>
</ul>



<p>Серьезно, ещё ни один плагин не настраивался так быстро!</p>



<p>Кстати, после того как мы нажмем на «Автоматическая предварительная генерация кэша всего сайта», появится поп-ап, в котором необходимо указать следующие настройки.</p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/206/6a3/6cb/2066a36cb11233b81dce4b24e72ee29a.png" alt="Настройка WP Fastest Cache" title="Настройка WP Fastest Cache"/><figcaption class="wp-element-caption">Настройка WP Fastest Cache</figcaption></figure>



<p>Вот оно. Плагин, который не требует кучи параметров и просто работает. Плагин обходит сайт 1 раз в 5 минут (изменить в настройках время невозможно, но разработчики предусмотрели такую возможность через редактирование файла wp-config.php). Плагин кеширует указанное кол-во страниц (не более 12 шт. за раз, но с помощью wp-config.php можно указать любое количество). Пользователям отдаются кешированные файлы вне зависимости от их давности, а плагин в фоне (если установлена галочка «Restart After Completed») будет непрерывно обходить весь сайт для обновления файлов кеша.</p>



<p>Но почему я написал, что этот плагин вернул меня к «колхозу»?</p>



<p><strong>Во-первых.</strong>&nbsp;Не довели разработчики до ума функционал игнорирования GET-параметров. UTM-метки и gclid работают без проблем &#8211; закешированная версия страницы загружается быстро. Но, к сожалению, разработчики не знают про Яндекс, и наличие метки yclid всё ломает, а страницы с такой меткой грузятся медленно. Раз уж мы начали с «колхоза», «колхозом» и закончим.</p>



<p>Открываем файл&nbsp;<strong>/wp-content/plugins/wp-fastest-cache/inc/cache.php</strong>&nbsp;и ищем&nbsp;<strong>&#8220;gclid&#8221;</strong></p>



<figure class="wp-block-image"><img decoding="async" src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/23d/727/fe1/23d727fe1e64b642b786281663e63a23.png" alt="Доработка WP Fastest Cache" title="Доработка WP Fastest Cache"/><figcaption class="wp-element-caption">Доработка WP Fastest Cache</figcaption></figure>



<p>после чего по тому же самому принципу добавляем недостающие GET-параметры, такие как yclid.</p>



<p><strong>В-вторых</strong>, WP Fastest Cache работает исключительно с помощью mod_rewrite и выполнить свой PHP-код в момент конкретной загрузки страницы посетителем нельзя. Но и это решается с помощью доработки.</p>



<p>Открываем в корневой директории файл .htaccess и дописываем в начало следующий код:</p>



<pre class="wp-block-code"><code>&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_METHOD} !POST
   RewriteCond %{HTTP:Cookie} !PHPSESSID
   RewriteCond %{REQUEST_URI} !(\/){2}$
   RewriteCond %{REQUEST_URI} \/$
   RewriteCond %{QUERY_STRING} !.+
   RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/all/$1/index.html -f
   RewriteRule ^(.*) "lkdm-cache.php?$1" &#91;L]
&lt;/IfModule&gt;</code></pre>



<p>Что тут написано? Мы проверяем, что запрос был совершен без POST-параметров (т.е. это не отправка какой-то формы, логику работы которой мы не хотим нарушать), а также у пользователя отсутствовала кука PHPSESSID, отвечающая за хранение информации о сессии пользователя. В этом случае мы проверяем существует ли кеш-файл для страницы, которую пользователь пытается открыть, если да, то мы отдаем пользователю файл lkdm-cache.php с GET-запросом пользователя (полный URL-адрес) и останавливаем исполнение условий, описанных в .htaccess. В иных случаях ничего не делаем, и обработкой запроса занимаются правила WP Fastest Cache, описанные ниже в файле .htaccess. При этом, если кеш-копии файла нет, то мы ничего не делаем, наш код будет выполнен уже из корневого index.php.</p>



<p>Теперь нам нужно исполнить свой код. Для этого создаем файл lkdm-cache.php в корневой директории WordPress, указываем в нём тот код, который нам необходимо исполнить, а после этого пишем следующее, чтобы отдать пользователю кеш-копию страницы:</p>



<pre class="wp-block-code"><code><strong>echo</strong> file_get_contents("wp-content/cache/all".$_SERVER&#91;'REQUEST_URI']."index.html");</code></pre>



<h3 class="wp-block-heading">Стоит обратить внимание</h3>



<ol class="wp-block-list">
<li>После обновления плагина WP Fastest Cache всегда необходимо вносить изменения, связанные с GET-параметрами в файл&nbsp;<strong>/wp-content/plugins/wp-fastest-cache/inc/cache.php</strong></li>



<li>После обновления настроек плагина WP Fastest Cache всегда необходимо переносить добавленный в .htaccess код в самое начало, т.к. ровно то же самое (перенос в начало) делает плагин при обновлении настроек. Соответственно, наш код из .htaccess исполнен не будет, если он находится ниже куска кода от WP Fastest Cache.</li>
</ol>



<h2 class="wp-block-heading">Заключение</h2>



<p>Сейчас на большинстве проектов я использую WP Fastest Cache со своими доработками. W3 Total Cache устанавливаю только на статичные сайты, обычно лендинги, где практически не вносятся изменения, он будет выдавать максимальную скорость загрузки. Также WP Super Cache устанавливаю периодически на сайты, если точно знаю, что на сайт не будет вестись реклама в будущем, т.к. мне он кажется самым простым в установке и настройке. WP Super Cache в этом плане был бы самым универсальным и стабильно работающим плагином, если бы разработчики предусмотрели возможность исключения части запросов из URL-адреса. Сейчас же приходится дорабатывать исходный код.</p>



<p>В заключение скажу, что у всех плагинов находятся свои проблемы. Мирится с ними, не замечать или дорабатывать решает каждый сам. </p><p>The post <a href="https://www.alex-shybko.com.ua/2022/12/16/uskorenye-wordpress-totaln%d1%8bj-razbor-plagynov-dlya-k%d1%8dshyrovanyya/">Ускорение WordPress. Тотальный разбор плагинов для кэширования</a> first appeared on <a href="https://www.alex-shybko.com.ua">Олексій Шибко</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.alex-shybko.com.ua/2022/12/16/uskorenye-wordpress-totaln%d1%8bj-razbor-plagynov-dlya-k%d1%8dshyrovanyya/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Як зробити картинку прозорою в Paint.NET?</title>
		<link>https://www.alex-shybko.com.ua/2022/07/18/prozorist-v-paint-net/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=prozorist-v-paint-net</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 18 Jul 2022 17:10:48 +0000</pubDate>
				<category><![CDATA[Створення сайтів]]></category>
		<category><![CDATA[paint.net]]></category>
		<category><![CDATA[сайт Wordpress]]></category>
		<guid isPermaLink="false">https://www.alex-shybko.com.ua/?p=1834</guid>

					<description><![CDATA[<p>У багатьох можна знайти на комп&#8217;ютерах безкоштовну програму для редагування зображень Paint.NET. Вона не вимоглива до ресурсів, але пропонує...</p>
<p>The post <a href="https://www.alex-shybko.com.ua/2022/07/18/prozorist-v-paint-net/">Як зробити картинку прозорою в Paint.NET?</a> first appeared on <a href="https://www.alex-shybko.com.ua">Олексій Шибко</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>У багатьох можна знайти на комп&#8217;ютерах безкоштовну програму для редагування зображень Paint.NET. Вона не вимоглива до ресурсів, але пропонує багато можливостей, і далі ми розглянемо, як зробити картинку прозорою в Paint.NET.</p>



<p>Зробити зображення прозорим у Paint.NET дуже просто, але набагато складніше знайти необхідний пункт меню. Пункту меню, в якому явно йдеться про прозорість зображення, немає. Але таку можливість можна знайти у властивостях шару. Переходимо в меню&nbsp;«Шари», вибираємо пункт&nbsp;«Властивості шару…»&nbsp;і встановлюємо необхідний рівень прозорості.</p>



<figure class="wp-block-image size-large"><a href="https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-1024x546.png"><img fetchpriority="high" decoding="async" width="1024" height="546" src="https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-1024x546.png" alt="" class="wp-image-1835" srcset="https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-1024x546.png 1024w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-300x160.png 300w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-768x409.png 768w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-500x266.png 500w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-800x426.png 800w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17-1280x682.png 1280w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-17.png 1366w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Далі потрібно лише правильно зберегти картинку, щоб не втратити прозорість. Для цього зберігаємо картинку у форматі «PNG».</p><p>The post <a href="https://www.alex-shybko.com.ua/2022/07/18/prozorist-v-paint-net/">Як зробити картинку прозорою в Paint.NET?</a> first appeared on <a href="https://www.alex-shybko.com.ua">Олексій Шибко</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Як додати декілька мов на сайт WordPress</title>
		<link>https://www.alex-shybko.com.ua/2022/07/15/yak-dodaty-dekilka-mov-na-sajt-wordpress/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=yak-dodaty-dekilka-mov-na-sajt-wordpress</link>
					<comments>https://www.alex-shybko.com.ua/2022/07/15/yak-dodaty-dekilka-mov-na-sajt-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 15 Jul 2022 20:50:03 +0000</pubDate>
				<category><![CDATA[Створення сайтів]]></category>
		<category><![CDATA[сайт Wordpress]]></category>
		<guid isPermaLink="false">https://www.alex-shybko.com.ua/?p=1413</guid>

					<description><![CDATA[<p>Стаття орієнтована на людей, знайомих зі структурою файлів WordPress. Всі правки можна зробити, маючи доступ до адміністративної панелі сайту....</p>
<p>The post <a href="https://www.alex-shybko.com.ua/2022/07/15/yak-dodaty-dekilka-mov-na-sajt-wordpress/">Як додати декілька мов на сайт WordPress</a> first appeared on <a href="https://www.alex-shybko.com.ua">Олексій Шибко</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Стаття орієнтована на людей, знайомих зі структурою файлів WordPress. Всі правки можна зробити, маючи доступ до адміністративної панелі сайту.</p>



<p>15.05.2019 в Україні прийнятий&nbsp;<a href="http://w1.c1.rada.gov.ua/pls/zweb2/webproc4_2?id=&amp;pf3516=5670-%D0%B4&amp;skl=9">«Закон про забезпечення функціонування української мови як державної»</a>. У статті 23, частині 6 цього Закону йдеться про те, що сайти та сторінки в соцмережах компаній, які продають товари в Україні та зареєстровані в Україні, повинні бути українською мовою. На сайтах іноземних компаній, які продають товари в Україні, українська версія також повинна завантажуватися за замовчуванням. Мобільні додатки,&nbsp;<a href="https://arto.agency/ua/pwa/">PWA</a>&nbsp;компаній, що продають товари і послуги в Україні, повинні мати українську версію.</p>



<p>Норма про переклад сайтів та сторінок набуває чинності через 18 місяців після підписання президентом; отже, до&nbsp;<strong>15 листопада 2020 року&nbsp;</strong>ми маємо запустити українські версії сайтів, які б завантажувалися за замовчуванням.</p>



<p>Для сайтів в Україні, які наразі не мають версії державною мовою, її впровадження може викликати певні технічні труднощі. Саме тому у цій статті ми вирішили розповісти, як додати другу мову на сайт на прикладі CMS WordPress, яка є найпопулярнішою системою управління контентом у світі.</p>



<h2 class="wp-block-heading">Що необхідно для додавання багатомовності?</h2>



<p>Структура WordPress у стандартній комплектації не має підтримки багатомовності. Але за допомогою плагінів її можна реалізувати, створюючи записи (post) і описи таксономій (категорій товарів, рубрик) для інших мов у базі даних та зв’язуючи їх між собою. Для реалізації багатомовності сайту на WordPress ми використовуємо плагін&nbsp;<strong>Polylang</strong>, про який ітиметься далі.</p>



<p>Крім того, нам знадобиться плагін&nbsp;<strong>Loco Translate</strong>, який дозволяє здійснити переклад тем і плагінів шляхом внесення змін у мовні файли .mo і .po.</p>



<h2 class="wp-block-heading">Покрокова інструкція додавання багатомовності</h2>



<h3 class="wp-block-heading">1. ВСТАНОВІТЬ ПЛАГІНИ:</h3>



<ul class="wp-block-list"><li>Polylang</li><li>Loco Translate (якщо не бажаєте здійснювати переклад тем і плагінів &#8211; не встановлюйте)</li></ul>



<p>Якщо Ваш сайт використовує&nbsp;<strong>Woocommerce</strong>&nbsp;чи&nbsp;<strong>Contact Form 7</strong>, варто встановити також плагіни їх адаптації під Polylang:</p>



<ul class="wp-block-list"><li>Hyyan WooCommerce Polylang Integration</li><li>Contact Form 7 Polylang Module</li></ul>



<h3 class="wp-block-heading">2. ДОДАЙТЕ МОВИ</h3>



<p>Перейдіть на сторінку&nbsp;<strong>Languages</strong>&nbsp;і додайте всі необхідні для веб-сайту мови. Після цього відмітьте зірочкою мову «за замовчуванням» – вона повинна бути основною на вашому сайті.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_01.jpg" alt=""/></figure>



<p>Сторінка додавання мов Polylang. На скріншоті видно, що додано дві мови – українську та російську. У даному прикладі російська відмічена зірочкою, як основна мова сайту.&nbsp;</p>



<h3 class="wp-block-heading">3. НАЛАШТУЙТЕ POLYLANG</h3>



<p>За необхідності здійсніть додаткові налаштування плагіну Polylang. Для цього перейдіть на цю сторінку:</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_02.jpg" alt=""/></figure>



<p>Доступні такі опції для налаштування.</p>



<ul class="wp-block-list"><li><strong>URL modifications.&nbsp;</strong>Визначає url-формат мовних версій сайту. Алгоритм формування альтернативної мовної версії залежить від SEO-стратегії, яку ви обрали: це може бути розміщення альтернативних мовних версій на піддоменах (наприклад, en.site.com, de.site.com) або в піддиректоріях (наприклад, site.com/en/, site.com/de/). Оптимальним варіантом вважається додавання мовної версії у вигляді директорії<em>,</em>&nbsp;наприклад, https://example.com (основна мова), https://example.com/ru/ (російська мова), https://example.com/en/ (англійська мова).</li><li><strong>Detect browser language.&nbsp;</strong>Активація чи деактивація автоматичного визначення мови браузера з подальшим автоматичним переспрямуванням (редіректом) користувача на відповідну мовну версію. Якщо мови браузера на сайті немає, буде обиратись основна мова. Користувачі не завжди правильно виставляють налаштування в браузері, тому ми рекомендуємо вимикати цю опцію.</li><li><strong>Media.&nbsp;</strong>Активація або деактивація перекладів для медіа-файлів. Якщо активовано, буде доступний переклад метаданих зображення на інші мови. При цьому зображення стають прив&#8217;язаними до певних мов. Під час використання медіа-бібліотеки при редагуванні елемента можливий вибір тільки із зображень, що прив&#8217;язані до мови елемента, редагування якого виконується. Якщо після ввімкнення плагіна у вас &#8220;зникли&#8221; зображення в медіа-бібліотеці, це налаштування може бути основною причиною проблеми. Якщо ж вам не потрібен переклад атрибутів alt і title зображень, то цю опцію слід деактивувати.</li><li><strong>Custom post types and taxonomies.&nbsp;</strong>Використовуючи цю опцію, ви можете налаштувати, які типи записів і таксономій варто робити багатомовними, а які ні. У більшості випадків варто відмічати все, щоб кожна сторінка на сайті мала альтернативну мовну версію.</li><li><strong>Synchronization.&nbsp;</strong>Налаштування синхронізації дозволяють проводити оновлення даних при зміні мета-значень в одній з мовних версій. Наприклад, якщо у вас інтернет-магазин на WordPress і ви змінюєте ціну товару в одній мовній версії, то вона автоматично змінюється в інших мовних версіях відповідного товару. Бажано відмітити всі поля.</li><li><strong>WPML compatibility.&nbsp;</strong>Можливість використовувати мовні пакети WPML. Варто вмикати.</li><li><strong>Tools</strong>. Містить лише одне поле, яке відповідає за видалення даних роботи Polylang після видалення плагіну. Варто залишити невідміченим.</li></ul>



<h3 class="wp-block-heading">4. ВИЗНАЧТЕ ОСНОВНУ МОВУ САЙТУ</h3>



<p>Після здійснення налаштувань варто скористатись пропозицією Polylang про призначення мови «за замовчуванням» для всіх існуючих на даний момент сторінок та таксономій. Повідомлення з цією пропозицією ви побачите у верхній частині екрану на сторінці Languages.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_03.jpg" alt=""/></figure>



<p>Після натискання кнопки підтвердження всі ваші існуючі сторінки, дописи та товари автоматично «зв’яжуться» з основною мовою сайту.</p>



<h3 class="wp-block-heading">5. ПЕРЕКЛАДІТЬ ТЕМУ І ПЛАГІНИ (за бажанням)</h3>



<p>Для цього нам знадобиться Loco Translate. Посилання на нього знаходиться на лівій панелі. Спочатку оберіть, що ви хочете перекласти в першу чергу – тему чи плагіни (див. скріншот нижче).</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_04.jpg" alt=""/></figure>



<p>Для прикладу, давайте оберемо Woocommerce із списку встановлених плагінів. Перейдемо на нього і побачимо список доступних мовних файлів, куди варто вносити переклад. У більшості випадків, ви знайдете тут всі мови, які вам потрібні. Але якщо певної мови, з якою ви хочете працювати, немає в переліку, то потрібно її створити, натиснувши на кнопку «Нова мова» (див. скріншот нижче).</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_05.jpg" alt=""/></figure>



<p>Для прикладу, додамо грецьку, яка була відсутня в переліку мов плагіну Woocommerce (див. нижче).</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_06.jpg" alt=""/></figure>



<p>Після того, як нову мову успішно додано, ви побачите її в загальному списку мовних файлів. Обираєте її та переходите на сторінку редагування, де здійснюєте переклад всіх необхідних рядків (див. скріншот нижче).</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_07.jpg" alt=""/></figure>



<p>Переклади у такий спосіб не обов’язково робити вручну. В інтернеті існує велика кількість уже готових перекладів для популярних плагінів чи тем, і ви, імовірно, без проблем їх зможете знайти і скачати. Далі завантажте файл перекладу у вигляді .mo чи .po файлів, скориставшись кнопками, як на скріншоті нижче.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_08.jpg" alt=""/></figure>



<h3 class="wp-block-heading">6. ПЕРЕКЛАДІТЬ КОНТЕНТ</h3>



<p>Після того, як ми переклали тему та плагіни, наступним кроком є переклад контенту. Для цього в адміністративній панелі сайту ми обираємо будь-яку сторінку, допис, категорію чи товар, який хочемо перекласти, і натискаємо кнопку додавання перекладу цього матеріалу на іншу мову. Вона має вигляд плюса. Якщо ж ви хочете не додати, а відредагувати раніше створений переклад для певної статті, тоді потрібно натискати кнопку, що має вигляд олівця.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_15.jpg" alt=""/></figure>



<p>І нарешті, якщо альтернативні мовні версії сторінки вже створені, але вони між собою не зв’язані (система сприймає їх як дві окремі сторінки, написані різними мовами), то варто об’єднати їх вручну. Для цього зайдіть на сторінку редагування матеріалу і у правій панелі у блоці Polylang почніть вносити назву сторінки альтернативної мовної версії у відповідне поле. Коли вона з’явиться у випадаючому списку під полем, то оберіть її, натиснувши лівою кнопкою миші.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_16.jpg" alt=""/></figure>



<p>Подібні поля мають всі типи записів і таксономій.</p>



<h3 class="wp-block-heading">7. НАЛАШТУЙТЕ НАВІГАЦІЮ</h3>



<p>Фінальним етапом перекладу сайту на WordPress є локалізація меню, щоб навігація відповідала мовній версії. Для цього перейдіть на сторінку «Зовнішній вигляд» (Appearance) і оберіть «Меню» (Menu).</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_17.jpg" alt=""/></figure>



<p>Потрібно створити нові меню для кожної мови і внести до них посилання на сторінки відповідної версії.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_18.jpg" alt=""/></figure>



<p>Також у меню потрібно додати перемикач мов.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_19.jpg" alt=""/></figure>



<p>Якщо перемикач мов не з&#8217;явився, перевырте наявність галочки в Зовнішній вигляд-Меню-Налаштування екрану (верхній правий кут екрану).</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="166" src="https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-18-1024x166.png" alt="" class="wp-image-1415" srcset="https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-18-1024x166.png 1024w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-18-300x49.png 300w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-18-768x125.png 768w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-18-1536x250.png 1536w, https://www.alex-shybko.com.ua/wp-content/uploads/2022/07/image-18.png 1612w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>В налаштуваннях нового меню потрібно вказати розташування (позицію) цього меню в шаблоні сайту.</p>



<figure class="wp-block-image"><img decoding="async" src="https://arto.agency/Img/articles/polylang_20.jpg" alt=""/></figure>



<p>Нарешті! Ми успішно налаштували багатомовність на вашому WordPress-сайті, що не тільки відповідає новому законодавству України, але й робить його більш зручним для користувачів.</p><p>The post <a href="https://www.alex-shybko.com.ua/2022/07/15/yak-dodaty-dekilka-mov-na-sajt-wordpress/">Як додати декілька мов на сайт WordPress</a> first appeared on <a href="https://www.alex-shybko.com.ua">Олексій Шибко</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.alex-shybko.com.ua/2022/07/15/yak-dodaty-dekilka-mov-na-sajt-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
