Как полностью удалить RSS-ленты в WordPress?

7 нояб. 2011 г., 11:42:38
Просмотры: 19.5K
Голосов: 10

Я хочу полностью удалить 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?

3
Комментарии

и куча переписываний для фидов тоже.. они везде!

Ünsal Korkmaz Ünsal Korkmaz
7 нояб. 2011 г. 11:44:51

любопытно, если вы не против, могу спросить... зачем вам удалять фиды из WordPress?

Nicole Nicole
7 нояб. 2011 г. 16:15:57

зачем мне фиды в WordPress, если я не использую его для блогинга?

Ünsal Korkmaz Ünsal Korkmaz
7 нояб. 2011 г. 19:13:38
Все ответы на вопрос 3
1
18

Первый шаг: удалите ссылки на фиды из раздела <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();
}

Все это в виде плагина.

28 мар. 2012 г. 07:37:44
Комментарии

Полезная штука. Спасибо! Я добавил несколько фидов в ваш массив. Я знаю, что есть эти два для комментариев: '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').

Jake Jake
28 авг. 2013 г. 05:37:23
0

Код, который вы опубликовали, будет делать именно то, что в нем сказано - предотвращать доступ к вашему сайту через RSS-ленту.

Однако остается множество временных опций, таких как _transient_feed_mod или _transient_timeout_feed_mod

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

Эти временные значения используются WordPress для определения момента обновления этих используемых лент.

Как я могу полностью удалить ленты из WordPress?

Опубликованный вами код уже...

27 апр. 2012 г. 18:17:45
1

Это должно сработать

/*отключение 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;});

Удаление правил перезаписи, с другой стороны, займет гораздо больше времени, поэтому, если вы не помешаны на производительности, можно оставить их как есть.

28 мар. 2012 г. 03:41:46
Комментарии

Ещё короче в более свежих версиях WordPress: add_filter('post_comments_feed_link', '__return_false'); но это скрывает только одну ссылку на RSS-ленту комментариев. Пропускает... мягко говоря, очень многое...

Jake Jake
28 авг. 2013 г. 05:30:55