Как полностью удалить RSS-ленты в WordPress?
Я хочу полностью удалить RSS-ленты из WordPress. Использую эту небольшую функцию с http://wpengineer.com/287/disable-wordpress-feed/:
/**
* Отключение RSS-ленты
*/
function fb_disable_feed() {
wp_die( __('Лента недоступна, пожалуйста, посетите наш <a href="'. get_bloginfo('url') .'">сайт</a>!') );
}
add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);
Но остаётся множество транзиентных опций, таких как _transient_feed_mod
или _transient_timeout_feed_mod
.
Как можно полностью удалить RSS-ленты из WordPress?

Первый шаг: удалите ссылки на фиды из раздела <head>
вашего сайта.
<?php
add_action( 'wp_head', 'wpse33072_wp_head', 1 );
/**
* Удаление ссылок на фиды из wp_head
*/
function wpse33072_wp_head()
{
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
}
Далее удалим конечные точки фидов в WordPress. Подключаемся к хуку init
, глобализируем $wp_rewrite
, затем устанавливаем фиды в пустой массив. Это фактически останавливает WordPress от добавления правил перезаписи для фидов. Это довольно хакерский способ и, вероятно, перестанет работать в будущих версиях.
<?php
add_action( 'init', 'wpse33072_kill_feed_endpoint', 99 );
/**
* Удаление конечной точки `feed`
*/
function wpse33072_kill_feed_endpoint()
{
// Это очень хрупкое решение.
// $wp_rewrite->feeds сейчас публичное свойство, но в будущих версиях WP
// это может измениться
global $wp_rewrite;
$wp_rewrite->feeds = array();
}
Но если это перестанет работать, это не страшно, потому что мы перенаправим фиды на главную страницу.
<?php
foreach( array( 'rdf', 'rss', 'rss2', 'atom' ) as $feed )
{
add_action( 'do_feed_' . $feed, 'wpse33072_remove_feeds', 1 );
}
unset( $feed );
/**
* Предотвращает выполнение действий на фидах при вызове функции `do_feed`
*/
function wpse33072_remove_feeds()
{
// перенаправляем фиды! не просто отключаем их
wp_redirect( home_url(), 302 );
exit();
}
И последний шаг: хук активации для установки пустого массива фидов и сброса правил перезаписи.
<?php
register_activation_hook( __FILE__, 'wpse33072_activation' );
/**
* Хук активации
*/
function wpse33072_activation()
{
wpse33072_kill_feed_endpoint();
flush_rewrite_rules();
}
Все это в виде плагина.

Полезная штука. Спасибо! Я добавил несколько фидов в ваш массив. Я знаю, что есть эти два для комментариев: 'do_feed_rss2_comments', 'do_feed_atom_comments'. Я считаю, что вам также нужен 'do_feed'. Я обновил вот так: add_action( 'do_feed' . ($feed ? '_' . $feed : ''), 'wpse33072_remove_feeds', 1 );
и массив: array('', 'rdf', 'rss', 'rss2', 'atom', 'rss2_comments', 'atom_comments')
.

Код, который вы опубликовали, будет делать именно то, что в нем сказано - предотвращать доступ к вашему сайту через RSS-ленту.
Однако остается множество временных опций, таких как
_transient_feed_mod
или_transient_timeout_feed_mod
Эти временные опции вообще не связаны с лентой вашего сайта. Панель управления WordPress использует несколько лент по умолчанию и отображает их в виджетах на админ-панели. Установленные плагины могут добавлять свои собственные ленты, например для отображения новостей или обновлений.
Эти временные значения используются WordPress для определения момента обновления этих используемых лент.
Как я могу полностью удалить ленты из WordPress?
Опубликованный вами код уже...

Это должно сработать
/*отключение rss*/
remove_action('wp_head', 'feed_links', 2 );
add_filter('post_comments_feed_link','bfr_disable_comments_feeds');
function bfr_disable_comments_feeds() {
return null;
}
Ещё лучше, если у вас PHP 5.3 или выше, можно использовать более короткую версию:
/*отключение rss, PHP 5.3+ */
remove_action('wp_head', 'feed_links', 2 );
add_filter('post_comments_feed_link',function () { return null;});
Удаление правил перезаписи, с другой стороны, займет гораздо больше времени, поэтому, если вы не помешаны на производительности, можно оставить их как есть.
