更新日期:2023-03-15

以往要為 WordPress 提交一個網站地圖給 Google 搜尋,都必須額外安裝一些 sitemap 外掛,或是一些 SEO 外掛也有附帶 sitemap。從版本 5.5 開始,官方新增 sitemap 功能,預設名稱是 wp-sitemap.xml

注意:sitemap需要一個 php 模組 SimpleXML,請檢查一下是否支援。

在官方預設的 Provider 有三種,文章(posts)、分類(taxonomies)和用戶(users)。

基於安全考量,一般先把用戶(users)剔除不加入,所以 $name=’users’。如果不加入文章或分類,就把變數改為 posts 或taxonomies,hook 語法如下:

add_filter( 'wp_sitemaps_add_provider', function( $provider, $name ) { 
    if ( 'users' === $name ) { 
        return false; 
    } 
    return $provider; 
}, 10, 2 );

有時候我們會增加一些 post type 作為特殊用途,而不是做一般文章顯示,但又不想讓它出現在 sitemap,如果用上面的語法 $name=’posts’,會將整個文章通通剔除。這時候可以用下面語法提除單一類型:

add_filter( 'wp_sitemaps_post_types', function( $post_types ) {
    unset( $post_types['my_post_type_name'] );
	return $post_types;
});

同樣,如果要剔除某個分類,可以用 wp_sitemaps_taxonomies

add_filter( 'wp_sitemaps_taxonomies', function( $taxonomies ) {
    unset( $taxonomies['category'] );
    return $taxonomies;
});

 

決定了 Provider 之後,每條相關 index 點進去就能看到該 Provider 的每頁的網址清單,但是目前預設只有顯示「網址」一個欄位,如果要顯示「最後修改」、「變更頻率」、「優先順序」怎麼辦,請看以下語法:

add_filter( 'wp_sitemaps_posts_entry', function( $entry, $post ) {
    $entry['lastmod'] = $post->post_modified_gmt;
    $entry['changefreq'] = 'weekly';
    $entry['priority'] = '0.8';
    return $entry;
}, 10, 2 );

如果不要讓受密碼保護的文章出現:

add_filter( 'wp_sitemaps_posts_query_args', function($args){
    $args['has_password'] = false;
    return $args;
} );

最後如果不想用內建的 sitemap 的話:

add_filter( 'wp_sitemaps_enabled', '__return_false' );