11.05.2013

XML карта сайта

Плагины для построения карты сайта в формате 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");
Вот вроде и всё.