Карта сайта или sitemap генерируется по-умолчанию в WordPress. Но из опыта разработки, можно утверждать, что такая генерация не всегда функциональна и подходит для поисковых систем. Так как сделать карту сайта или sitemap без плагинов в wordpress?
Какие недостатки стандартной карты сайта от WordPress
Основным недостатком являются проблемы с произвольными типами записей, которые могут не отображаться или выводится с ошибками. Например, если вы самостоятельно внедряете дополнительный тип записи: услуги, отзывы и др.
Во-вторых, опять же из личного опыта, как сам wordpress так и дополнительные плагины могут создавать излишнюю нагрузку на базу, например: через вызов функции wp_sitemaps_get_server ().
В-третьих, разбивка по типам записей с указанием принадлежности к wordpress (wp-post, wp-page и др.) — не всегда удобный вариант при необходимости применения полноценного SEO. В данном случае имеется в виду: акцент на уникализацию исходного кода.
И еще дополнительный момент, возможно и основной — стандартный sitemap сложен во внесении правок и настройке. Так как находится внутри самого движка — в исходном коде cms. Понятно, что лучше в исходный код самой системы не вносить правки, тем более они откатится к стандартным при обновлении версии.
Решение для sitemap в WordPress
Предлагаем использовать решение для генерации sitemap.xml в WordPress. Указанный ниже код вносится в файл functions.php в папке с используемой темой.
/* ------------------------------------------------------------------------- * * Карта сайта от max-site.ru /* ------------------------------------------------------------------------- */ add_action("publish_post", "max_create_sitemap"); add_action("publish_page", "max_create_sitemap"); function max_create_sitemap() { $postsForSitemap = get_posts(array( 'numberposts' => -1, 'orderby' => 'modified', 'post_type' => array('post','page'), 'order' => 'DESC' )); $sitemap = '<?xml version="1.0" encoding="UTF-8"?>'; $sitemap .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; foreach($postsForSitemap as $post) { setup_postdata($post); $postdate = explode(" ", $post->post_modified); $sitemap .= '<url>'. '<loc>'. get_permalink($post->ID) .'</loc>'. '<priority>1</priority>'. '<lastmod>'. $postdate[0] .'</lastmod>'. '<changefreq>daily</changefreq>'. '</url>'; } $sitemap .= '</urlset>'; $fp = fopen(ABSPATH . "max-sitemap.xml", 'w'); fwrite($fp, $sitemap); fclose($fp); }
Обратите внимание на 4,5 и 10 строки кода — они указывают на типы записей используемые при генерации карты сайта.
Sitemap для произвольного типа записи
В качестве примера используется тип записи otziv (таксономия аналогичных записей всегда на латинице).
/* ------------------------------------------------------------------------- * * Карта сайта от max-site.ru для произвольных записей /* ------------------------------------------------------------------------- */ add_action("publish_post", "max_create_sitemap"); add_action("publish_page", "max_create_sitemap"); add_action("publish_otziv", "max_create_sitemap");//тип записи function max_create_sitemap() { $postsForSitemap = get_posts(array( 'numberposts' => -1, 'orderby' => 'modified', 'post_type' => array('post','page','otziv'), //типы записей 'order' => 'DESC' )); $sitemap = '<?xml version="1.0" encoding="UTF-8"?>'; $sitemap .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; foreach($postsForSitemap as $post) { setup_postdata($post); $postdate = explode(" ", $post->post_modified); $sitemap .= '<url>'. '<loc>'. get_permalink($post->ID) .'</loc>'. '<priority>1</priority>'. '<lastmod>'. $postdate[0] .'</lastmod>'. '<changefreq>daily</changefreq>'. '</url>'; } $sitemap .= '</urlset>'; $fp = fopen(ABSPATH . "max-sitemap.xml", 'w'); fwrite($fp, $sitemap); fclose($fp); }
Что делать дальше?
Необходимо отключить генерацию sitemap по-умолчанию. Для этого в файл functions.php добавить одну строчку кода.
/** * отключение стандартной карты сайта в wordpress */ add_filter( 'wp_sitemaps_enabled' , '__return_false' );
Далее в панели администратора обновите любую запись или страницу. После этого в корне сайта появиться файл max-sitemap.xml, который доступен по адресу: ваш-сайт.ру/max-sitemap.xml
Карта сайта — какие преимущества этого решения?
Основное преимущество — это возможность публикации в sitemap любых типов записей. Причем sitemap формировать как одиночный, так и множественный — при большом числе произвольных записей. Для этого необходимо продублировать функцию max_create_sitemap() с другим названием и заменить имя конечного файла xml.
Рекомендуем использовать своеобразную разбивку, для минимизации нагрузки на functions.php
/** * Карта сайта */ require get_template_directory() . '/inc/karta-xml-1.php'; require get_template_directory() . '/inc/karta-xml-2.php';
Во-вторых, вы снижаете нагрузку на сайт, точнее на базу данных, чем страдают динамичные карты от плагинов или самого WordPress. В данном случае карта сайта формируется статичная. Обновление данных происходит только при публикации новых или обновлении старых записей. Поэтому никакой постоянной нагрузки на сервис не оказывается.
Ну и в-третьих, никаких стилей или дополнительной «мусорной» красоты оформления формируемая карта сайта не имеет — это чистый и правильный код, что существенно снижает ее размер. Что достаточно важно при обходе или индексировании sitemap.xml поисковыми системами.