Disable only the main feed?

时间:2013-10-19 作者:its_me

可以通过feed(RSS、Atom、RDF)使用以下功能使站点完全不可访问:

function itsme_disable_feed() {
    wp_die( __( \'No feed available, please visit the <a href="\'. esc_url( home_url( \'/\' ) ) .\'">homepage</a>!\' ) );
}
add_action(\'do_feed\', \'itsme_disable_feed\', 1);
add_action(\'do_feed_rdf\', \'itsme_disable_feed\', 1);
add_action(\'do_feed_rss\', \'itsme_disable_feed\', 1);
add_action(\'do_feed_rss2\', \'itsme_disable_feed\', 1);
add_action(\'do_feed_atom\', \'itsme_disable_feed\', 1);
add_action(\'do_feed_rss2_comments\', \'itsme_disable_feed\', 1);
add_action(\'do_feed_atom_comments\', \'itsme_disable_feed\', 1);
但这会禁用整个站点的提要,即主提要、类别提要、标签提要、评论提要、帖子提要、页面提要、自定义帖子类型提要等。

如何仅禁用main feed 以及main comments feed 网站的?i、 e.仅制造site.com/feed/site.com/comments/feed/ 无法接近

简单地使用下面的内容隐藏提要是不可取的:

remove_action( \'wp_head\', \'feed_links_extra\', 3 );
remove_action( \'wp_head\', \'feed_links\', 2 );

5 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

非常非常迅速的非科学研究表明,只有一个query_var 设置为主进给。其他提要(如category、tag、author提要)有多个提要query_var. 因此,以下操作应杀死主进料,但其他进料应完好无损。

add_filter(
  \'pre_get_posts\', 
  function($qry) {
    if ($qry->is_feed()) {
      $fvars = array_filter($qry->query_vars);
      if (1 == count($fvars)) {
        wp_die( __( \'No feed available, please visit the <a href="\'. esc_url( home_url( \'/\' ) ) .\'">homepage</a>!\' ) );
      }
    }
  },
  1
);
要删除主评论提要,需要进行一个小的编辑以检查是否存在$fvars[\'withcomments\'].

add_filter(
  \'pre_get_posts\', 
  function($qry) {
    if ($qry->is_feed() ) {
      $fvars = array_filter($qry->query_vars);
      if (1 == count($fvars) || isset($fvars[\'withcomments\'])) {
        wp_die( __( \'No feed available, please visit the <a href="\'. esc_url( home_url( \'/\' ) ) .\'">homepage</a>!\' ) );
      }
    }
  },
  1
);
Be warned: 几乎未经测试。可能是马车排空警告。不退款。

SO网友:gmazzap

这是的修改版本@s_ha_dum 答复

我同意他的观点,在主提要中设置的唯一变量是\'feed\' (用于POST feed)和\'withcomments\' 对于主注释提要,但不依赖于当前查询对象变量,并使用array_filter, 我认为-,也许-,看起来更可靠$wp->query_vars: 仅包含有效用于运行查询的查询变量的数组:

add_action(\'pre_get_posts\', \'no_main_feeds\', 1);

function no_main_feeds( $q ) {
  if ( is_feed() || is_comment_feed() ) {
    $vars = $GLOBALS[\'wp\']->query_vars;
    unset( $vars[\'feed\'], $vars[\'withcomments\'] );
    if ( empty($vars) ) wp_die( \'No feed available\' );
  }
}
检查is_comment_feed() 实际上是不必要的,因为在主评论提要中is_feed()true, 但我认为它使代码的意图更加明确,可能也更能证明未来,而且最终不会造成伤害。。。

与这里的其他答案不同,它(应该)适用于任何permalink结构,如果禁用了漂亮的permalinks,也可以。

SO网友:sam
add_filter(\'request\', \'itsme_disable_main_feeds\');

function itsme_disable_main_feeds($q)
{
    $exit_msg   = \'No feed available. Please visit the <a href="%s">homepage</a>.\';
    $exit_title = \'No Feed Available\';

    if (    !empty($q[\'feed\'])         && count($q) === 1
         || !empty($q[\'withcomments\']) && count($q) === 2 ) {

        $exit_msg = sprintf($exit_msg, esc_url( home_url(\'/\') ));
        wp_die( $exit_msg, $exit_title, array(\'response\' => 404) );
    }

    return $q;
}
SO网友:Oleg Butuzov

使用重写规则,可以禁用与主提要匹配的url模式。

add_filter(\'rewrite_rules_array\', \'rewrite_rules_array_feed_disable\');
function rewrite_rules_array_feed_disable($rules){
    unset($rules[\'feed/(feed|rdf|rss|rss2|atom)/?$\']);
    unset($rules[\'(feed|rdf|rss|rss2|atom)/?$\']);
    return $rules;
}

SO网友:Hasin Hayder

钩子回调需要检查它是标记提要,还是类别提要,或者可能是作者提要。如果在回调中添加这两行代码,就可以获得有关正在生成的提要的大量信息。i、 e函数itsme\\u disable\\u feed(){…}

global $wp_query;
die(print_r($wp_query->query_vars));
您会注意到,对于标记提要、类别提要、注释提要,甚至对于作者提要,都有一些包含值的参数。只要做一个检查,如果这些参数有任何相关的值,您将什么也不做。如果不是,这意味着它是一个主提要,您将调用die()。

希望有帮助。

结束

相关推荐

由于RSS链接中存在与号,因此HTML验证失败

我使用Wordpress自己的rss。php从外部RSS提要中提取最后10项。Wordpress会自动将活动信息添加到链接中,如下所示:http://domainname.com/postname?utm_source=rss&utm_medium=rss&utm_campaign=postname 由于使用了符号,该页无法验证。我想知道我是否可以在下面的代码中添加任何内容来解决它。<!-- if Blog Feed exists--> <?php $b