Карта сайта wp-sitemap.xml в WordPress

Поздравляю вас с тем, что на вашем сайте теперь будет -1 плагин! 🎉 Потому что начиная с версии WordPress 5.5 в ядре движка будет присутствовать расширяемая карта сайта!

Карта сайта будет находиться по адресу /wp-sitemap.xml, если вы уже обновились и у вас версия WordPress 5.5 или выше, попробуйте перейти по этому адресу и у вас откроется XML карта сайта. Если же при переходе у вас возникла ошибка 501, то значит у вас не стоит расширение для PHP, SimpleXML, которое необходимо для создание XML карты сайта.

Индекс карты сайта может содержать до 20000 карт сайта, в каждой по 2000 страниц (можно изменить при помощи хука).

По умолчанию в карту сайта попадают все типы постов с параметрами public и publicly_queryable и таксономии, а также архивы автора и главная страница сайта.

Также рекомендую вам свой видеокурс по WordPress, в котором мы создаём тему для сайта на основе готовой HTML вёрстки с учётом всех последних изменений в движке – вот ссылка.

Как отключить карту сайта WordPress

Допустим я уже использую какой-то плагин для WordPress для создания карты сайта, например Google XML Sitemaps и он меня полностью устраивает, а тестить новый функционал у меня пока что нет времени.

Вы можете вставить этот код в functions.php вашей текущей или дочерней темы:

add_filter( 'wp_sitemaps_enabled', '__return_false' );

И всё, карта сайта по адресу /wp-sitemap.xml исчезнет и будет выводиться ошибка 404.

Кроме того, хочу добавить, что карта сайта будет выдавать 404 ещё в одном случае – когда в настроках чтения у вас включена галка «Попросить поисковые системы не индексировать сайт».

Попросить поисковые системы на индексировать сайт
Опция «Попросить поисковые системы на индексировать сайт» находится в Настройки > Чтение

Также у вас есть возможность проверить, что карты сайта включены при помощи метода  wp_sitemaps_get_server()->sitemaps_enabled():

if(  wp_sitemaps_get_server()->sitemaps_enabled() ) {
	// ага, включены
}

Удаляем определённые карты сайта из индекса

У вас также есть возможность удалить определённые провайдеры (карты сайта) из индекса, например если вам не нужны в вашей карте архивы постов пользователей, то вы можете использовать этот фильтр-хук:

add_filter( 'wp_sitemaps_add_provider', 'truemisha_remove_user_sitemap', 25, 2 );
 
function truemisha_remove_user_sitemap( $provider, $name ) {
 
	if ( 'users' === $name ) { // если архивы пользователей, то отключаем
		return false;
	}
	return $provider;
 
}

Убираем определённые типы постов из карты

Для этого существует отдельный хук wp_sitemaps_post_types, если вы например хотите исключить из вашей карты сайта тип постов Страницы, то код будет выглядеть так:

add_filter( 'wp_sitemaps_post_types', 'truemisha_remove_pages', 25 );
 
function truemisha_remove_pages( $post_types ) {
 
	unset( $post_types['page'] );
	return $post_types;
 
}

Удаляем определённые таксономии из карты сайта

Похожая ситуация и для таксономий – есть хук wp_sitemaps_taxonomies, при помощи которого легко это сделать, например для таксономии Теги post_tag:

add_filter( 'wp_sitemaps_taxonomies', 'truemisha_remove_tags', 25 );
 
function truemisha_remove_tags( $taxonomies ) {
 
	unset( $taxonomies['post_tag'] );
	return $taxonomies;
 
}

Добавляем теги XML

По умолчанию карта сайта в WordPress содержит только один тег XML – URL (loc).

Карта сайта WordPress
Как видите, по умолчанию в таблице карты сайта присутствует только одна колонка (тег) – URL.

Другие же теги, такие как changefreq, priority и lastmod не являются обязательными и поэтому не присутствуют сразу же по умолчанию в вашей карте, для оптимизации производительности.

Тем не менее вы можете добавить их в определённую карту при помощи этих хуков:

  • wp_sitemaps_index_entry – основной индекс,
  • wp_sitemaps_posts_entry – карта с типами постов,
  • wp_sitemaps_taxonomies_entry – карта с таксономиями,
  • wp_sitemaps_users_entry – архивы пользователей.

Хорошо, допустим я хочу добавить все три тега в карту с постами:

add_filter( 'wp_sitemaps_posts_entry', 'truemisha_add_sitemap_tags', 25, 2 );
 
function truemisha_add_sitemap_tags( $entry, $post ) {
 
	$entry[ 'priority' ] = '40%';
	$entry[ 'changefreq' ] = 'Monthly';
	$entry[ 'lastmod' ] = $post->post_modified_gmt;
 
	return $entry;
 
}

Готово, внутри функции хука доступен также объект поста $post, благодаря которому мы легко получаем время последнего изменения.

Если вы попробуете добавить несуществующие теги, то это приведёт к уведомлению _doing_it_wrong.

Исключаем определённую страницу из карты сайта

Предположим, что вы создали какой-то SEO-плагин, который позволяет добавлять мета-тег robots noindex для определённых страниц или записей сайта, тогда вполне логично, что их нужно исключать и из карты сайта.

В этом вам поможет фильтр-хук wp_sitemaps_posts_query_args:

add_filter( 'wp_sitemaps_posts_query_args', 'truemisha_exclude_post', 25, 2 );
 
function truemisha_exclude_post( $args, $post_type ) {
 
	// ничего не делаем, если тип поста не post
	if ( 'post' !== $post_type ) {
		return $args;
	}
 
	// параметр post__not_in уже может существовать, не теряем его
	$args[ 'post__not_in' ] = isset( $args[ 'post__not_in' ] ) ? $args[ 'post__not_in' ] : array();
 
	// исключаем запись с ID 1, да, которая "Привет мир"
	$args[ 'post__not_in' ][] = 1; 
 
	return $args;
 
}

Количество URL в одной карте

Ещё один хук, который хочу вам показать – это wp_sitemaps_get_max_urls. Как я уже сказал в самом начале урока – по умолчанию содержится 2000 URL в одной карте, но мы можем изменить это значение.

add_filter( 'wp_sitemaps_max_urls', 'truemisha_url_v_karte', 25 );
 
function truemisha_url_v_karte( $object_type ){
 
	// $object_type может быть 'post', 'term', 'user'
	return 1000;
 
}

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 11

  • Станислав 9 августа 2020 #

    Михаил, дико извиняюсь, но хочу задать вопрос не по теме поста. К соответствующих темах комменты закрыты, к сожалению.

    Пытаюсь подключить скрипт, который находится в корневой папке сайта функцией wp_enqueue_scripts, не получается. В корне хостинга 2 папки: с сайтом и с upload, условно говоря. Как мне подключить скрипт из папки, не находящейся в папке WP? Регистрацией скрипта?

    • Миша 9 августа 2020 #

      На первый раз ваши извинения принимаются 🙃 Но впоследствии будьте пожалуйста внимательнее, есть ведь причина, по которой комментарии к старым постам закрыты.

  • Дмитрий 17 августа 2020 #

    Добрый день, в yost seo выключил sitemap, но теперь не заходит по адресу адрес сайта/sitemap.xml. Как установить SimpleXML?

    • Миша 18 августа 2020 #

      Добрый день,

      адрес сайта/wp-sitemap.xml

  • Алёша 29 августа 2020 #

    Что выбрать для использования: встроенную карту wordpress или карту yoast?
    Изначально я думал что использовать встроенную карту предпочтительней, можно избавиться от лишнего плагина yoast, он у меня установлен чисто из-за карты.
    Теперь из вашего поста я узнал что встроенную карту нужно будет настраивать под себя, а значить добавлять лишний код в functions.php Для меня это не очень хороший вариант, не хочется превращать этот файл в портянку.
    И теперь я в раздумье что выбрать?

    • Миша 9 сентября 2020 #

      Да, перед вами встал непростой выбор.

  • Сергей 2 сентября 2020 #

    Привет, у меня есть вопрос и я как-то не знаю как мне ее решить, мне нужны для страниц и постов разные приоритеты, и еще мне нужно чтобы у главной страницы был приоритет свой
    я написал вроде исключения и получилось почти то, что нужно, но я не могу понять как мне указать для главной страницы свой приоритет, буду благодарен за помощь
    я использовал wp_sitemaps_posts_entry но я в упор не вижу в этом фильтре за что мне зацепиться чтобы главную отфильтровать

    add_filter( 'wp_sitemaps_posts_entry', 'add_sitemap_tags_post', 10, 2 );
     
    function add_sitemap_tags_post( $sitemap_entry, $post, $post_type ) {
     
            if ( 'post' == $post->post_type ) {
                $sitemap_entry[ 'priority' ] = '0.5';
            }
            if ( 'page' == $post->post_type  ) {
        	    $sitemap_entry[ 'priority' ] = '0.6';
            } 
        $sitemap_entry[ 'changefreq' ] = 'weekly';
        $sitemap_entry[ 'lastmod' ] = $post->post_modified_gmt;
     
        return $sitemap_entry;
     
    }
    • Валерий 11 сентября 2020 #

      Да, очень актуальный вопрос. И еще не понятно, как задать changefreq, lastmod и priority для категорий

  • Damir 3 октября 2020 #

    zaebok

  • Сергей 3 октября 2020 #

    Не хочет её обрабатывать Google Search Console. Получаю сообщение «Не удалось обработать файл Sitemap. Общая ошибка HTTP». При этом карта по ссылке открывается.

    В чём может быть проблема?

    • Миша 4 октября 2020 #

      Первое, что заметил – у вас в robots.txt она неправильно указана.

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.