1. Избавляемся от лишних обращений к данным
Везде, где есть возможность заменить динамические данные на статические, их нужно заменить. Например, заменяем:
<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />
на
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
По аналогии желательно заменить всё: <?php language_attributes(); ?>, <?php bloginfo('rss2_url'); ?> и т.д. и т.п.
Там где вызываемая переменная встречается несколько раз, желательно вызывать ее один раз. Скорее это можно отнести к <?php bloginfo('template_url'); ?>. Для наглядности приведу код.
Такую запись:
...
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/scripts/prototype.lite.js"></script>
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/scripts/moo.fx.js"></script>
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/scripts/moo.fx.pack.js"></script>
...
Можно записать так:
...
$templateurl = get_bloginfo('template_url');
<script type="text/javascript" src="<?php echo $templateurl ?>/scripts/prototype.lite.js"></script>
<script type="text/javascript" src="<?php echo $templateurl ?>/scripts/moo.fx.js"></script>
<script type="text/javascript" src="<?php echo $templateurl ?>/scripts/moo.fx.pack.js"></script>
...
Поясню: мы заранее определяем путь до шаблона и помещаем его в переменную $templateurl, а затем везде, где нужно написать путь до шаблона пишем <?php echo $templateurl ?>. Если sidebar и footer вызывать через require или include (require ('sidebar.php');), вместо стандартной функции WP - get_header();, то один раз определив переменную $templateurl (где нибудь в header), её можно будет использовать и в файлах sidebar.php, footer.php.
2. Небольшая оптимизация в комментариях
1. Правим код, связанный с выводом даты:
<?php printf('%1$s at %2$s', get_comment_date(), get_comment_time()) ?>
Меняем его на:
<?php printf('%1$s в %2$s', get_comment_date('d.m.Y'), get_comment_time('H:i')); ?>
//Или можно записать так:<?php echo date( 'd.m.Y в H:i', strtotime($comment->comment_date) ); ?>
Таким изменением, мы заранее определяем формат даты, и функции get_comment_date() или get_comment_time() уже не запрашивают формат даты из настроек сайта. Информацию о форматах даты, чтобы далеко не ходить, можно посмотреть в настройках WP (настройки->общие).
Экономия: 2 обращения к данным с каждого комментария.
2. Заменяем ссылку на комментарий в дате комментария (дата комментария анкор ссылки), если она у вас есть конечно, обычно она присутствует. Вместо функции, которая получает адрес ссылки (get_comment_link()) пишем так: <a href='#comment-<?php echo $comment->comment_ID ?>'>Здесь дата</a>.
Экономия: минус еще по одному обращению к данным с каждого комментария.
Для наглядности выше написанного
// так выглядет кусок кода комментариев в WordPress (по дефолту):
<a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf(__('%1$s at %2$s'), get_comment_date(), get_comment_time()) ?></a>
// я предлагаю чтобы он выглядел так:
<a href="#comment-<?php echo $comment->comment_ID ?>"><?php echo date( 'd.m.Y в H:i', strtotime($comment->comment_date) ); ?></a>
Такое несложное изменение и если у статьи, например, 20 комментариев экономия составит 60 обращений к данным.
3. Оптимизируем wp_load_alloptions()
Убираем постоянные обращения к кешу при получении опций (настроек) сайта. Тут нужно будет залезть в файл движка (без этого никак): открываем файл движка wp-includes/functions.php находим там функцию wp_load_alloptions() (стр.448) и вставляем
global $alloptions; if (isset ($alloptions) && strpos($_SERVER['REQUIEST_URI'],'/wp-admin/') == false ) return $alloptions;
сразу после global $wpdb;
Должно получится так:
function wp_load_alloptions() {
global $wpdb;
global $alloptions; if (isset ($alloptions) && strpos($_SERVER['REQUIEST_URI'],'/wp-admin/') === false ) return $alloptions;
$alloptions = wp_cache_get( 'alloptions', 'options' );
Объясню, чего мы добьемся. WP один раз обращается к БД и получает почти всю таблицу wp_options (больше 350КБ), после того, как данные получены они кешируются и в дальнейшем постоянно берутся из кеша (около 80 запросов к кешу, если без плагинов). Так вот, чтобы постоянно не обращаться к кешу мы проверяем переменную $alloptions, если она существует, то все опции в ней уже есть, мы просто сразу же её возвращаем. После того, как я дополнил функцию wp_load_alloptions(), количество запросов к БД сократилось, аж на 80 (это при выключеном кешировании), при этом глюков в работе сайта я не заметил. Конечно, если кеш включен, данные будут извлекаться из кеша, но зачем их брать из кеша, если можно прям из буфера. К тому же я пользуюсь плагином файлового кеша, а это 80 раз считывается файл (нагрузка на сервер как ни как есть, т.е. была...
).
4. Убираем проверку на то, установлен ли блог
Раз уж мы в файле wp-includes/functions.php, то избавимся от еще одного обращения к кешу. Находим функцию function is_blog_installed(). У меня она начинается со строки 1739. В этой функции в самое её начало пишем return true; В итоге строчка function is_blog_installed() { должна выглядеть так: function is_blog_installed() { return true; .
Для тех, кто еще не понял зачем это нужно. Так, мы убираем постоянную проверку на то существует ли База Данных у блога, т.е. установлен ли он. Эта проверка осуществляется всегда и везде, хотя запрос и кешируется, думаю от еще одного ненужного обращения к кешу можно избавится. По идее этот пункт можно пропустить, потому что 1 обращение к кешу - капля в море, однако, как говорится, мелоч, но приятно
.
Есть вопросы? Пишите в комментариях, буду рад помочь.
Продолжение следует...
- Предыдущие по меткам
- Предыдущие записи
- Полезный хак для WordPress, если сайт дорабатывается на локалке ← 1.Апр.2010 // 11
- Полезный хак для WordPress, если сайт дорабатывается на локалке ← 1 Апрель 2010 // 11
- Альтернатива плагину WP-pagenavi (пагинация для WordPress) ← 29 Март 2010 // 73
- Код на страницах вашего сайта. Как я решил эту проблему ← 26 Март 2010 // 31
Спасибо, отличные советы. А как быть при обновлении WordPress? Получается все хаки потеряются ведь?
P.S. Недавно нашел Ваш блог. Спасибо, за Ваш труд.
Те пункты, которые относятся к редактированию движка, можно не соблюдать, потому что проблем с обновлением больше, чем толку от них. Это я сейчас уже понимаю, когда писал статью был немного другого мнения.
А разве вордпресс при обновлении не затирает измененные файлы просто? Если так, то по идеи и проблем быть не должно.
А к редактированию движка относится все то, что не относится к редактированию в папках тем и плагинов?
Затирает. Проблем не будет, только при этом все внесенные изменения потеряются.
Ага, фалы движка это php файлы в корне сайта, файлы в каталогах
wp-includesиwp-admin.Кама, день добрый
подскажи следующее
что лучше - загрузить все скрипты сразу на сайт или загружать скрипты именно на тех страницах где они исполняются
мог бы ты поделиться опытом как грамотно (единожды) подключать скрипты
например я знаю что jquery в headere подключается так
php wp_enqueue_script('jquery');
кстати потестил эту страринцу через хексбаг
обнаружил следующее:
http://wp-kama.ru/wp-content/plugins/kama-jquery-lightbox/js/jquery.lightbox.min.js.gzip
грузиться дважды
яндекс метрика -2 раза из трех подвисал (20s)
Один и тот же файл не может грузиться 2 раза, по крайней мере в норм браузерах это так. Этот файл просто вызывается 2 раза:
1. со страницы этого сайта;
2. вызывает сам себя.
Не понял, где и что подвисало?
П.С. Как бы то ни было, спасибо за указание на возможные проблемы.
Кама есть ли универсальный способ загруки скрипотов через произвольные поля и вообще так делают?
Через произвольные поля нелогично на мой взгляд. Такое можно применить только в том случае, если скрипт нужен только для одной страницы. Но даже если так, то лучше с произвольными полями не возиться а подключить скрипт прям в контенте.
Если нужно подключать для страниц по какому либо признаку, например, только для одиночных страниц (single) или только для главной страницы, то лучше использовать условные теги в
header.php, для отдельной страницы тоже можно использовать условные теги:if( is_single(125) ) //если страница с ID=125 echo '<script type="text/javascript" src="http://site.com/script.js" ></script>';