Мой сайт о WordPress и PHP
 
Rss2Email
7 апреля 2007

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

Читали 5732 раза
Рубрика: Плагины и хаки
Навигация: Главная » 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;
	}
}
?>

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

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

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

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

  1. sonika:

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

  2. жуковский:

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

  3. Алексей Новиков:

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

  4. Sergey Tugarinov:

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


Оставьте комментарий! (Вы согласны с правилами)

 

:mrgreen: :neutral: :twisted: :arrow: :shock: :smile: :???: :cool: :evil: :grin: :idea: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: :!: :?:

При добавлении кода (html, php) заменяйте < на &lt; и > на &gt;.
Внимание: антиспам - зверь! Копируйте своё сообщение перед отправкой. На всякий случай.