WordPress: XML карта на сайта без плъгини

10 февр. 2017 | Без плъгини
WordPress: XML карта на сайта без плъгини

Картата на сайта е важна част от оптимизацията (SEO). Става въпрос за XML sitemap, а не HTML. HTML sitemap може да си направите по желание. Той служи за по-лесна ориентация на посетителите, но при една правилна подредба на сайта не е необходим. XML картата обаче е за търсачките и е задължителна.

В интернет е пълно с безплатни онлайн генератори на XML карти. Тях обаче можете да ползвате при статични сайтове, в които рядко се добавят нови страници. И всеки път при промяна в сайта трябва да си генерирате нов актуален XML sitemap.

Какво да правим обаче, ако сайтът ни е динамичен, направен е чрез някоя от системите за управление на съдържанието (CMS) – WordPress, Joomla, Drupal… В този случай ние публикуваме нови неща доста често, дори ежедневно или няколко пъти на ден. Абсурдно е всеки път да използваме онлайн генераторите, но е задължително всяка нова публикация да бъде отразена веднага в XML картата (sitemap.xml).

За сайтове, изработени с WordPress, има доста плъгини, които генерират Sitemap автоматично, при всяка промяна – когато създадете нова публикация или страница. Много хора обаче не обичат плъгините и ги използват само в краен случай.

Ето как да се справите с тази задача без използване на разширение, единствено чрез добавяне на малко код във файла functions.php на темата на сайта ви. С този код sitemap.xml се създава в root директорията на Вашия сайт, като най-новите публикации или последните промени по съществуваща вече публикация се нареждат най-отгоре в картата.

add_action( "save_post", "eg_create_sitemap" );   
function eg_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 .= "\n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n"; 
    $sitemap .= "\t" . '<url>' . "\n" .
        "\t\t" . '<loc>' . esc_url( home_url( '/' ) ) . '</loc>' .        
        "\n\t" . '</url>' . "\n";
    foreach( $postsForSitemap as $post ) {
        setup_postdata( $post );   
        $postdate = explode( " ", $post->post_modified );   
        $sitemap .= "\t" . '<url>' . "\n" .
            "\t\t" . '<loc>' . get_permalink( $post->ID ) . '</loc>' .
            "\n\t\t" . '<lastmod>' . $postdate[0] . '</lastmod>' .
            "\n\t\t" . '<changefreq>monthly</changefreq>' .
            "\n\t" . '</url>' . "\n";
    }     
    $sitemap .= '</urlset>';     
    $fp = fopen( ABSPATH . "sitemap.xml", 'w' );
    fwrite( $fp, $sitemap );
    fclose( $fp );
}

Кодът по-горе включва URL-те на всяка страница или публикация (между таговете <loc> </loc>),както и датата на последната им модификация (между <lastmod> </lastmod>) и честотата на обновяване на страниците, тоест препоръчителната честота на обхождане (<changefreq> </changefreq>), в случая месечно. Може да се добави и приоритет на страниците и публикациите – примерно <priority>0.5</priority>.

Ботовете обаче не се съобразяват с Вашите желания. Затова е безсмислено да ги добавяте. Единственият важен и задължителен атрибут е <loc>. Затова достатъчно е кодът да има следния вид:

add_action( "save_post", "eg_create_sitemap" );   
function eg_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 .= "\n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n"; 
    $sitemap .= "\t" . '<url>' . "\n" .
        "\t\t" . '<loc>' . esc_url( home_url( '/' ) ) . '</loc>' .        
        "\n\t" . '</url>' . "\n";
    foreach( $postsForSitemap as $post ) {
        setup_postdata( $post );   
        $postdate = explode( " ", $post->post_modified );   
        $sitemap .= "\t" . '<url>' . "\n" .
            "\t\t" . '<loc>' . get_permalink( $post->ID ) . '</loc>' .            
            "\n\t" . '</url>' . "\n";
    }     
    $sitemap .= '</urlset>';     
    $fp = fopen( ABSPATH . "sitemap.xml", 'w' );
    fwrite( $fp, $sitemap );
    fclose( $fp );
}

Имайте предвид само, че ако добавите кода по-късно, при съществуващ вече сайт, XML картата няма да се генерира автоматично веднага, а при първата промяна. За да се случи това, просто отворете последната си публикация и я актуализирайте чрез бутона Update (Обновяване). Не е необходимо да правите промени по нея, просто я обновете чрез бутона.