Оптимизация Wordpress
Поговорим об оптимизации WordPress. Писано про это уже столько, что можно начать оптимизацию с базы, а закончить вебсервером. И поговорим потому, что несколько блогов, за последнее время, обратились за помощью. И не в том, что CMS последних версий стала плохо, а из-за того, что ряд есть сторонних причин, которые мешают системе или затормаживают ее.
Причина такой заторможенности как правило либо в плагинах, либо в теме, что встречается уже очень часто. Однажды была запись у меня о том, как можно оптимизировать тему Wordpress, чтобы она заработала быстрее. Но это мелочи, которые лучше оставить на потом, на сладкое.
- Оптимизация начинается с базы данных. Нужно оптимизировать таблицы. Заходим в phpMyAdmin, выбираем нашу БД и далее:

Это поможет серверу БД более быстро работать с таблицами, что немного снизит нагрузку. В более ранних версиях phpMyAdmin может не быть пункта “Отметить требующие оптимизации”. Тогда просто выбираете все таблицы и делаете с отмеченными “Оптимизировать”.
- Избавляемся от всех не нужных плагинов и особенно от тех, которые не совместимы с данной версией CMS. Очень часто такие плагины не совсем корректно работают.
- Удаляем из темы 3 абсолютно не нужные вещи: версию движка и, если не планируете использовать Windows Live Writer, то и манифест. Добавляем 3 строчки кода в файл functions.php:
<?php remove_action(’wp_head’, ‘wp_generator’); ?>
<?php remove_action(’wp_head’, ‘wlwmanifest_link’); ?>
<?php remove_action(’wp_head’, ‘rsd_link’); ?>
- Отключаем ревизии записей без плагина. Добавляем в файл wp-config.php следующую строку:
define('WP_POST_REVISIONS', false);
Для удаления существующих ревизий (если не умеете – лучше не лазить):
DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = ‘revision’
- Установите плагин WP Super Cache (или включите его, если он есть в вашей сборке правильного русского Wordpress)
- В wp-config.php вместо define (’WPLANG’, ‘ru_RU’); пропишите:
if (strpos($_SERVER['REQUEST_URI'], ‘wp-admin’))
define (’WPLANG’, ‘ru_RU’);
else
define (’WPLANG’, ‘ru_RU_lite’);
Об этом сказано в файле “ПРОЧИТАТЬ ОБЯЗАТЕЛЬНО ПЕРЕД УСТАНОВКОЙ.html” в дистрибутиве правильного русского Wordpress.
- Тема. Проверьте ее на предмет использования плагинов типа Popular Posts, Similar Posts. От всего этого можно избавиться и написать свой код для обработки информации.
Например, добавив в файл темы sidebar.php следующий код, Вы избавитесь от плагина популярных записей:
<li><h3>Популярные записи</h3> <ul> <?php $popular_posts = $wpdb->get_results("SELECT id,post_title FROM {$wpdb->prefix}posts ORDER BY comment_count DESC LIMIT 0,10"); foreach($popular_posts as $post) { print "<li><a href='". get_permalink($post->id) ."'>".$post->post_title."</a></li>\n"; }?> </ul> </li>
А для вывода похожих записей в single.php можно добавить:
<?php $tags = wp_get_post_tags($post->ID); if ($tags) { $tag_ids = array(); foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id; $args=array( 'tag__in' => $tag_ids, 'post__not_in' => array($post->ID), 'showposts'=>5, // Количество записей для вывода. 'caller_get_posts'=>1 ); $my_query = new wp_query($args); if( $my_query->have_posts() ) { echo '<h3>Похожие публикации</h3><ul>'; while ($my_query->have_posts()) { $my_query->the_post(); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark" title="Постоянная ссылка на <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php } echo '</ul>'; } } ?>
Может знаете еще какие-либо методы? Пишите, попробуем.

Миколка, вот еще статья на эту же тематику – http://www.getincss.ru/2009/07/23/nyuansy-razrabotki-sajta-na-wordpress/
Спасибо! Хорошие советы, надо их включить в пакет оптимизационных советов =)
Подскажи плиз как изменить запрос, чтобы в виджете “Популярные записи” были только посты блога, без страниц?
и даже черновики
А то выдает все подряд такой запрос
Убить мерзопакостный PageNavi. Вместо него есть красивое и главное быстрое решение без обращения к базе данных вообще.
Тут код решения можно разместить?
ioni » конечно!
Михаил, а виджет от плагина или какой?
Ничего сложного.
Код, что ниже, вставляется в functions.php, а в тему – функция вывода
Если надо, я могу быстро сделать плагин под это дело…
function ioni_paginate ($class="") {
global $wp_query;
$max_page = $wp_query->max_num_pages;
$nump=10;
if($max_page!=1){
$paged = intval(get_query_var('paged'));
if(empty($paged) || $paged == 0) $paged = 1;
echo '';
if($paged-$nump>1) $start=$paged-$nump; else $start=2;
if($paged+$nump<$max_page) $end=$paged+$nump; else $end=$max_page-1;
if($paged==1) echo '';
else echo '← '.__('to the future','ioni2').'';
if($paged!=1 && $paged!=$max_page)echo ' | ';
if($paged==$max_page) echo '';
else echo ''.__('to the past','ioni2').' →';
if($paged!=1) echo ''.__('First','ioni2').' ';
else echo ''.__('First','ioni2').' ';
if($start>2) echo "... ";
for ($i=$start;$i<=$end;$i++)
{
if($paged!=$i) echo ''.$i.' ';
else echo ''.$i.' ';
}
if($end<$max_page-1) echo "... ";
if($paged!=$max_page) echo ''.__('Last','ioni2').'';
else echo ''.__('Last','ioni2').' ';
echo '' ;
} else {
echo '';
}
} // ioni_paginate
В нужном месте темы просто вставить
Функция имеет параметр $class, который присваивается итоговому блогу navigation
Внутри есть стиль .current, который определяет текущую страницу.
Кроме того, даже если блок пустой, я все равно решил его выводить – вдруг кому тема поломается – если его не будет?
Короче, делать плагин?
Виноват…немного неправильно выразился, не в виджете, а в сайдбаре
Вот вставил данный код:
Популярные записи
get_results(”SELECT id,post_title
FROM {$wpdb->prefix}posts ORDER BY comment_count DESC LIMIT 0,10″);
foreach($popular_posts as $post) {
print “id) .”‘>”.$post->post_title.”\n”;
}?>
У меня выводятся и страницы и посты вперемешку. И страницы выводятся, у которых статус черновик… Естественно при заходе на такую страницу выдает 404. В общем мне кажется надо как то данный запрос модернизировать, чтобы выводились только посты блога, у которых статус “Опубликован”.
—
ioni, кстати видел где то уже описание подобной реализации… может и у тебя в блоге
Мне вообще не кажется, что дополнительное обращение к базе данных – это оптимизация…
Можно код оформить, например SyntaxHighlighter
ну кто что скажет по поводу вывода в сайдбаре популярных записей? ведь представленный в примере код некорректно работает
Михаил » добавьте
WHERE post_type=’post’ and post_status=’publish’
перед ORDER BY …
Готовая версия плагина пагинации есть.
Ее пока в репозиторий не взяли – но если кому-то ну очень надо…
http://ioni2.com/2009/ioni_pagination/
Спасибо, это как раз то, что я искал. Единственное, что ещё хотелось бы увидеть – код для вывода последних записей из Твитера.
vmaslov – это же просто RSS.
Вставляешь виджет, даешь ему адрес RSS потока нужного твита – и voila!
Я оптимизирую wordpress слежующим образом
Основная внутренняя оптимизация:
Урлы страниц (permalinks)
Оптимизация тайтла под СЕ
Оптимизация дескрипшена
Оптимизация текста в теге more
Оптимизация картинок и изображений в блоге
Оптимизация шаблона (темплейта):
Панировка
Рубрики (категории)
Чистка кода
Усовершенствование скорости
Реорганизация сайдбара
А по какому принципу работает приведенный код в посте для вывода “похожих записей” – он выдает другой результат нежели simple tag.
В статье написано “Удаляем из темы 3 абсолютно не нужные вещи: версию движка и, если не планируете использовать Windows Live Writer, то и манифест. Добавляем 3 строчки кода в файл functions.php”.
Но при вставке этих вещей в functions.php выходит ошибка.
Вордпресс 2.9.1
а какая ошибка?
Спасибо, очень пригодилось. Чуток код почистили
2 ioni А чем тебе не понравился пейдж нави?
Включеный
Выключеный
В чем + твоего кода?
И Где видно дополнительный запрос в базу? как было так 16 и осталось. Плагиноненависники недоделанные!