1. 程式人生 > >WordPress免外掛生成完整站點地圖(sitemap.xml)的php程式碼

WordPress免外掛生成完整站點地圖(sitemap.xml)的php程式碼

前言:站點地圖(sitemap.xml)的作用,相信站長們都有所瞭解,我就不獻寶了。而免外掛生成 sitemap.xml,網路上也早就有了純程式碼生成的方法。

一直以來,張戈部落格都是用 DX-SEO 這個很好用的中文 SEO 外掛生成的 sitemap。今天整理電腦檔案時,看到了以前收藏的生成 sitemap.xml 的 php 指令碼,就隨手開啟看了看,發現這個程式碼只能生成主頁和文章頁的 sitemap。果斷百度了一下,發現網上分享的都大同小異,只有首頁和文章頁。感覺有點缺憾,反正今天也是閒著,就動手改造了一番,讓這個程式碼更加完善,可以同時生成首頁、文章、單頁面、分類和標籤的 sitemap!

一、PHP 程式碼

PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 <?phprequire('./wp-blog-header.php');header("Content-type: text/xml");header('HTTP/1.1 200 OK');$posts_to_show=1000;echo'<?xml version="1.0"encoding
="UTF-8"?>';echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">'?><!--generated-on=<?phpechoget_lastpostdate('blog');?>Diy By張戈部落格(http://zhangge.net)--><url><loc><?phpechoget_home_url();?></loc><lastmod><?php$ltime=get_lastpostmodified(GMT);$ltime=gmdate('Y-m-d\TH:i:s+00:00',strtotime($ltime));echo$ltime;?></lastmod><changefreq>daily</changefreq><priority>1.0</priority></url><?php/* 文章頁面 */$myposts=get_posts("numberposts=".$posts_to_show);foreach($mypostsas$post){?><url><loc><?phpthe_permalink();?></loc><lastmod><?phpthe_time('c')?></lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url><?php}/* 文章迴圈結束 */?><?php/* 單頁面 */$mypages=get_pages();if(count($mypages)>0){foreach($mypagesas$page){?><url><loc><?phpechoget_page_link($page->ID);?></loc><lastmod><?phpechostr_replace(" ","T",get_page($page->ID)->post_modified);?>+00:00</lastmod><changefreq>weekly</changefreq><priority>0.6</priority></url><?php}}/* 單頁面迴圈結束 */?><?php/* 部落格分類 */$terms=get_terms('category','orderby=name&hide_empty=0');$count=count($terms);if($count>0){foreach($termsas$term){?><url><loc><?phpechoget_term_link($term,$term->slug);?></loc><changefreq>weekly</changefreq><priority>0.8</priority></url><?php}}/* 分類迴圈結束 */?><?php/* 標籤(可選) */$tags=get_terms("post_tag");foreach($tagsas$key=>$tag){$link=get_term_link(intval($tag->term_id),"post_tag");if(is_wp_error($link))returnfalse;$tags[$key]->link=$link;?><url><loc><?phpecho$link?></loc><changefreq>monthly</changefreq><priority>0.4</priority></url><?php}/* 標籤迴圈結束 */?></urlset>

二、偽靜態

①、Nginx

編輯已存在的 Nginx 偽靜態規則,新增如下規則後(平滑)重啟 nginx 即可:

1 rewrite^/sitemap.xml$/sitemap.php last;

②、Apache

編輯網站根目錄的 .htaccess ,加入如下規則:

Shell
1 RewriteRule^(sitemap)\.xml$$1.php

三、純靜態

此部分內容補充於:2016 年 10 月 24 日程式設計師節

看到很多朋友已經在問這個 sitemap 如何靜態化,加快開啟速度。畢竟每次重新生成絕對是一個耗能大戶,而且還有可能被有心之人拿來作為攻擊入口!

其實,張戈部落格早就已經實現 sitemap.xml 靜態化了,而且在後面的文章中也有提到=>【相關文章

實現方法有多種,比如在 Nginx 的 fastcgi 快取中取消 xml 檔案的快取遮蔽,或者使用張戈部落格最早使用的 php 生成靜態檔案等。

在這裡,我就分享一個自己一直在用的最簡單的實現方法:Linux 定時任務+wget 定時生成 sitemap.xml

具體實現:將 sitemap.php 放到某個不為人知的目錄,然後定時使用 wget 去請求這個檔案,並將資料儲存為 sitemap.xml 存放到網站根目錄就可以了!比如:

Shell
12 #每天在網站根目錄生成一個sitemap.xml diypath為sitemap.php的實際位置01***wget-O/home/wwwroot/zhangge.net/sitemap.xmlhttp://zhangge.net/diypath/sitemap.php>/dev/null2>&1

2017-09-22 補充:如果是啟用了 https 的站點,需要加入 --no-check-certificate  的選項,即:

12 #每天在網站根目錄生成一個sitemap.xml diypath為sitemap.php的實際位置(針對https網站)01***wget-O/home/wwwroot/zhangge.net/sitemap.xml--no-check-certificate https://zhangge.net/diypath/sitemap.php  >/dev/null 2>&1

Ps:使用這個方法,注意 sitemap.php 裡面的 require('./wp-blog-header.php'); 要改成 require('../wp-blog-header.php'); 也就是注意相對位置!

如果實在搞不清楚什麼是相對路徑,那麼就用簡單粗暴的方法:將網站根目錄的 sitemap.php 重新命名為一個只有自己知道的 php 檔案,比如 xml.php,然後如下新增任務:

Shell
12 #每天在網站根目錄生成一個sitemap.xml(xml.php為自己重新命名的php檔名稱)01***wget-O/home/wwwroot/zhangge.net/sitemap.xmlhttp://zhangge.net/xml.php>/dev/null2>&1

這樣一來,就解決了 sitemap.xml 是動態資料問題了!

四、文章最後

①、確認無誤之後,已開通 sitemap 許可權的就可以前往百度站長平臺提交了,沒開通許可權的可以傳送申請郵件到百度站長平臺管理員郵箱申請,並且將 sitemap.xml 使用 a 標籤連結在網站底部即可。

②、程式碼使用很簡單,可以根據需要增減內容,比如覺得標籤不應該出現在 sitemap 裡面的,可以將標籤部分的 php 程式碼刪除即可,但一定要注意不要誤刪除結尾的</urlset>標籤。

③、今天,把分類、單頁面及標籤的 sitemap 都整出來了,那開放適配專用 sitemap 的 php 程式碼也就可以繼續完善下了,回頭有時間我會整理總結一篇關於 sitemap 及開放適配的終結篇,敬請期待!