Плагины для построения карты сайта в формате xml в последнее время просто довели до белого каления. Впечатление, что живут они своей жизнью. Может тема виновата, может последняя (на это время) версия 3.5.1., но не в этом суть. Индексирование, да и выдача, оставляли желать лучшего.
Решив поискать другие способы создания этой штуки, наткнулся на очень интересный блог, с очень нестандартным решением проблемы. Карта сайта создавалась без всяких плагинов. Достаточно разместить соответствующий код в файле functions.php активной темы. Попробовал - понравилось не только мне, но и поисковикам.
Вот собственно код и стили для карты, распаковать в корень темы.
add_action("publish_post", "sp_xml_sitemap");
add_action("publish_page", "sp_xml_sitemap");
function sp_xml_sitemap() {
$stylesheet = false; // true - устанавливаем стили отображения XML карты | false - не устанавливаем
$sitemap = "<"."?xml version='1.0' encoding='UTF-8'?>\n".
($stylesheet?"<"."?xml-stylesheet type='text/xsl' href='".get_bloginfo('stylesheet_directory')."/stylesheet-xml-sitemap.xsl'?>\n":'').
"<!--sitemap-generator-url='http:/ваш блог/xml-sitemap-wordpress/'-->\n".
"<!--generated-on='".date("Y-m-d H:i:s")."'-->\n".
"<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n";
$posts = get_posts(array(
'numberposts' => -1,
'orderby' => 'modified',
'post_type' => array('post','page'),
'order' => 'DESC'
));
$sitemap.= "\t<url>\n".
"\t\t<loc>".get_option('home')."</loc>\n".
"\t\t<lastmod>".date('Y-m-d\TH:i:sP', strtotime($posts[0]->post_modified))."</lastmod>\n".
"\t\t<changefreq>daily</changefreq>\n".
"\t\t<priority>1</priority>\n".
"\t</url>\n";
foreach($posts as $post) {
setup_postdata($post);
$sitemap .= "\t<url>\n".
"\t\t<loc>" . get_permalink($post->ID) . "</loc>\n".
"\t\t<lastmod>" . date('Y-m-d\TH:i:sP', strtotime($post->post_modified)) . "</lastmod>\n";
if ($post->post_type == 'post') {
$sitemap .= "\t\t<changefreq>weekly</changefreq>\n".
"\t\t<priority>0.9</priority>\n";
} else {
$sitemap .= "\t\t<changefreq>monthly</changefreq>\n".
"\t\t<priority>0.5</priority>\n";
}
$sitemap .= "\t</url>\n";
}
$sitemap .= '</urlset>';
$fp = fopen(ABSPATH . "sitemap.xml", 'w');
fwrite($fp, $sitemap);
fclose($fp);
$sitemapUrl = urlencode(get_option('home').'/sitemap.xml');
$searchEngines = array(
'http://google.com/webmasters/sitemaps/ping?sitemap='.$sitemapUrl,
'http://www.bing.com/webmaster/ping.aspx?siteMap='.$sitemapUrl,
);
foreach ($searchEngines as $searchEngine) {
file_get_contents($searchEngine, 80, null, null, 0);
}
}
Код лучше вставлять перед закрывающим тегом ?> и не забыть прописать свой адрес. Карта обновляется при новой публикации. Но, если часто редактируются статьи или страницы, первую строчку заменить на:
add_action("save_post", "sp_xml_sitemap");
Вот вроде и всё.
Решив поискать другие способы создания этой штуки, наткнулся на очень интересный блог, с очень нестандартным решением проблемы. Карта сайта создавалась без всяких плагинов. Достаточно разместить соответствующий код в файле functions.php активной темы. Попробовал - понравилось не только мне, но и поисковикам.
Вот собственно код и стили для карты, распаковать в корень темы.
add_action("publish_post", "sp_xml_sitemap");
add_action("publish_page", "sp_xml_sitemap");
function sp_xml_sitemap() {
$stylesheet = false; // true - устанавливаем стили отображения XML карты | false - не устанавливаем
$sitemap = "<"."?xml version='1.0' encoding='UTF-8'?>\n".
($stylesheet?"<"."?xml-stylesheet type='text/xsl' href='".get_bloginfo('stylesheet_directory')."/stylesheet-xml-sitemap.xsl'?>\n":'').
"<!--sitemap-generator-url='http:/ваш блог/xml-sitemap-wordpress/'-->\n".
"<!--generated-on='".date("Y-m-d H:i:s")."'-->\n".
"<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n";
$posts = get_posts(array(
'numberposts' => -1,
'orderby' => 'modified',
'post_type' => array('post','page'),
'order' => 'DESC'
));
$sitemap.= "\t<url>\n".
"\t\t<loc>".get_option('home')."</loc>\n".
"\t\t<lastmod>".date('Y-m-d\TH:i:sP', strtotime($posts[0]->post_modified))."</lastmod>\n".
"\t\t<changefreq>daily</changefreq>\n".
"\t\t<priority>1</priority>\n".
"\t</url>\n";
foreach($posts as $post) {
setup_postdata($post);
$sitemap .= "\t<url>\n".
"\t\t<loc>" . get_permalink($post->ID) . "</loc>\n".
"\t\t<lastmod>" . date('Y-m-d\TH:i:sP', strtotime($post->post_modified)) . "</lastmod>\n";
if ($post->post_type == 'post') {
$sitemap .= "\t\t<changefreq>weekly</changefreq>\n".
"\t\t<priority>0.9</priority>\n";
} else {
$sitemap .= "\t\t<changefreq>monthly</changefreq>\n".
"\t\t<priority>0.5</priority>\n";
}
$sitemap .= "\t</url>\n";
}
$sitemap .= '</urlset>';
$fp = fopen(ABSPATH . "sitemap.xml", 'w');
fwrite($fp, $sitemap);
fclose($fp);
$sitemapUrl = urlencode(get_option('home').'/sitemap.xml');
$searchEngines = array(
'http://google.com/webmasters/sitemaps/ping?sitemap='.$sitemapUrl,
'http://www.bing.com/webmaster/ping.aspx?siteMap='.$sitemapUrl,
);
foreach ($searchEngines as $searchEngine) {
file_get_contents($searchEngine, 80, null, null, 0);
}
}
Код лучше вставлять перед закрывающим тегом ?> и не забыть прописать свой адрес. Карта обновляется при новой публикации. Но, если часто редактируются статьи или страницы, первую строчку заменить на:
add_action("save_post", "sp_xml_sitemap");
Вот вроде и всё.