WordPress默認開啟了feed功能,好處不言而喻,可以方便RSS閱讀器進行訂閱,讓讀者及時收到博客的更新信息。但有些博客基本沒有人訂閱,卻有一堆機器人來采集博客的feed,方便了別人復制你的文章不說,還造成了不必要的資源消耗。
阻止采集feed的方式很多,比如feed中只輸出文章摘要,而不輸出全文,這個在WordPress后臺 - 設置 - 閱讀中就可以設置。但是我出于某些目的,并不完全是為了防采集,不想開放博客的feed功能,該怎么設置呢?
簡單搜索了一下,發現網上都是下面這個方法,直接在主題的functions.php中加入下面的代碼:
function disable_all_feeds() { wp_die( '本站不提供feed' );}add_action('do_feed', 'disable_all_feeds', 1);add_action('do_feed_rdf', 'disable_all_feeds', 1);add_action('do_feed_rss', 'disable_all_feeds', 1);add_action('do_feed_rss2', 'disable_all_feeds', 1);add_action('do_feed_atom', 'disable_all_feeds', 1);
這種方法實現的效果是,當你打開博客的feed地址(如https://laohao.org/feed
)時,頁面會直接顯示設置的錯誤信息,feed代碼已經被刪除,也就是說這個feed地址仍然存在,而不是打開這個鏈接直接顯示404。
代碼版
如何才能徹徹底底地禁用WordPress的feed功能,連渣都不剩呢?我們可以使用下面的代碼:
// 刪除 wp_head 輸入到模板中的feed地址鏈接add_action( 'wp_head', 'wpse33072_wp_head', 1 );function wpse33072_wp_head() { remove_action( 'wp_head', 'feed_links', 2 ); remove_action( 'wp_head', 'feed_links_extra', 3 );}foreach( array( 'rdf', 'rss', 'rss2', 'atom' ) as $feed ) { add_action( 'do_feed_' . $feed, 'wpse33072_remove_feeds', 1 );}unset( $feed );// 當執行 do_feed action 時重定向到首頁function wpse33072_remove_feeds() { wp_redirect( home_url(), 302 ); exit();}// 刪除feed的重定向規則add_action( 'init', 'wpse33072_kill_feed_endpoint', 99 );function wpse33072_kill_feed_endpoint() { global $wp_rewrite; $wp_rewrite->feeds = array(); // 運行一次后,記得刪除下面的代碼 flush_rewrite_rules();}
將以上php代碼放入當前主題的functions.php中,然后登陸進入WordPress后臺,隨便打開一個頁面,然后回來在主題的functions.php中將:flush_rewrite_rules();
這行代碼刪除即可。