MaxSite CMS - бесплатный «движок» вашего сайта! Легкая, мощная и надежная CMS - система управления сайтом. Никаких тормозов!

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

7 апреля 2007 г. Просмотров: 7541 RSS 5
WordPress » Статьи о WordPress

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

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

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

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

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

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

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

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

<?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]

<?php
############################################################
#  Получаем список постоянных страниц
#  только их название, ссылку и порядок
#  аргументы стандартные
#  sort_column - post_title, menu_order, comment_count
#  sort_order - ASC / DESC
#  exclude - исключить номера страниц
#  tag_start - тэг в начале каждого элемента
#  tag_end - тэг в конце каждого элемента
#  echo - true -выводить на экран, false - возвращает текст
############################################################
function maxsite_get_page($args = '') {
    global $wpdb;
    parse_str($args, $r);
    if ( !isset($r['sort_column']) ) $r['sort_column'] = 'menu_order';
    if ( !isset($r['sort_order']) )     $r['sort_order'] = 'ASC';
    if ( !isset($r['tag_start']) )   $r['tag_start'] = '';
    if ( !isset($r['tag_end']) )     $r['tag_end'] = '<br />';
    if ( !isset($r['echo']) )        $r['echo'] = true;
     $exclusions = '';
    if ( !empty($r['exclude']) ) {
        $expages = preg_split('/[s,]+/', $r['exclude']);
        if ( count($expages) ) {
            foreach ( $expages as $expage ) {
                $exclusions .= ' AND ID <> ' . intval($expage) . ' ';
            }
        }
    }
    $out = '';
    $request = "SELECT ID, post_title, post_type, post_status
                FROM $wpdb->posts
                WHERE post_status='publish' AND post_type='page' $exclusions
                ORDER BY " .
                $r['sort_column'] . " " . $r['sort_order'];
    $res = $wpdb->get_results($request);
    if($res){
        foreach ($res as $post) {
            $post_title = stripslashes($post->post_title);
            $link = get_permalink($post->ID);
            $out .=     $r['tag_start'] . '<a href="' . $link .'" title="' . $post_title . '">' .
                    $post_title . '</a>' . $r['tag_end'];
        }
    if ($r['echo']) echo $out;
        else return $out;
    }
}
?>

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

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


twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru friendfeed.com google.com yandex.ru
Комментариев: 5
  1. Хорошая штука! Жаль, что без иерархии :(

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

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

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

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

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

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

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

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

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

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

Используйте нормальные имена

Имя и сайт используются только при регистрации

Зарегистрируйтесь, чтобы получать уведомления о новых комментариях по email.

Авторизация Войти через loginza

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