“Ускоряем” WordPress за счет постоянных страниц

Рубрика: WordPress -> Статьи
Суббота, 7 апреля 2007 г.
Просмотров: 3331
Подписаться на комментарии по RSS
]]>
]]>

Несколько раньше я писал, что в WordPress'е несколько неудачно реализован вызов постоянных страниц. Проблема кроется в том, что функция получения записей, формирует SQL-запрос, который возвращает для постоянных страниц все поля, начиная от ID и заканчивая текстом.

Особенность постоянных страниц в том, что они не имеют рубрик и не могут отображаться в виде ленты, как это принято для обычных записей. Поэтому постоянные страницы могут серьезно сказываться на производительности WordPress, ведь при каждой загрузке сайта автоматически будут вызываться все постоянные страницы со всеми своими данными.

Это совсем не оптимально, поскольку получение таких данных просто не нужно. Например в сайдбаре есть смысл вывести лишь заголовки страниц в виде ссылок и ничего более.

Анализ показал, что во всем «виновата» функция wp_list_pages. Именно она формирует список постоянных страниц. Можно, конечно переделать запрос в этой функции (точнее в get_pages), но из-за того, что версии WordPress постоянно меняются, то поддерживать этот хак не совсем удобно. Поэтому есть другое решение: использовать свою «легкую» функцию для вывода списка постоянных страниц.

1. Файл дополнительных функций

В каталоге своего шаблона создаем файл maxsite-function.php (имя вы можеет использовать своё).

2. Подключаем файл функций

В index.php (в начале) подключаем этот файл:

  1.  <?php require_once('maxsite-function.php') ?>

Если вы используете разные файлы для вывода, то необходимо прописать этот код и в них (single.php, page.php, home.php)

3. Заменяем wp_list_pages

Находим вызов wp_list_pages в файла своего шаблона. Обычно это в sidebar.php. Заменяем на maxsite_get_page.

4. добавляем функцию maxsite_get_page

Открываем файл maxsite-function.php и в него добавляем:

[upd. 9 июля 2007 г. - переделал под WordPress 2.2]

  1.  <?php
  2.  ############################################################
  3.  # Получаем список постоянных страниц
  4.  # только их название, ссылку и порядок
  5.  # аргументы стандартные
  6.  # sort_column - post_title, menu_order, comment_count
  7.  # sort_order - ASC / DESC
  8.  # exclude - исключить номера страниц
  9.  # tag_start - тэг в начале каждого элемента
  10.  # tag_end - тэг в конце каждого элемента
  11.  # echo - true -выводить на экран, false - возвращает текст
  12.  ############################################################
  13.  function maxsite_get_page($args = '') {
  14.   global $wpdb;
  15.   parse_str($args, $r);
  16.   if ( !isset($r['sort_column']) ) $r['sort_column'] = 'menu_order';
  17.   if ( !isset($r['sort_order']) ) $r['sort_order'] = 'ASC';
  18.   if ( !isset($r['tag_start']) ) $r['tag_start'] = '';
  19.   if ( !isset($r['tag_end']) ) $r['tag_end'] = '<br />';
  20.   if ( !isset($r['echo']) ) $r['echo'] = true;
  21.   $exclusions = '';
  22.   if ( !empty($r['exclude']) ) {
  23.   $expages = preg_split('/[s,]+/', $r['exclude']);
  24.   if ( count($expages) ) {
  25.   foreach ( $expages as $expage ) {
  26.   $exclusions .= ' AND ID <> ' . intval($expage) . ' ';
  27.   }
  28.   }
  29.   }
  30.   $out = '';
  31.   $request = "SELECT ID, post_title, post_type, post_status
  32.   FROM $wpdb->posts
  33.   WHERE post_status='publish' AND post_type='page' $exclusions
  34.   ORDER BY " .
  35.   $r['sort_column'] . " " . $r['sort_order'];
  36.   $res = $wpdb->get_results($request);
  37.   if($res){
  38.   foreach ($res as $post) {
  39.   $post_title = stripslashes($post->post_title);
  40.   $link = get_permalink($post->ID);
  41.   $out .= $r['tag_start'] . '<a href="' . $link .'" title="' . $post_title . '">' .
  42.   $post_title . '</a>' . $r['tag_end'];
  43.   }
  44.   if ($r['echo']) echo $out;
  45.   else return $out;
  46.   }
  47.  }
  48.  ?>

Все сохраняем и загружаем на сервер.

Единственный минус этого подхода: если вы используете иерархию страниц, то она не выводится - в этой функции я решил её полностью убрать, чтобы не использовать рекурсию.

]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>
РЕКЛАМАнадежные холодильники Самые низкие цены на цифровые фотоаппараты в Украине здесь. жк телевизоры 29

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

Вы можете получать новые комментарии к этой записи по RSS или оформить подписку на все комментарии сайта. Или даже на все новые записи сайта. Не знаете, как это сделать?
  1. 2007-04-09 в 22:50:01 | sonika

    Хорошая штука! Жаль, что без иерархии :(

  2. 2007-06-18 в 16:06:44 | жуковский

    Мда, в двойне обидно.:neutral:

  3. 2007-07-12 в 01:58:22 | Алексей Новиков

    У меня постоянных страниц несколько штук. Для них я просто вручную прописал в шапке ссылки. Очень доволен grin Вряд ли можно снизить нагрузку сильнее.

  4. 2007-11-22 в 00:15:18 | Sergey Tugarinov

    Поставил на свой блог, разницы не PGT не заметил, помоему осталось темже, единственно что кол-во запросов к БД увеличилось.

  5. 2008-11-26 в 19:31:21 | MasterLoMaster

    ... а можно еще после публикации страницы открыть ее в браузере, сохранить на диск как хтмл, закачать обратно на сервер в какую-нибудь папку, и прописать в меню путь к этому хтмл файлику. Тогда будет по настоящему "постоянный хтмл" без каких либо запросов к базе данных mad

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

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

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



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)