Оптимизация All in One SEO Pack
Избавляемся от лишних запросов к базе данных
Как оказалось, плагин All in One SEO Pack — один из основных источников запросов к базе данных на блогах с большим количеством страниц (page). Всё дело в том, что в All in One SEO Pack есть одна неотключаемая особенность: он пытается переписать все ссылки, которые выводятся через функцию wp_list_pages() (обычно эта функция вызывается из заголовка или подвала темы и используется для создания меню).
Вообще переписывание ссылок — это отдельная история, заслуживающая отдельной статьи. Если вкратце, то плагин берёт метаданные из поста и заменяет ими title и текст ссылки.
Что характерно, если поле Title Attribute пустое, то All in One SEO Pack вообще затрёт title ссылки.
Проблема с запросами возникает из-за того, что All in One SEO Pack читает метаданные для каждой страницы, присутствующей в результате, который вернула функция wp_list_pages(). Если в меню тридцать страниц, то в результате получим тридцать лишних запросов к базе данных. Умножаем на количество показов страниц (страниц в широком смысле, а не в терминах WordPress) и получаем большую цифру.
К счастью, у проблемы есть решение. Я даже о нём писал — ещё год назад — Секреты update_postmeta_cache(): Способ увеличения производительности при чтении метаданных записей.
В файле all-in-one-seo-pack/all-in-one-seo-pack.php нужно заменить несколько строчек.
- В районе 642 строки есть такой код:
[-]View Code PHP
- if($aioseop_options['aiosp_enabled']){
- add_action('wp_list_pages', 'aioseop_list_pages');
- }
Нужно вместо
add_actionпоставитьadd_filter:[-]View Code PHPА если функциональность с переписыванием- if($aioseop_options['aiosp_enabled']){
- add_filter('wp_list_pages', 'aioseop_list_pages');
- }
titleссылок вообще не нужна, то вместо замены слова проще закомментировать всю строку. - Затем нужно найти функцию
aioseop_list_pages():[-]View Code PHP- // The following two functions copied entirely and modified slightly from Sarah G's Page Menu Editor, http://wordpress.org/extend/plugins/page-menu-editor/
- function aioseop_list_pages($content){
- $url = preg_replace(array('/\//', '/\./', '/\-/'), array('\/', '\.', '\-'), get_option('siteurl'));
- $pattern = '/<li class="page_item page-item-(\d+)([^\"]*)"><a href=\"([^\"]+)" title="([^\"]+)">([^<]+)<\/a>/i';
- return preg_replace_callback($pattern, "aioseop_filter_callback", $content);
- }
и переписать её:
[-]View Code PHPfunction aioseop_list_pages($content){
$matches = array();
if (preg_match_all('/<li class="page_item page-item-(\d+)/i', $content, $matches)) {
update_postmeta_cache(array_values($matches[1]));
unset($matches);
$pattern = '/<li class="page_item page-item-(\d+)([^\"]*)"><a href=\"([^\"]+)" title="([^\"]+)">([^<]+)<\/a>/i';
return preg_replace_callback($pattern, "aioseop_filter_callback", $content);
}
return $content;
}
Это поможет избавиться от лишних запросов.
Патч в формате unified diff (внимание, формат концов строк может различаться):
+++ all_in_one_seo_pack.php 2009-12-17 06:00:32.000000000 +0200
@@ -632,7 +632,7 @@
}
if($aioseop_options['aiosp_enabled']){
- add_action('wp_list_pages', 'aioseop_list_pages');
+ add_filter('wp_list_pages', 'aioseop_list_pages');
remove_action( 'wp_head', 'rel_canonical' );
}
@@ -688,11 +688,17 @@
// The following two functions copied entirely and modified slightly from Sarah G's Page Menu Editor, http://wordpress.org/extend/plugins/page-menu-editor/
function aioseop_list_pages($content){
- $url = preg_replace(array('/\//', '/\./', '/\-/'), array('\/', '\.', '\-'), get_option('siteurl'));
+ $matches = array();
+ if (preg_match_all('/<li class="page_item page-item-(\d+)/i', $content, $matches)) {
+ update_postmeta_cache(array_values($matches[1]));
+ unset($matches);
$pattern = '/<li class="page_item page-item-(\d+)([^\"]*)"><a href=\"([^\"]+)" title="([^\"]+)">([^<]+)<\/a>/i';
return preg_replace_callback($pattern, "aioseop_filter_callback", $content);
}
+ return $content;
+ }
+
function aioseop_filter_callback($matches) {
global $wpdb;
if ($matches[1] && !empty($matches[1])) $postID = $matches[1];
UPDATE: обновил патч, теперь он подходит для All in One SEO Pack 1.6.8.2 и поместил патч на форум поддержки.
Связанные записи
Автор: Vladimir; опубликовано в: Патчи; метки: All in One SEO Pack, WordPress, патч, плагин, производительностьНоя
2009
Комментарии к статье «Оптимизация All in One SEO Pack» (7) »
Оставить комментарий к записи «Оптимизация All in One SEO Pack»
Вы должны быть авторизованы, чтобы иметь возможность оставить комментарий.


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.






Владимир, подскажите в версии 1.6.10, которая выложена на wordpress.org эти проблемы исправлены?
Нет. И еще добавлены мелкие проблемы (в админке). Все никак не соберусь снести его у себя.
посоветуйте пожалуйста версию плагина для ворда 2.8.х
В последней версии плагина пункты 1 и 2 можно применить?
В 1.6.10 — да.
Владимир, подскажите пожалуйста, в новой версии плагина код – add_action(‘wp_list_pages’, ‘aioseop_list_pages’); стоит в строке N 629 отдельно. В нём произвести изменения add_action на add_filter?
И ещё вопрос – коды патча в какое место установить?
Очень пригодились ваши советы. Сегодня полдня потратил прежде чем понял откуда так много запросов к базе. Спасибо.