XML карта сайта на WordPress без плагинов moneyinnetwork_xml_sitemap

16.12.2016 в 17:02
admin
Регистрация: 17.02.2011
Сообщений: 4502
Рейтинг: 3091

Пару дней назад решил избавиться еще от одного увесистого и прожорливого плагина, который строил XML карту сайта на WordPress, причем, несмотря на множество настроек и отличную репутацию среди вебмастеров, этот плагин никак не хотел добавлять к карте дочерние страницы. Вернее, он их добавлял, но при этом уровень вложенности был не более одной страницы и то работало это как-то избирательно (кстати, соответствующую опцию в настройках я активировал). Плагин этот Google XML Sitemaps (может, у меня версия была не последняя, кто знает).

На эту проблему я обратил внимание несколько дней назад. Причем, очевидной лично для меня она стала в тот момент, когда я реализовал у себя на сайте этот простецкий форум, создал несколько разделов и тем и увидел, что в карте-то sitemap.xml нифига нет моих форумных страниц с темами. Во дела, подумал я, и, имея начальный опыт в программировании на php и mysql, решил-таки, что мне нужна XML карта сайта на WordPress без всяких там плагинов, чтобы я точно знал: что, как, куда, откуда и почему :) .

Порывшись в закромах интернета, подобных решений не нашел. Все вебмастера в сети, на которых меня выводил “Яша”, использовали готовые “плагинные” решения для XML карт WordPress. Засучив рукава, приступил к ночному ваянию кода (днем-то дела несколько иного плана). Вот, собственно, то, что вышло:

//обсуждение функции построения XML карт сайтов moneyinnetwork_xml_sitemap ведется на сайте автора в теме:
//http://moneyinnetwork.ru/forum/sajtostroenie-sistemy-upravleniya-sajtom-seo/vse-o-vordpress-wordpress/xml-karta-sajta-na-wordpress-bez-plaginov-moneyinnetwork_xml_sitemap
function moneyinnetwork_xml_sitemap ($home_priority='1.0', $page_priority='0.6', $post_priority='0.6', $other_priority = '0.3')
{
   global $wpdb;
   $result = $wpdb->get_results("SELECT ID, post_modified_gmt, post_type FROM $wpdb->posts WHERE post_status='publish' ORDER BY post_modified_gmt DESC", 'ARRAY_A');
   if( !empty($result) ) 
   {
      $f = '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
      $i = 0;
      foreach ($result as $row)   
      {
         $priority = $other_priority;
         if ( $row['post_type'] == 'page' ) $priority = $page_priority; 
         if ( $row['post_type'] == 'post' ) $priority = $post_priority;
         if ( $i == 0 )
         {
            $f = $f.'<url><loc>'.get_home_url().'</loc><lastmod>'.date('c', strtotime($row['post_modified_gmt'])).'</lastmod><changefreq>daily</changefreq><priority>'.$home_priority.'</priority></url>';
            $i = 1;
         }
         $f = $f.'<url><loc>'.get_permalink($row['ID']).'</loc><lastmod>'.date('c', strtotime($row['post_modified_gmt'])).'</lastmod><changefreq>daily</changefreq><priority>'.$priority.'</priority></url>';               						
      }
      $f = $f.'</urlset>';
      $fp = fopen($_SERVER['DOCUMENT_ROOT'].'/sitemap.xml', 'w');
      fwrite($fp, $f);
      fclose($fp);
      $result = wp_remote_get('http://www.google.com/ping?sitemap='.get_home_url().'/sitemap.xml');
      if ( ! is_wp_error( $result ) || wp_remote_retrieve_response_code( $result ) === 200 )
      {
         //Карта успешно отправлена в Google. 
         //Это просто под будущие разработки, если надо, конечно.
      }
   }
   return;
}

Итак, функция moneyinnetwork_xml_sitemap() строит XML карту сайта на WordPress, сохраняет ее в корневой директории сайта и “пингует” (отправляет) ее в Google (“примочка”, наверное, бесполезная, если у Вас есть кабинет вебмастера в Google, где Вы явно прописали карту сайта). Функцию moneyinnetwork_xml_sitemap() “укладываем” к функциям темы, то есть размещаем ее в functions.php.

Теперь оставалась задача за малым. Необходимо было сделать так, чтобы эта функция создавала новую XML карту сайта когда мы публикуем (обновляем) страницы и записи, а также когда эти страницы и записи удаляем. Для этого зарегистрируем нашу функцию, чтобы она выполнялась в тот момент, когда происходит одно из вышеуказанных событий. Установим функции низкий приоритет (1000) и не будем передавать ей никаких параметров (0 – число параметров, которые будет принимать наша функция. Приоритеты для страниц карты мы зададим в самой функции – это будут параметры по умолчанию).

add_action('delete_post', moneyinnetwork_xml_sitemap, 1000, 0);
add_action('publish_post', moneyinnetwork_xml_sitemap, 1000, 0);
add_action('publish_page', moneyinnetwork_xml_sitemap, 1000, 0);

Эти три строчки размещаем также в functions.php.

Вообще, функция moneyinnetwork_xml_sitemap() может принимать четыре параметра:

  • home_priority – приоритет главной страницы сайта (по умолчанию 1.0)
  • page_priority – приоритет для постоянных страниц (по умолчанию 0.6)
  • post_priority – приоритет для статей (по умолчанию 0.6)
  • other_priority – приоритет для других типов записей (по умолчанию 0.3)

Можно, конечно, добавить пару строчек в код и реализовать варьируемый в зависимости от даты модификации страниц приоритет их индексации, чтобы более новые страницы (измененные страницы) быстрее попали в индекс. При этом старым страницам можно задать минимальную нижнюю границу приоритета индексации, скажем, 0.2 или 0.3. В общем, если есть в этом необходимость, то реализовать это достаточно легко.

XML карта сайта на WordPress без плагинов теперь есть.

Поделиться в соц. сетях:
Ответов в теме: 2 Просмотров темы: 1209

20.12.2016, в 18:44
admin
Регистрация: 17.02.2011
Сообщений: 4502
Рейтинг: 3091
#1

admin 16.12.2016 в 17:02:
Можно, конечно, добавить пару строчек в код и реализовать варьируемый в зависимости от даты модификации страниц приоритет их индексации, чтобы более новые страницы (измененные страницы) быстрее попали в индекс. При этом старым страницам можно задать минимальную нижнюю границу приоритета индексации

Дописываю “пару строчек” кода и делаю функцию построения XML карты сайта с возможностью расчета приоритета для каждой страницы-записи:

//обсуждение функции построения XML карт сайтов moneyinnetwork_xml_sitemap ведется на сайте автора в теме:
//http://moneyinnetwork.ru/forum/sajtostroenie-sistemy-upravleniya-sajtom-seo/vse-o-vordpress-wordpress/xml-karta-sajta-na-wordpress-bez-plaginov-moneyinnetwork_xml_sitemap
function moneyinnetwork_xml_sitemap ($home_priority='1.0', $page_priority='1.0', $post_priority='0.6', $other_priority = '0.3', $auto=true)
{
	global $wpdb;
	$result = $wpdb->get_results("SELECT ID, post_modified_gmt, post_type FROM $wpdb->posts WHERE post_status='publish' ORDER BY post_modified_gmt DESC", 'ARRAY_A');
	if( !empty($result) ) 
	{
		$f = '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
		$i = 0;
		$date1 = date_create(date('c'));
		foreach ($result as $row)   
		{
			if ( $auto )
			{
				$date2 = date_create($row['post_modified_gmt']);
				$interval = date_diff($date1, $date2);
				$priority = '0.3';
				if ( $interval->days <= 30 ) 							$priority = '1.0';
				if ( $interval->days > 30 && $interval->days <= 60 ) 	$priority = '0.8';
				if ( $interval->days > 60 && $interval->days <= 90 ) 	$priority = '0.6';
			}
			else
			{
				$priority = $other_priority;
				if ( $row['post_type'] == 'page' ) $priority = $page_priority; 
				if ( $row['post_type'] == 'post' ) $priority = $post_priority;
			}
			if ( $i == 0 )
			{
				$f = $f.'<url><loc>'.get_home_url().'</loc><lastmod>'.date('c', strtotime($row['post_modified_gmt'])).'</lastmod><changefreq>daily</changefreq><priority>'.$home_priority.'</priority></url>';
				$i = 1;
			}
			$f = $f.'<url><loc>'.get_permalink($row['ID']).'</loc><lastmod>'.date('c', strtotime($row['post_modified_gmt'])).'</lastmod><changefreq>daily</changefreq><priority>'.$priority.'</priority></url>';               						
		}
		$f = $f.'</urlset>';
		$fp = fopen($_SERVER['DOCUMENT_ROOT'].'/sitemap.xml', 'w');
		fwrite($fp, $f);
		fclose($fp);
		$result = wp_remote_get('http://www.google.com/ping?sitemap='.get_home_url().'/sitemap.xml');
		if ( ! is_wp_error( $result ) || wp_remote_retrieve_response_code( $result ) === 200 )
		{ /* карта успешно отправлена в google */ }
	}
	return;
}

Параметр функции auto будет определять разрешение/запрещение автоматического вычисления приоритета индексации для страниц XML карты в зависимости от их “возраста”.
Так, для записей не старше 30 дней приоритет 1.0, для записей давностью от 31 до 60 дней – 0.8, от 61 до 90 дней – 0.6, для более ранних – 0.3.

+12 + -
Цитировать Ответить

23.02.2017, в 01:53
Алексеев
Регистрация: нет
Сообщений: 17
Рейтинг: 21
#2

Вы воистину универсал. Легко программируете как на php так и на mql. Я все сделал по вашим рекомендациям на своем блоге. Все отлично работает. Но думаю, для больших проектов с многими тысячами страниц такой вариант не подойдет. Так как скрипт будет выполняться слишком долго. А для большинства блогов – это настоящая находка. Еще раз спасибо.

+ -
Цитировать Ответить

Подписаться без комментирования