воскресенье, 20 марта 2011 г.

Ускорение работы Wordpress


Многие сталкиваются с проблемой медленной работы сайтов на CMS WordPress, особенно когда используется стандартная сборка с n-ым десятком плагинов. Самая большая проблема в том, что чем больше потребляет серверных мощностей ваш сайт, тем скорее вас попросят перейти на более дорогой тарифный план. Я сам постоянно сталкивался с этой проблемой, когда делал сателлиты на WordPress, а СДЛ посещаемость которых переходила за 1000 посетителей в сутки даже на самых дорогих тарифных планах хостингов ужасно тормозили. Я пробовал кеширование, отказывался от плагинов, но это не давало нужного эффекта, со временем у меня накопился ряд методик как снизить нагрузку на хостинг и ускорить сайт, я решил их обьединить в виде одного поста и поделиться с вами. Хочется надеятся, что этот пост станет библией по ускорению WordPress и все будут знать где есть самое полное пошаговое руководство по ускорению WordPress.

Прежде чем заниматься ускорением WordPress нужно всё таки задуматься о своём хостинге, возможно незначительное повышение тарифа или переезд на другой хостинг решат ваши проблемы. Иногда с переездом нужно просто смириться, невозможно держать гигантский проект на самых дешёвых тарифных планах хостинга. От себя могу порекомендовать SpaceWeb.

Шаг 1: Подготовка

Первым делом необходимо обновить Wordpress до последней версии, которую вы можетескачать здесь.

Шаг 2: wp-config.php

Файл wp-config.php – является файлом конфигурации WordPress и находится в корневой папке сайта.
Я хочу вам рассказать про несколько методов с помощью которых мы сможем уменьшить нагрузку на хостинг:
  1. В оригинальной сборке есть минус – то, что используются различные языковые файлы для административной части и главной страницы сайта. Если мы будем использовать один файл, то это нам позволит значительно снизить нагрузку, для этого нужно заменить строку:
    1
    
    define ('WPLANG', 'ru_RU');
    на
    1
    
    if (strpos($_SERVER['REQUEST_URI'], 'wp-admin')) define ('WPLANG', 'ru_RU'); else define ('WPLANG', 'ru_RU_lite');
    Так же не забудьте добавить обьедененный файлов переводов ru_RU_lite в директорию http://вашсайт.ru/wp-content/languages/.
    Спасибо за способ Лекактусу.
  2. Так же рекомендую сразу выставить необходимое количество ревизий при написании поста.
    Ревизии – это черновики, которые автоматически сохраняются во время написания поста, тем самым позволяя ему вернуться на некоторое время назад при написании. Ревизий может быть несколько, а так же можно указать через какое время они должны обновляться. Я использую одну ревизию, которая перезаписывается каждые 60 секунд, на некоторых своих сайтах на WordPress я их вовсе отключаю, так как пользуюсь внешним редактором. Отключение ревизий даёт прирост в скорости работы редактора и админки Wordpress.
    Для того, чтобы была одна ревизия и она сохранялась каждые 60 секунд, нужно добавить следующую строчку в wp-config.php перед последним закрывающимся ?>:
    1
    2
    
    define( 'AUTOSAVE_INTERVAL', 60 );
    define('WP_POST_REVISIONS', 1);
    а если мы хотим отключить ревизии, то нужно воспользоваться плагином Disable Revisions.

Шаг 3: Robots.txt

Файл Robots.txt – это текстовый файл, находящийся в корневой директории сайта, в котором записываются специальные инструкции для поисковых роботов. Эти инструкции могут запрещать к индексации некоторые разделы или страницы на сайте, указывать на правильное «зеркалирование» домена, рекомендовать поисковому роботу соблюдать определенный временной интервал между скачиванием документов с сервера и т.д. ©Robotstxt.org.ru
Посещение поисковыми роботами вашего сайта приводит к значительной нагрузке на ваш сайт. Так как нас интересуют только поисковые роботы Яндекса, Google и Рамблера, в некоторых случаях ещё и Yahoo, то остальных роботов (в том числе различные парсеры и грабберы, которые воруют ваш контент), можно закрыть от индексации. Для этого необходимо вставить следующие строчки в файл Robots.txt, если у вас его нет, то необходимо его сначала создать в корневой директории сайта. Эффект наступит не моментально, но в течении месяца практически все роботы из списка сведут свои заходы к минимуму или вовсе перестанут посещать ваш сайт.
Если вы хотите так же заблокировать доступ для Yahoo, что помимо снижения нагрузки на хостинг скроет и ваши беки по версии Yahoo, то необходимо добавить ещё следующие строчки в Robots.txt:
1
2
User-agent: Slurp
Disallow: /

Шаг 4: .Htaccess

Файл .Htaccess – это файл дополнительной конфигурации веб-сервера. С его помощью мы сможем дать дополнительные команды для сервера, которые стоит обрабатывать до загрузки сайта.
  1. Сейчас очень распространено копирование информации, в основном это делается с помощью автоматических программных решений. Эти программы копируют не только тексты, но и изображения с ваших сайтов. Так как ссылки на изображения с сайтов скопировавших информацию ведут на изображения на вашем сайте, то следовательно они посылают постоянные запросы на ваш хостинг, тем самым его дополнительно нагружая. Это называется хотлинкингом. С этим бороться можно и я расскажу вам как.
    Я хочу вам предложить два метода борьбы, первый – это заменить изображения на сайтах, которые используют ваш сервер. Изображение которое будет отображаться на сайтах вместо вашего можно заменить например на рекламный баннер.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?undsoft\.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yandex\.net/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?feedburner\.com/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mail\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?poisk\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?yourdomain\.ru/.*$ [NC]
    RewriteCond %{HTTP_REFERER} !^$ [NC]
    RewriteRule .*\.(jpeg|jpg|gif|bmp|png)$ stophotlinking.gif [L]
    *В данном коде нужно заменить yourdomain на название вашего домена, то же самое касается и доменной зоны. Изображение которое будет показываться на чужих сайтах должно находиться в корневой директории вашего сайта и иметь название stophotlinking и формат gif.
    Данный метод совершенно никак не помешает поисковикам собирать с вашего сайта изображения, так как они занесены в коде в список разрешённых. Вы наверно заметили, что в списке нет Google. Этот метод не помешает Google собирать изображения с вашего сайта, так как он использует уже кешированные версии в результатах поиска.
    Это конечно незначительно снизит нагрузку на ваш хостинг, так как обращение к вашему сайту всё равно будет, но уже вместо всех изображений будет передаваться одно, указанное вами. Если вы хотите выдавать ошибку на других сайтах вместо ваших изображений, что позволяет нам свести нагрузку от этих внешних обращений к нулю, то нужно заменить строку в выше приведённом коде:
    1
    
    RewriteRule .*\.(jpe?g|gif|bmp|png)$ stophotlinking.gif [L]
    на
    1
    
    RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]
    Если выше приведённый пример не заработает, попробуйте альтернативный метод:
    RewriteEngine On
     #Replace ?mysite\.com/ with your blog url
     RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
     RewriteCond %{HTTP_REFERER} !^$
     #Replace /images/nohotlink.jpg with your "don't hotlink" image url
     RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
  2. С помощью .Htaccess мы можем сделать кеширование файлов jpg,gif,png,css,js и других в браузере пользователя на сутки с помощью ниже приведённого кода, если же в содержимом произойдут изменения, то кеш обновится:
    1
    2
    3
    4
    5
    6
    7
    
    FileETag MTime Size
    <ifmodule mod_expires.c>
    <filesmatch ".(jpg|gif|png|css|js)$">
    ExpiresActive on
    ExpiresDefault "access plus 1 year"
    filesmatch>
    ifmodule>
    *В браузере обязательно должно быть включено кеширование.
  3. Так же рекомендую делать автоматическое сжатие файлов в перед передачей пользвателю, чтобы сайт грузился быстрее, для этого нужно вставить следующий код в .htaccess:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <ifModule mod_gzip.c>
     mod_gzip_on Yes
     mod_gzip_dechunk Yes
     mod_gzip_item_include file \.(html?|txt|css|js|php)$
     mod_gzip_item_include handler ^cgi-script$
     mod_gzip_item_include mime ^text/.*
     mod_gzip_item_include mime ^application/x-javascript.*
     mod_gzip_item_exclude mime ^image/.*
     mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
    ifModule>
    *На одном сайте сайте не может работать gzip и zlib компрессия, поэтому выберите что-то одно.
  4. Практически каждый сайт на CMS WordPress сталкивается с проблемой спама в комментариях, чтобы отсечь весь автоматический спам ещё на подходе, можно фильтровать спаммеров по Referrer.
    Referer – это один заголовков запроса клиента, то есть если вы перейдёте с одной страницы на другую, то вторая страница сможет узнать по referer адрес первой страницы. Так как программы с помощью которых делается спам делают переход напрямую сразу на страницу комментирования, то мы их сможем отсечь. Это не значит что можно отказываться от плагинов для предотвращения спамма, но это поможет вам снизить количество спамма и нагрузку на ваш сайт. Для реализации необходимо вставить ниже приведённый код в .htaccess:
    1
    2
    3
    4
    5
    6
    
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} POST
    RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
    RewriteCond %{HTTP_REFERER} !.*yourdomain.ru.* [OR]
    RewriteCond %{HTTP_USER_AGENT} ^$
    RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]
    *Не забудьте заменить yourdomain .ru на адрес вашего сайта
  5. Многие используют плагин для переадресации стандартного RSS на Feedburner, хотя это можно сделать сделав небольшую вставку в .htaccess, тем самым мы уменьшаем нагрузку на сайт:
    1
    2
    3
    4
    
    RewriteEngine on
     RewriteCond %{HTTP_USER_AGENT} !FeedBurner    [NC]
     RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
     RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/puzat [R=302,NC,L]
    Если не заработает редирект, то попробуйте поместить данный код в самое начало файла .htaccess.
    *Не забудьте заменить “http://feeds2.feedburner.com/puzat” на адрес своего фидбёрнера.

Шаг 5: Пинги

Когда вы публикуете новый материал на сайте, то Wordpress отправляет пинги на множество сервисов, чтобы их известить об этом, мной был составлен большой список пинг сервисов, после тестов по их нагрузке на сервер и эффекту индексации было принято решение, что стоит оставить только необходимые пинги для поисковиков Яндекс и Google, а именно:
  • http://ping.blogs.yandex.ru/RPC2
  • http://blogsearch.google.com/ping/RPC2
  • http://blogsearch.google.ru/ping/RPC2
Этого вполне достаточно чтобы ваш пост был проиндексирован максимально быстро, в дополнение для ускорения индексации можно поставить ссылки в социальных закладках.

Шаг 6: Wordpress плагины

  1. Первым делом рекомендую вам пересмотреть список ваших плагинов и удалить те, которыми вы не пользуетесь.
  2. Так же постарайтесь максимально уменьшить количество используемых плагинов за счёт отключения необязательных и их удаления.
  3. Практически каждый плагин подгружает свои CSS и JS, их с помощью онлайн-сервисов: онлайн-сервис по сжатию CSSонлайн сервис по сжатию JS кода.
  4. Убедитесь что необходимые вам плагины загружаются только на необходимых вам страницах, часто встречается, что плагины подгружаются на всех страницах, это можно проверить посмотрев исходный код страницы и поискав название плагина или его сокращения. Для того, чтобы плагин обратывался только на необходимых вам страницах нужно будет написать условие внутри кода плагина.

Шаг 7: Оптимизация кода темы(шаблона) сайта

Для тех, кто не знает где находится ваш шаблон на сайте, вы можете зайти в исходный код страницы нажав на странице своего сайта правой кнопкой мыши и выбрав “Исходный код страницы”, там необходимо найти строку:
<<span class="nodeTag ">link</span><span class="nodeAttr editGroup "> <span class="nodeName editable ">media</span>="<span class="nodeValue editable ">screen</span>"</span><span class="nodeAttr editGroup "> <span class="nodeName editable ">type</span>="<span class="nodeValue editable ">text/css</span>"</span><span class="nodeAttr editGroup "> <span class="nodeName editable ">href</span>="<span class="nodeValue editable ">http://</span></span><span style="color: #000000;">yourdomain</span><span class="nodeAttr editGroup "><span class="nodeValue editable ">.ru/wp-content/themes/yourthemes/style.css</span>"</span><span class="nodeAttr editGroup "> <span class="nodeName editable ">rel</span>="<span class="nodeValue editable ">stylesheet</span>"</span><span class="nodeBracket editable insertBefore ">></span>
вместо “yourdomain .ru” будет название вашего сайта, а вместо “yourthemes” будет директория с вашей темой. После чего мы заходим в эту папку и можем видеть все файлы темы. Так же тему можно редакторировать и через админку WordPress для этого необходимо зайти в админку->Внешний вид->Редактор.
  1. Первым делом нужно удалить лишние обращения к базе данных, например в файле шапке (header.php) часто используется стандартная вставка:
    1
    2
    3
    4
    5
    
    &lt;html xmlns="http://www.w3.org/1999/xhtml" &lt;?php language_attributes(); ?&gt;&gt;
    &lt;head profile="http://gmpg.org/xfn/11"&gt;
    &lt;meta http-equiv="Content-Type" content="
    <?php bloginfo('html_type'); ?>;
    charset=<?php bloginfo('charset'); ?>" /&gt;
  2. Все эти обращения к базе данных через php запросы, можно заменить на:
    1
    2
    3
    
    <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
    <head profile="http://gmpg.org/xfn/11">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    *но нужно учитывать, что если у вас другая кодировка, то в charset=ВАШАКОДИРОВКА
    Тоже самое касается ссылки на стили:
    1
    
    <link rel="stylesheet" href="" type="text/css" media="screen" />
    заменить на:
    1
    
    <link media="screen" type="text/css" href="http://color: #000000;">yourdomain</span>.ru/wp-content/themes/yourthemes/style.css" rel="stylesheet">
    *Незабудьте заменить yourdomain.ru на ваш сайт, а так же поменяйте название темы.
    Код пингбеков:
    1
    
    <link rel="pingback" href="" />
    заменить на:
    1
    
    <link href="http://site.ru/xmlrpc.php" rel="pingback"/>
    *Незабудьте заменить site.ru на ваш сайт.
    Код фида:
    1
    
    <link rel="alternate" type="application/rss+xml" title=" RSS Feed" href="('rss2_url'); ?>" />
    заменить на:
    1
    
    <link href="http://site.ru/feed" title="ВАШ САЙТ RSS Feed" type="application/rss+xml" rel="alternate"/>
    *Незабудьте заменить site.ru на ваш сайт, а так же надпись “ВАШ САЙТ” на название вашего сайта.
  3. Так же можно удалить излишние мета-теги сайта из wp_head, вставив следующий код в файл функций (functions.php) вашей темы.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    remove_action( 'wp_head', 'feed_links_extra', 3 );
    remove_action( 'wp_head', 'feed_links', 2 );
    remove_action( 'wp_head', 'rsd_link' );
    remove_action( 'wp_head', 'wlwmanifest_link' );
    remove_action( 'wp_head', 'index_rel_link' );
    remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
    remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
    remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );
    remove_action( 'wp_head', 'wp_generator' );
    *более подробная информация, что мы удаляем.
  4. Перейдём к правке подвала (footer.php), в нём так же часто оставляют запросы к базам данных, например вида:
    1
    
     get_bloginfo('name') ?>
    Который можно заменить просто на статическое название сайта, например название моего блога: “Блог Пузата про заработок в интернете”.
  5. Обращения к базам данных в шаблонах встречаются не только в header.php и footer.php, но и в других файлах темы, но там уже нужно смотреть индивидуально, пробуйте менять, но не забывайте делать бекапы файлов.
  6. Уберите все комментарии из вашего шаблона, если они не требуются. За вывод комментариев в постах/страницах отвечает следующий код:
    1
    
     comments_template(); ?>
    Просто удалите его и из ваших постов/страниц исчезнет даже упоминание о комментариях.
  7. Так же почистите код от закомментированных вставок, если они вам не требуются. Я имею ввиду и /*код*/ .
  8. Старайтесь свести к минимуму, а лучше вообще отказаться от использования внешних скриптов, то же самое касается изображений и других файлов используемых с других сайтов, так как это может значительно замедлить работу сайта. Можно попробовать перенести код этого скрипта к себе на сайт или же попробовать сделать данную реализацию самому. Что же касается картинок и других файлов лучше их скопировать и сохранить у себя на сайте.
  9. Вы так же можете оптимизировать скрипты и стили с помощью ранее предложенных онлайн сервисов.
  10. Пропишите в header.php чтобы ваш сайт проходил дополнительную компрессию со стороны сервера, но перед этим проверьте поддерживает ли ваш сервер(хостинг) данную функцию, для этого нужно создать файл proverka.php в корневой директории сайта и вставить в него следующий код:
    1
    
     phpinfo(); ?>
    После чего открываем этот файл в браузере http://site.ru/proverka.php и ищем zlib, если стоит enabled, то есть включен, то мы можем добавлять код:
    1
    2
    3
    4
    
    
    ini_set('zlib.output_compression', 'On');
    ini_set('zlib.output_compression_level', '1');
    ?>
    Если ваш хостинг не поддерживает Zlib, то вы можете попросить суппорт хостинга включить его, сейчас практически каждый хостинг его включает изначально, нам же остаётся его лишь прописать в header.php прямо перед !DOCTYPE… , то есть в самом начале кода.
    *На одном сайте не может работать gzip и zlib компрессия, поэтому выберите что-то одно.
    Спасибо за метод WPbot
  11. Старайтесь размещать все ваши скрипты прямо перед , чтобы они грузились только после того, как весь основной код будет загружен, это в особенности касается скриптов, которые выполняются с внешних ресурсов.
  12. Если вы используете Jquery библиотеки, а тем более если вы их подгружаете с внешних сайтов, то рекомендую посмотреть наличие необходимой вам Jquery библиотеки в http://code.google.com/apis/ajaxlibs/, если вы нашли там то что вам нужно, то лучше использовать оттуда, так как с Google файлы грузятся моментально, получится паралельное закачивание файлов, то есть пока грузится ваш сайт, библиотеки загрузятся с Google, а так же если браузер скачал себе данную библиотеку, то он не будет её скачивать второй раз.
  13. Если вам позволяют знания, то можно отключить от плагинов обращения к их CSS и JS и вынести их в сам шаблон, тем самым вы уменьшите количество запросов, всё будет грузиться из одного места, что конечно же ускорит работу вашего сайта. Не забывайте про правило, что стили мы вставляем в header.php, а скрипты в footer.php перед .
  14. Сразу после вставьте
    1
    
     flush(); ?>
    который будет очищать буфер вывода и позволит нам загрузить CSS связанные с файлами в заголовке, без ожидания остальных файлов.

Шаг 8: Изображения

  1. Часто бывает, что на сайт добавляются изображения не сжатые, поэтому следите за тем, чтобы перед добавлением на сайт изображения сжимались и доводились до приемлемого соотношения размер/качество. Можно попробовать плагин – WP-Smushit, который при добавлении изображений на сайт будет их автоматически сжимать.
  2. Так же часто забывают в коде указывать высоту и размер для изображений, не забывайте про это.
  3. По возможности постарайтесь распаралеллить процесс загрузки сайта и загрузки картинок, за счёт вынесения их на сторонний сервер, например Amazon S3, это сделать не просто и несёт ряд неудобств для обычного пользователя, но если вы являетесь прошаренным и хотите получить максимальную отдачу от своего сайта в скорости, то можете разобраться с его настройками, ссылка на руководство на английском языке. Вот наглядный график Использование Amazon S3 для снижения нагрузки на сайт как получилось снизить нагрузку с помощью данного метода. Вы так же можете попробовать WP-offload с помощью этого плагина кешируются статические документы такие как картинки и др.
  4. Можно использовать десктопную программу с помощью которой сжимать необходимые изображения очень легко, их всего лишь надо перенести в окно программы –программа Shrink-O-Matic.

Шаг 9: Кеширование

  1. Необходимо установить плагин кеширования сайта, из тех которые я использовал на мой взгляд самые лучшие WP Super Cache(бесплатный) и скрипт Cache Maxsite(платный). Мне лично больше понравился Maxsite Cache, но если вы не готовы платить 30$ за плагин, то можно обойтись и WP Super Cache. Основной минус WP Super Cache в том, что он не кеширует виджеты, но с этой проблемой нам поможет справиться следующий плагин WP Widget Cache.
  2. Так же к выше перечисленным плагинам можно добавить плагин WP-CSS, который сжимает CSS в GZIP, а так же плагин Autotimize, который рекомендуют использовать вместе с WP Super Cache.

Шаг 10: База данных

  1. Помимо файлов сайта у нас есть база данных, которую тоже нужно время от времени чистить и оптимизировать, чтобы это сделать в ручную нам потребуется больше времени, чем установить плагин Optimize DB. Активируйте его только на время оптимизации базы данных, после чего деактивируйте, не оставляйте его постоянно включённым, чтобы он не создавал дополнительную нагрузку на сайт.
  2. Если вы не используете ревизии, то их таблицу можно удалить из базы данных, найдите таблицу с названием “wp_post_revision” и удалите.

Шаг 11: Мелочи

  1. Большие посты разбивайте на несколько страниц с помощью .
  2. Не нужно выводить полные посты на страницах, используйте excerpt.
  3. Не выводите на главной странице больше 5 постов.
  4. Не выводите больше 50 комментариев на одну страницу, включите навигацию по комментариям. Для этого нужно зайти в админку WordPress->Обсуждения->и поставьте галочку напротив “Разбивать комментарии на странице по 50 штук”.
  5. Более ранние версии Wordpress потребляют меньше ресурсов, но я же рекомендую использовать последнюю версию Wordpress для СДЛ и сателлитов, а для ГС можно использовать более ранние версии например Wordpress 2.3.3. Не забывайте про риск уязвимостей и недоработок, так как это всё таки старые версии.
  6. Для того чтобы замерить количество запросов к базам данных wordpress нужно добавить в код следующую строчку:
    1
    
     echo get_num_queries(); ?> запросов за  timer_stop(1); ?> секунд.
  7. Не поленитесь, сделайте код валидным, онлайн сервис проверки кода на валидность с рекомендациями по исправлению.
  8. Реализуйте поиск по сайту с помощью стороннего сервиса, например Google, так же вы на этом сможете заработать, зарегистрируйтесь для этого в Google и перейдите в систему Google Adsense.
  9. Используйте сторонние сервисы для хранения видео и просто вставляйте их код в пост, например Youtube. Это всё в тему параллельности процессов загрузки страницы.

Шаг 12: Сервер

В подробности серверной настройки я не вдавался, но если кому потребуется, то на мой взгляд, один из лучших материалов настройка сервера Апач на максимальную производительность. Владельцам своих серверов рекомендую воспользоваться eAcceleratorи PHP-Speedy, про его работу с WP Super Cache можно почитать здесь, все материалы на английском языке.

Оставь комментарий к этой статье и попади в топ комментаторов



http://puzat.ru/blogovodstvo/uskorenie-raboty-wordpress.html

Комментариев нет:

Отправить комментарий