Выпуск 15. Карта сайта
Понедельник, 2 октября 2006 г.
Просмотров: 3284
Подписаться на комментарии по RSS
Сегодня мы поговорим о том, как создать карту сайта, но в начале немного новостей
Исправление бага с кэшем 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>
Надеюсь, что всё у вас получится
.
Еще записи по теме
- Выпуск 4. Знакомимся с плагинами
- Выпуск 23. Базовый класс для WordPress-плагина
- Выпуск 33. Виджеты и плагины
- Выпуск 12. Особые страницы шаблона
- Выпуск 28. Делаем собственный шаблон для WordPress (часть 5)
- Выпуск 8. Оформление текстов с помощью HTML (окончание)
- Архив рассылки «Используем WordPress для создания своего сайта»



Комментариев: 27
Максим, подскажите пожалуйста общий принцип исправления подобных плугинов для совместной работы с плагином Polyglot.
Дело в том, что у меня в ведется две версии журнала на русском и английском. Например название статьи «переводчики» выглядит так [lang_ru]Переводчики[/lang_ru][lang_en]Translators[/lang_en] и выводится данным плагином, а местами и самим движком wordpress, именно в таком формате.
Я бы очень хотел исправить эту проблему, но в данный момент полного понимания работы движка wordpress я ещё не добился.
А разве нет возможности в данном случае использоваться тег на подобии родного, что в плагине для того, чтобы его вставлять уже в созданную страницу WP? У меня просто адрес карты сайта хорошо проиндексирован и очень не хотелось бы его менять, есть какие-нибудь варианты? :sad:
Тег наподобии такого вот <!-- ddsitemapgen -->
Знаете, Роман, я бы попробовал бы решить эту проблему следубщим образом. Вначале генерировал бы файл карты сайта как обычно. После этого "пропускал" бы полученный текст для английского, то есть оставлял бы [lang_en]текст[/lang_en], а все остальные языки удалил бы. Полученный текст сохранил бы в sitemap_en.html. Аналогично поступил бы с [ru]. То есть сделал бы два языковых файла. Соответственно, при загрузке страницы определялся бы текущий язык и подуключался нужный файл.
А мне ответу?
Можно сделать шаблон страницы, куда добавить
<?php
if (file_exists(ABSPATH . 'sitemap.html'))
readfile(ABSPATH . 'sitemap.html');
?>
А после указать этот шаблон для постоянной страницы. Тогда, по идее и адрес страницы не потеряется.
Не выйти то выйдет только как я все динамическое туда перенесу в этот файл, топ 10 комментариев, разделы, что в сайтбаре находяться? А нормального способа нет , да? Ведь как то плагин переноси себя таким образом в созданную страницу, неужели так в страницу нельзя подгрузить html файл? :sad:
Писал, писал. Рычит на плугин antispamimage
Ещё раз, но уже кратко: Спасибо Максим, получилось сделать, так как вы подсказали. В сайтмапгенераторе в функции ddsg_create_sitemap() при формировании вывода всего плугина, я $the_output насильно прогоняю через функцию полиглота и теперь все заработало :mrgreen:
http://brj.pp.ru/sitemap/lang/ru/
http://brj.pp.ru/sitemap/lang/en/
Супер!
Спасибо за ваши труды. Без них я бы не начал делать свой сайт
Я вообще не понимаю, зачем придавать выводу sitemap хоть какую-то динамику. Есть статика и пусть она выводится тупо из sitemap.html без всяких шаблонов (как sitemap.xml для гугля), обращениям к базе и вообще без привлечения php. Роботам глубоко плевать на наш супер-пупер дизайн. В home.php прописываем статическую ссылку на статический же файл, например, http://site.ru/sitemap.html где-нибудь в боковушке или вверху, в карте дописываем "noindex, follow", и имеем прохождение робота на любую запись уже на втором шаге.
не в первый раз убеждаюсь что вордпресс лучший блог!!!
Таки лучшый конструктор.
Блог таки typepad. :smile:
Я использую вот такую штуку: Google Sitemaps
Спасибо, все сделал все вышло ;)
А файл-то с новым постом не переписывается. Хотя chmod=666. Из-за чего такое может быть? Или я неправильно понял, и он так и должен быть неизменяемым?
Впрочем, переписывается, но новые посты не добавляются. И как бороться?
И как побороли?
Кто подскажет?
Как на основе плагина google sitemap сделать такую карту..как у Макса..то есть на основе генерируемого sitemap.xml?
Аналогично не переписывается файл. Сделал файл, положил в корень it4business.ru/sitemap.html - поставил 666. Добавил код в плагин включая код "триггеров". Добавил запись в блог. sitemap.html нулевой. Не смог понять в чём трабла и вернул всё взад
Пока сделал динамический раздел - жду пока сайт начнёт падать.
Максим, а как ты сделал свою карту сайта?
Спасибо большое, все заработало
function ddsg_show_sitemap_file($text) { $keyword = "map"; $file_name=ABSPATH . 'sitemap.html'; // 1 $res = strpos($text, "<!--" .$keyword ."-->"); if (file_exists($file_name) && !($res===false)) readfile($file_name); $text = preg_replace("#(<!--[ ]*" . $keyword . "[ ]*=?[^\-]*-->)#imsU", "" , $text); return $text; } add_filter('the_content', 'ddsg_show_sitemap_file', 1);Вот такое дополнение можно сделать в конец плагина. И потом в то место куда нужно вставить карту сайта пишем: <!--map-->
Слово можно изменить.
Спасибо за информацию. Только я так и не понял, чем плох обычный Dagon Design Sitemap Generator ?
Огромное спасибо за полезную статью. Все делал по инструкции, прошло как по маслу.
а как добавить действие чтобы отрабатывалась определенная функция только при создании нового поста,но не когда этот пост редактируется.
add_action('publish_post', 'наша функция');
в таком случае ведь наша функция будет отрабатываться и при редактировании поста.
Максим, а не подскажите, что нужно сделать, что бы вывод был постраничной карты сайта...
Ну например в футере номера разбитой карты сайта, и в каждой странице карты выводится допустим по 50 ссылок..