N15
Материал из WordPress Wiki
Выпуск 15. Карта сайта
Содержание |
Карта сайта
Тема создания карты сайта "всплывает" на форумах постоянно. В WordPress'е есть возможность использования функций вывода архива по заданому параметру: день, месяц год, но вывод этих данных происходит как обычная новостная лента. Карта сайта подразумевает, что вы получите структуру записей с группировкой по рубрикам и постоянным страницам.
Думаю, что вы без проблем найдете нужные плагины, чтобы создать такую карту сайта. Но практически у всех есть один существенный недостаток - они довольно серьезно нагружают сервер, поскольку для создания такой структуры, требуется десятки-сотни обращений к MySQL. При небольшой посещаемости это не составляет большой проблемы, но для других необходимо как-то её решать.
Поскольку в какой-то мера наша рассылка носит учебный характер, то я покажу на примере существующего плагина, как можно его изменить, чтобы получить нужный результат.
Постановка задачи
Вначале определимся, что же мы хотим получить. Для того, чтобы снять нагрузку на сервер вполне логично использовать уже готовый результат, где будет и хранится вся карта сайта (что-то аналогичное кэшу). То есть для генерации карты мы будем использовать существующий плагин, но вывод будет осуществлен не в браузер, а в файл. Для сохранения результата в файл нам придется написать дополнительную функцию.
Здесь же нам нужно решить как именно и кто будет генерировать этот файл, то есть при каких условиях будут задействованы функции плагина.
После этого мы должны создать в каталоге шаблона дополнительный файл, который будет выводить данные файла карты сайта.
Естественно, нам нужно каким-то образом подключить файл шаблона к основному index.php.
Создание файла результата (sitemap.html)
Поскольку результат плагина это HTML-код, то условимся, что карта сайта будет храниться в главном каталоге WordPress в файле sitemap.html.
Сам плагин карты сайта называется Dagon Design Sitemap Generator и вы можете скачать его по ссылке: 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>
Надеюсь, что всё у вас получится