Выпуск 15. Карта сайта
Сегодня мы поговорим о том, как создать карту сайта, но в начале немного новостей
Исправление бага с кэшем WordPress
Оказалось, что в WordPress версий старше 2.0.1 вкралась довольно неприятная ошибка, которая полностью отключала кэш. Кэш нужен для того, чтобы снять нагрузку на сервер. То есть, когда происходит выборка из базы, то эти данные заносятся в кэш. При следующем обращении эти данные просто берутся в уже готовом виде и обращения к базе данных не происходит. Кэш имеет ограничение по времени. По-умолчанию установлено, что он действителен в течение 900 секунд (15 минут).
Кэш полезен в случаях, если у вас большая посещяемость сайта. Однако, если посещаемость небольшая, то кэш может даже несколько притормаживать работу сайта, поскольку для каждого нового посетителя будет генерироваться новый кэш, а это дополнительные операции с файлами.
В общем не зависимо ни от чего, настоятельно рекомендуется исправить этот баг. Для этого нужно всего-лишь заменить один файл. Описание бага и исправление можно взять по адресу: http://maxsite.org/bag-s-keshem. Следует отметить, что этот баг присутствует во всех версиях WordPress, включая и оригинальную английскую. Ошибку нашел Сергей Волков.
Сервис блогов
Теперь небольшой анонс. Скоро появится новый сервис блогов, где можно будет заказать свой блог на базе WordPress. Рассчитан он на тех, кто не может или не желает заниматься техническими вопросами, начиная от установки и настройки WordPress и заканчивая хостингом и регистрацией доменного имени. То есть все заботы о техническом обеспечении вашего блога возьмет на себя этот сервис.
В комплекте идут множество предустановленных плагинов и шаблонов. Кроме этого вы сможете выбрать любой другой шаблон и выслать его администратору - он его подключит и руссифицирует, а также добавит нужные плагины. В базовой поставке идут такие блоки:
- вывод случайных цитат
- последние комментарии
- защита от спама в комментариях
- поддержка BBCode (как на форумах)
- отображение рубрик как «облако» ключевых слов (тагов)
- голосования
- подсчет количества скачиваний файла
- статистика чтений RSS
- поддержка ключевых слов (тагов) для любой записи
- поиск по ключевым словам
- карта сайта
- добавление любого html-кода в блог (например счетчики или реклама)
- многоязыковая поддержка
- подписка e-mail на комментарии
- кликабельные смайлы в комментариях
- вставка из Ворда простого текста без форматирования
- дополнительное оформление админ-панели
- создание сносок в тексте
Большинство из этих плагинов немного доработаны и отличаются от оригинальных.
Бесплатно предоставляется имя третьего уровня, в двух (скоро будет три или четыре) доменах .com и .ru. Если у вас уже есть имя, то можно использовать и его.
Сервис блогов также будет уделять внимание продвижению блогов своих клиентов. Для этого будет использоваться новостная лента на главном блоге, а также реклама в рассылках. Ну и кроме этого, у сервиса есть выкупленные рекламные площади на других высокопосещаемых сайтах.
Тарифные планы рассчитаны с учетом подготовленности клиента. Для продвинутых пользователей существуют дополнительные тарифы, благодаря которым можно будет получить доступ к серверу и CPanel - управление доменом и хостингом.
Базовый тариф будет стоить:
- при оплате на 6 месяцев - 36$
- при оплате на 12 месяцев - 60$
Поскольку сервис сейчас работет в тестовом режиме, то пока никаких ссылок я приводить не буду. Но, если эта информация кого-нибудь заинтересовала, то вы можете уже сейчас отправить заявку по адресу: max-3000[at]list.ru. Думаю, что уже на этой неделе мы официально откроемся.
Карта сайта
Тема создания карты сайта "всплывает" на форумах постоянно. В WordPress'е есть возможность использования функций вывода архива по заданому параметру: день, месяц год, но вывод этих данных происходит как обычная новостная лента. Карта сайта подразумевает, что вы получите структуру записей с группировкой по рубрикам и постоянным страницам.
Думаю, что вы без проблем найдете нужные плагины, чтобы создать такую карту сайта. Но практически у всех есть один существенный недостаток - они довольно серьезно нагружают сервер, поскольку для создания такой структуры, требуется десятки-сотни обращений к MySQL. При небольшой посещаемости это не составляет большой проблемы, но для других необходимо как-то её решать.
Поскольку в какой-то мера наша рассылка носит учебный характер, то я покажу на примере существующего плагина, как можно его изменить, чтобы получить нужный результат.
Постановка задачи
Вначале определимся, что же мы хотим получить. Для того, чтобы снять нагрузку на сервер вполне логично использовать уже готовый результат, где будет и хранится вся карта сайта (что-то аналогичное кэшу). То есть для генерации карты мы будем использовать существующий плагин, но вывод будет осуществлен не в браузер, а в файл. Для сохранения результата в файл нам придется написать дополнительную функцию.
Здесь же нам нужно решить как именно и кто будет генерировать этот файл, то есть при каких условиях будут задействованы функции плагина.
После этого мы должны создать в каталоге шаблона дополнительный файл, который будет выводить данные файла карты сайта.
Естественно, нам нужно каким-то образом подключить файл шаблона к основному index.php.
Создание файла результата (sitemap.html)
Поскольку результат плагина это HTML-код, то условимся, что карта сайта будет храниться в главном каталоге WordPress в файле sitemap.html.
Сам плагин карты сайта называется Dagon Design Sitemap Generator и вы можете скачать его по ссылке: http://www.dagondesign.com/.
Для генерации карты сайта в плагине используется функция ddsg_create_sitemap(). Она возвращает полностью готовый html-код, который потом нужно вывести, например с помощью echo. Но нам нужно, чтобы результат "попал" в файл sitemap.html, для этого мы напишем свою функцию где-нибудь в конце самого плагина.
function ddsg_create_sitemap_file() {
$out = ddsg_create_sitemap();
$fp = fopen(ABSPATH . 'sitemap.html', "w");
fwrite($fp, $out);
fclose($fp);
}
Давайте разберем этот код.
В переменную $out помещается результат функции ddsg_create_sitemap. После этого мы должны открыть файл с именем sitemap.html в каталоге ABSPATH (константа, в которой хранится абсолютный путь к главному каталогу вашего блога). Файл открывается для перезаписи - параметр w. То есть файл будет открыт, но при этом всё, что было в нем раньше, будет уничтожено.
Здесь один нюанс - на многих хостингах в целях безопасности, может стоять ограничение на изменение атрибутов файла, поэтому мы будем сразу же считать, что файл sitemap.html уже существует и у него установленны атрибуты 666, то есть разрешение на чтение и запись.
Функцией fwrite мы сохраняем значение $out в файл с дескриптором $fp. После всех операций закрываем файл (fclose).
Теперь с помощью нашей функции ddsg_create_sitemap_file, мы можем сохранить карту сайта в отдельный файл. Теперь нужно решить, кто же будет "запускать" эту функцию.
События в WordPress
Здесь мы подходим к самому важному и, наверное, главному механизму WordPress - возможность создавать события. Если бы мы решали эту задачу на другом "движке", то вынуждены были бы придумывать всякие хитрости, чтобы запустить скрипт с нужной функцией. (Но только не для для WordPress'а
. )
Практически на каждую функцию WordPress можно "повесить" свою. Например, при публикации новой записи WordPress использует событие publish_post. Мы можем написать свою функцию, которая автоматически будет выполнена вместе с publish_post. То есть получается, что мы "повесили" свою функцию на событие "Опубликовать запись".
Технически это реализуется следующим образом. Например, событие publish_post используется (объявлено) для публикаций записей. Для "физической" публикации новости используется функция wp_insert_post, в которой добавляется "якорь"-функция для указанного события: do_action('publish_post'...). То есть теперь, все функции, которые добавили себя к событию publish_post, будут выполнены во время функции wp_insert_post.
Кроме этого в WordPress есть возможность явной "привязки" к другим функциям.
Теперь ясно, что для нашей задачи вполне подойдут события, которые возникают при создании или редактировании записей. Не буду вас утомлять, приведу сразу же готовый код (добавьте их в конец плагина):
add_filter('publish_post', 'ddsg_create_sitemap_file');
add_filter('save_post', 'ddsg_create_sitemap_file');
add_filter('edit_post', 'ddsg_create_sitemap_file');
Для подключения своей функции к другой (или событию) нужно использовать функцию add_filter(чужая, своя) или её синомим add_action.
Думаю, что по названию событий сразу ясно, какое из них за что отвечает
.
Теперь при любом изменении записей будет автоматически генерироваться и нужный нам файл sitemap.html.
Шаблон для вывода карты сайта
Непосредственный вывод мы будем осуществлять с помощью отдельного файла шаблона. Для его создания скопируйте файл index.php и сохраните его копию с именем sitemap.php.
В файле sitemap.php удалим строки, отвечающие за вывод записей. Вместо них мы будем выводить содержимое sitemap.html. Обычно это выглядит так:
if (have_posts()) <<< От этих строк нужно всё удалить ... endif; <<< Включая и эту строчку
Вместо этого мы добавим:
<h1 class="storytitle">Карта сайта</h1>
<?php
if (file_exists(ABSPATH . 'sitemap.html'))
readfile(ABSPATH . 'sitemap.html');
?>
Функцией file_exists мы проверяем существование файла sitemap.html и, если он есть, то выводим всё его содержимое в браузер (readfile).
Как видите всё, очень просто.
Подключаем sitemap.php
В 12-м выпуске рассылки я показал, как можно подключить к шаблону любые свои страницы. Самое время использовать этот способ.
В файле index.php в самое-самое начало добавим строчки:
<?php
if ($_GET['sitemap'] == 1) {
include ( TEMPLATEPATH . '/sitemap.php' );
exit;
}
?>
В этом коде мы проверяем существование параметра sitemap=1 в адресе (URL). Если такое соответствие есть, то мы подключаем файл sitemap.php.
Соответсвенно, ссылка на карту сайта будет иметь вид http://сайт/?sitemap=1, то есть добавляем в нужный файл шаблона (index.php или sidebar.php):
<a href="<?php echo get_settings('siteurl'); ?>/?sitemap=1">Карта сайта</a>
Надеюсь, что всё у вас получится
.
Постоянная ссылка: http://maxsite.org/?p=106
Версия для печати
