Оптимизация All in One SEO Pack

Избавляемся от лишних запросов к базе данных

Как оказалось,  — один из основных источников запросов к базе данных на блогах с большим количеством страниц (page). Всё дело в том, что в есть одна неотключаемая особенность: он пытается переписать все ссылки, которые выводятся через функцию wp_list_pages() (обычно эта функция вызывается из заголовка или подвала темы и используется для создания меню).

Вообще переписывание ссылок — это отдельная история, заслуживающая отдельной статьи. Если вкратце, то берёт метаданные из поста и заменяет ими title и текст ссылки.

All in One SEO Pack: Edit Page

Что характерно, если поле Title Attribute пустое, то вообще затрёт title ссылки.

Проблема с запросами возникает из-за того, что читает метаданные для каждой страницы, присутствующей в результате, который вернула функция wp_list_pages(). Если в меню тридцать страниц, то в результате получим тридцать лишних запросов к базе данных. Умножаем на количество показов страниц (страниц в широком смысле, а не в терминах ) и получаем большую цифру.

К счастью, у проблемы есть решение. Я даже о нём писал — ещё год назад — Секреты update_postmeta_cache(): Способ увеличения производительности при чтении метаданных записей.

В файле all-in-one-seo-pack/all-in-one-seo-pack.php нужно заменить несколько строчек.

  1. В районе 642 строки есть такой код:
    [-]
    View Code PHP
    1. if($aioseop_options['aiosp_enabled']){
    2.     add_action('wp_list_pages', 'aioseop_list_pages');
    3.  
    4. }

    Нужно вместо add_action поставить add_filter:

    [-]
    View Code PHP
    1. if($aioseop_options['aiosp_enabled']){
    2.     add_filter('wp_list_pages', 'aioseop_list_pages');
    3.  
    4. }
    А если функциональность с переписыванием title ссылок вообще не нужна, то вместо замены слова проще закомментировать всю строку.
  2. Затем нужно найти функцию aioseop_list_pages():
    [-]
    View Code PHP
    1. // The following two functions copied entirely and modified slightly from Sarah G's Page Menu Editor, http://wordpress.org/extend/plugins/page-menu-editor/
    2. function aioseop_list_pages($content){
    3.         $url = preg_replace(array('/\//', '/\./', '/\-/'), array('\/', '\.', '\-'), get_option('siteurl'));
    4.         $pattern = '/<li class="page_item page-item-(\d+)([^\"]*)"><a href=\"([^\"]+)" title="([^\"]+)">([^<]+)<\/a>/i';
    5.         return preg_replace_callback($pattern, "aioseop_filter_callback", $content);
    6.     }

    и переписать её:

    [-]
    View Code PHP
    function 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.orig.php    2009-12-16 09:37:23.000000000 +0200
+++ 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: обновил , теперь он подходит для  1.6.8.2 и поместил на форум поддержки.

Добавить в закладки

Связанные записи

Автор: Vladimir; опубликовано в: Патчи; метки: All in One SEO Pack, WordPress, патч, плагин, производительность
25
Ноя
2009

RSS Комментарии к статье «Оптимизация All in One SEO Pack» (6)  »

  1. mamuka

    Владимир, подскажите в версии 1.6.10, которая выложена на wordpress.org эти проблемы исправлены?

  2. mamuka

    посоветуйте пожалуйста версию плагина для ворда 2.8.х

  3. mamuka

    В последней версии плагина пункты 1 и 2 можно применить?

  4. Владимир, подскажите пожалуйста, в новой версии плагина код – add_action(‘wp_list_pages’, ‘aioseop_list_pages’); стоит в строке N 629 отдельно. В нём произвести изменения add_action на add_filter?
    И ещё вопрос – коды патча в какое место установить?

Оставить комментарий к записи «Оптимизация All in One SEO Pack»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Изображения должны быть включены!

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя