“Ускоряем” WordPress за счет постоянных страниц
Суббота, 7 апреля 2007 г.
Просмотров: 3323
Подписаться на комментарии по RSS
Несколько раньше я писал, что в 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;
- }
- }
- ?>
Все сохраняем и загружаем на сервер.
Единственный минус этого подхода: если вы используете иерархию страниц, то она не выводится - в этой функции я решил её полностью убрать, чтобы не использовать рекурсию.



Комментариев: 5
Хорошая штука! Жаль, что без иерархии :(
Мда, в двойне обидно.:neutral:
У меня постоянных страниц несколько штук. Для них я просто вручную прописал в шапке ссылки. Очень доволен
Вряд ли можно снизить нагрузку сильнее.
Поставил на свой блог, разницы не PGT не заметил, помоему осталось темже, единственно что кол-во запросов к БД увеличилось.
... а можно еще после публикации страницы открыть ее в браузере, сохранить на диск как хтмл, закачать обратно на сервер в какую-нибудь папку, и прописать в меню путь к этому хтмл файлику. Тогда будет по настоящему "постоянный хтмл" без каких либо запросов к базе данных