joo
  • 0
Новичок

Как сгенерировать/обновить XML-карту сайта без плагинов?

  • 0

Мне нравится жестко кодировать все на моих веб-сайтах WordPress без использования каких-либо плагинов. Есть ли способ генерировать или обновлять мою карту сайта каждый раз, когда я публикую/обновляю сообщение в одном из своих мультисайтовых блогов, без использования плагинов?

Share
  1. Вы понимаете, что между «жестким кодом» и плагином нет реальной разницы, кроме того факта, что плагины переносимы и, следовательно, с ними легче работать?

    • 0
  2. Следующий код работает сразу же. Ваша карта сайта будет отображаться по адресу: https://your-website-name.com/sitemap.xml.

    Каждый раз, когда вы создаете или обновляете страницу, сообщение или пользовательский тип сообщения, оно будет отображаться. Не забудьте добавить название вашего пользовательского типа записи:

    add_action( 'publish_post', 'ow_create_sitemap' );
    add_action( 'publish_page', 'ow_create_sitemap' );
    add_action( 'save_post',    'ow_create_sitemap' );
    
    function ow_create_sitemap() {
        $postsForSitemap = get_posts(array(
            'numberposts' => -1,
            'orderby'     => 'modified',
            // 'custom_post' should be replaced with your own Custom Post Type (one or many)
            'post_type'   => array( 'post', 'page', 'custom_post' ),
            'order'       => 'DESC'
        ));
    
        $sitemap = '<?xml version="1.0" encoding="UTF-8"?>';
        $sitemap .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">';
    
        foreach( $postsForSitemap as $post ) {
            setup_postdata( $post );
    
            $postdate = explode( " ", $post->post_modified );
    
            $sitemap .= '<url>'.
                        '<loc>' . get_permalink( $post->ID ) . '</loc>' .
                        '<lastmod>' . $postdate[0] . '</lastmod>' .
                        '<changefreq>monthly</changefreq>' .
                        '</url>';
          }
    
        $sitemap .= '</urlset>';
    
        $fp = fopen( ABSPATH . 'sitemap.xml', 'w' );
    
        fwrite( $fp, $sitemap );
        fclose( $fp );
    }
    
    • 0
  3. Прежде чем использовать код, представленный в ответе w3uiguru, мне пришлось внести некоторые улучшения, соответствующие принятому стандарту для файлов XML. Код ниже:

    /* function to create sitemap.xml file in root directory of site  */
    // add_action("publish_post", "eg_create_sitemap");
    // add_action("publish_page", "eg_create_sitemap");
    add_action( "save_post", "eg_create_sitemap" );
    function eg_create_sitemap() {
        if ( str_replace( '-', '', get_option( 'gmt_offset' ) ) < 10 ) { 
            $tempo = '-0' . str_replace( '-', '', get_option( 'gmt_offset' ) ); 
        } else { 
            $tempo = get_option( 'gmt_offset' ); 
        }
        if( strlen( $tempo ) == 3 ) { $tempo = $tempo . ':00'; }
        $postsForSitemap = get_posts( array(
            'numberposts' => -1,
            'orderby'     => 'modified',
            'post_type'   => array( 'post', 'page' ),
            'order'       => 'DESC'
        ) );
        $sitemap .= '<?xml version="1.0" encoding="UTF-8"?>' . '<?xml-stylesheet type="text/xsl" href="' . 
            esc_url( home_url( '/' ) ) . 'sitemap.xsl"?>';
        $sitemap .= "\n" . '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
        $sitemap .= "\t" . '<url>' . "\n" .
            "\t\t" . '<loc>' . esc_url( home_url( '/' ) ) . '</loc>' .
            "\n\t\t" . '<lastmod>' . date( "Y-m-d\TH:i:s", current_time( 'timestamp', 0 ) ) . $tempo . '</lastmod>' .
            "\n\t\t" . '<changefreq>daily</changefreq>' .
            "\n\t\t" . '<priority>1.0</priority>' .
            "\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] . 'T' . $postdate[1] . $tempo . '</lastmod>' .
                "\n\t\t" . '<changefreq>Weekly</changefreq>' .
                "\n\t\t" . '<priority>0.5</priority>' .
                "\n\t" . '</url>' . "\n";
        }
        $sitemap .= '</urlset>';
        $fp = fopen( ABSPATH . "sitemap.xml", 'w' );
        fwrite( $fp, $sitemap );
        fclose( $fp );
    }
    
    • 0
  4. Я не знаю, работает ли это на мультисайтах, но для меня это работает идеально в одной установке WordPress.

    Когда вы создаете/обновляете какие-либо сообщения или страницы, он создает файл sitemap.xml и обновляет ссылки (URL-адреса) самыми последними (последними измененными).

    Скопируйте и вставьте приведенный ниже код в файл functions.php вашей активной темы:

    /* function to create sitemap.xml file in root directory of site  */        
    // add_action("publish_post", "eg_create_sitemap");
    // add_action("publish_page", "eg_create_sitemap");  
    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";    
        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 );
    }
    
    • 0
  5. Я немного изменил код @locutor-antonio-cezar, так как искал очень специфический вариант использования. Мне нужна была карта сайта, специально написанная для Новостей Google. Что отличается? Вся разметка следует правилам. В моем конкретном случае я ограничил количество постов до 20. Также пропадают посты старше 2 дней. Может кому нужно это:

    /* function to create sitemap.xml file in root directory of site  */
    // add_action("publish_post", "eg_create_sitemap");
    // add_action("publish_page", "eg_create_sitemap");
    add_action( "save_post", "eg_create_sitemap" );
    function eg_create_sitemap() {
        if ( str_replace( '-', '', get_option( 'gmt_offset' ) ) < 10 ) { 
            $tempo = '-0' . str_replace( '-', '', get_option( 'gmt_offset' ) ); 
        } else { 
            $tempo = get_option( 'gmt_offset' ); 
        }
        if( strlen( $tempo ) == 3 ) { $tempo = $tempo . ':00'; }
        $postsForSitemap = get_posts( array(
            'numberposts' => 20,
            'orderby'     => 'modified',
            'post_type'   => array( 'post', 'page' ),
            'order'       => 'DESC',
            'date_query' => array(
                'after' => date('Y-m-d', strtotime('-2 days')) 
            )
        ) );
        $sitemap .= '<?xml version="1.0" encoding="UTF-8"?>';
        $sitemap .= "\n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">' . "\n";
        foreach( $postsForSitemap as $post ) {
            setup_postdata( $post);
            $postdate = explode( " ", $post->post_modified );
            $sitemap .= "\t" . "<url>" . "\n";
            $sitemap .= "\t\t" . "<loc>" . get_permalink( $post->ID ) . '</loc>';
            $sitemap .= "\t\t" . '<news:news>' . "\n";
            $sitemap .= "\t\t\t" . '<news:publication>' . "\n";
            $sitemap .= "\t\t\t\t" . '<news:name><![CDATA[ YOUR SITE ]]></news:name>' . "\n";
            $sitemap .= "\t\t\t\t" . '<news:language>YOUR LANGUAGE</news:language>' . "\n";
            $sitemap .= "\t\t\t" . '</news:publication>' . "\n";
            $sitemap .= "\t\t\t<news:publication_date>" . $postdate[0] . 'T' . $postdate[1] . $tempo . "</news:publication_date>\n";
            $sitemap .= "\t\t\t" . '<news:title><![CDATA[' . get_the_title( $post) . ']]></news:title>' . "\n";
            $sitemap .= "\t\t" . '</news:news>' . "\n";
            $sitemap .= "\t" . '</url>' . "\n";
        }
        $sitemap .= '</urlset>';
        $fp = fopen( ABSPATH . "sitemap_news.xml", 'w' );
        fwrite( $fp, $sitemap );
        fclose( $fp );
    }
    
    • 0

Оставить ответ

You must login to add an answer.