В прошлый раз мы рассмотрели способ создания Sitemap в WordPress с использованием плагинов. Но оправдана ли установка дополнительных плагинов, для решения простых задач, которые мы можем реализовать стандартными средствами. Давайте сегодня разберемся, как сделать Sitemap для WordPress используя те инструменты, которые уже есть на нашем Linux сервере.
Sitemap это карта сайта, файл содержит в себе список всех страниц нашего сайта которые мы бы хотели видеть проиндексированными. Общий вид файла определяется протоколом Sitemap. Мы будем использовать формат XML, он является наиболее универсальным. Пример содержимого файла Sitemap с единственной страницей:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
Если откинуть общие теги, то нас интересует содержимое тега <url>, наша карта сайта должна содержать столько этих тегов, сколько страниц мы хотим добавить в карту. По тегам внутри <url> значение имеет главным образом только тег <loc> указывающий непосредственно адрес нашей страницы. Другие же теги мало значимы, так значения в тегах <priority> и <changefreq> игнорируются. А значение тега <lastmod>, используется если только оно является гарантированно точным.
Получается нам нужно подготовить файл в котором перечислены все наши страницы:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
</url>
<url>
<loc>http://www.example.com/first_page</loc>
</url>
...
<url>
<loc>http://www.example.com/last_page</loc>
</url>
</urlset>
Мы ранее включили в нашем WordPress использование постоянных ссылок — permalink. И сейчас страницы сайта имеют красивый вид, с названием поста вместо идентификатора. Если заглянуть в свойства любого поста, то можно заметить, что для формирования постоянных ссылок используется значение из поля Ярлык.
В базе данных эти ярлыки хранятся в таблице wp_posts в столбце post_name. Значит все что нам нужно, чтобы создать свою карту сайта, это извлечь ярлыки постов из базы и сформировать из них ссылки для тега <url> файла Sitemap.
Для этого напишем простой bash скрипт. Назовем его wordpress_sitemap_gen.sh и разместим его в директории для локальных программ /usr/local/bin/ Используйте текстовый редактор, чтобы создать и заполнить файл:vi /usr/local/bin/wordpress_sitemap_gen.sh
Скопируйте и вставьте следующий код, только измените значения переменных main_url и site_dir, в main_url укажите ваше доменное имя, а в site_dir путь до веб директории вашего сайта.
#!/bin/bash
main_url="https://waky.ru/"
site_dir="/usr/share/nginx/waky.ru/"
database=`grep "^define( 'DB_NAME'" $site_dir"wp-config.php" | awk '{print $3}' | sed "s|'||g"`
echo '<?xml version="1.0" encoding="UTF-8"?>' > $site_dir"sitemap.xml"
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' >> $site_dir"sitemap.xml"
echo ' <url>' >> $site_dir"sitemap.xml"
echo ' <loc>'$main_url'</loc>' >> $site_dir"sitemap.xml"
echo ' </url>' >> $site_dir"sitemap.xml"
for url in `mariadb -s -r -N -e 'select post_name from wp_posts where post_status="publish" and post_type in ("post","page");' $database`; do
echo ' <url>' >> $site_dir"sitemap.xml"
echo -e " <loc>$main_url${url//%/\\x}</loc>" >> $site_dir"sitemap.xml"
echo ' </url>' >> $site_dir"sitemap.xml"
done
echo '</urlset>' >> $site_dir"sitemap.xml"
Первым делом скрипт проверяет файл конфигурации WordPress wp-config.php, находящийся в директории site_dir и берет из него название базы данных. Далее мы построчно заполняем файл sitemap.xml находящийся в директории site_dir. Помимо стандартных строк, вносим туда строки с нашим основным доменным именем main_url,
а далее заполняем файл тегами и с адресами отдельных страниц.
Адреса страниц берутся из таблицы wp_posts нашей базы данных, где пост имеет статус опубликованный (publish) и тип пост или страница («post»,»page»).
Так как в таблице ярлыки хранятся в кодировке Percent Encoding, дополнительно переводим их в кириллицу
Поменяем права на скрипт, чтобы сделать его исполняемым.chmod 700 /usr/local/bin/wordpress_sitemap_gen.sh
Запустим и проверим результат:
[root@waky ~]# /usr/local/bin/wordpress_sitemap_gen.sh
[root@waky ~]# cat /usr/share/nginx/waky.ru/sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://waky.ru/</loc>
</url>
<url>
<loc>https://waky.ru/новые-заметки</loc>
</url>
<url>
<loc>https://waky.ru/все-заметки</loc>
</url>
<url>
<loc>https://waky.ru/как-настроить-подключение-по-ssh-через-putty</loc>
</url>
...
</urlset>
Файл sitemap.xml готов, можно использовать его для индексации нашего сайта. Мы разобрались, как сделать Sitemap для WordPress, теперь чтобы не запускать наш скрипт каждый раз в ручную добавим его в расписание crontab.
[root@waky ~]# printf "#Sitemap renew\n0 2 * * * /usr/local/bin/wordpress_sitemap_gen.sh > /dev/null 2>&1\n" >> /var/spool/cron/root
[root@waky ~]# crontab -l
#Sitemap renew
0 2 * * * /usr/local/bin/wordpress_sitemap_gen.sh > /dev/null 2>&1
Теперь cron будет запускать скрипт генерации файла Sitemap каждый день в 2 часа ночи.