ADD_FEED重写覆盖标准固定链接

时间:2019-10-30 作者:majick

通过执行以下简单操作:

add_feed( \'schedule\', \'my_schedule_feed\' );
我已在创建了一个提要/feed/schedule/... 容易的

但当我去/schedule/ (这是一个页面)它现在正在显示提要!

看看重写规则,我看到了:

[feed/(feed|rdf|rss|rss2|atom|schedule)/?$] => index.php?&feed=$matches[1]
[(feed|rdf|rss|rss2|atom|schedule)/?$] => index.php?&feed=$matches[1]
这似乎真的很奇怪。为什么WordPress会用提要覆盖现有的页面规则,而不是只使用/feed/ 是否按预期基准?

Update: 我已经按照this answer, 和刷新永久链接,但虽然它显示在重写中,但在/feed/schedule/

function add_feed_rewrites( $wp_rewrite ) {
    $feednames = array( \'schedule\', \'calendar\' );
    $feeds = implode( \'|\', $feednames);
    $feed_rule = array(
        \'feed/(\' . $feeds . \')/?$\' => \'index.php?&feed=$matches[1]\'
    );
    $wp_rewrite->rules = array_merge( $wp_rewrite->rules, $feed_rule );    
}
add_filter( \'generate_rewrite_rules\', \'add_feed_rewrites\' );

add_action( \'do_feed_schedule\', \'my_schedule\', 10, 2 );
add_action( \'do_feed_calendar\', \'my_calendar\', 10, 2 );
关于如何在没有最初冲突的情况下实现这一点,有什么想法吗?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

如果您不想使用add_feed(), 然后您可以使用add_rewrite_rule():

add_action( \'init\', function () {
    add_rewrite_rule(
        \'^feed/(schedule|calendar)/?$\',
        \'index.php?feed=$matches[1]\',
        \'top\'
    );
} );

add_action( \'do_feed_schedule\', function () {
    header( \'Content-Type: text/plain\' ); // dummy type just for testing
    echo \'Yay, it works!\';
} );

但是关于最初的问题add_feed()..

为什么WordPress会用提要覆盖现有的页面规则,而不是只使用/feed/ 是否按预期基准?

因此example.com/schedule 将为您的自定义提要提供服务,就像标准提要URL一样,例如example.com/feed. 但WordPress确实创建了(适当的)规则feed/ 自定义源URL的基础,如example.com/feed/schedule.

因此,您不应该使用schedule 作为页面的一部分,或者如果您有/需要,那么您可以更改提要重写,以便example.com/schedule 将提供页面而不是提要:

如果您知道确切的规则/正则表达式:

add_filter( \'rewrite_rules_array\', function ( $rules ) {
    $rules2 = [];
    foreach ( $rules as $regex => $query ) {
        if ( \'(feed|rdf|rss|rss2|atom|schedule)/?$\' === $regex ) { // it has \'schedule\'
            $rules2[\'(feed|rdf|rss|rss2|atom)/?$\'] = $query;       // so let\'s remove it
        } else {
            $rules2[ $regex ] = $query;
        }
    }
    return $rules2;
} );

add_filter( \'rewrite_rules_array\', function ( $rules ) {
    global $wp_rewrite;

    $feeds = $wp_rewrite->feeds;         // original feeds
    $pages = [ \'schedule\', \'calendar\' ]; // page slugs list
    $feeds2 = array_diff( $feeds, $pages );

    $rules2 = [];
    $feeds = implode( \'|\', $feeds );
    $feeds2 = implode( \'|\', $feeds2 );

    foreach ( $rules as $regex => $query ) {
        if ( \'(\' . $feeds . \')/?$\' === $regex ) {
            $rules2[ \'(\' . $feeds2 . \')/?$\' ] = $query;
        } else {
            $rules2[ $regex ] = $query;
        }
    }

    return $rules2;
} );
foreach 使规则保持在原来的位置。另一种可能的选择是,只需将规则移动到页面重写规则之后的位置。但我还没有尝试过,上面的代码应该足以作为一种解决方法。。

如果我没弄错的话,下面是WordPress用来生成规则的代码,该规则在上述函数中被修改:

// Create query for /(feed|atom|rss|rss2|rdf) (see comment near creation of $feedregex).
$feedmatch2 = $match . $feedregex2;
$feedquery2 = $feedindex . \'?\' . $query . \'&feed=\' . $this->preg_index( $num_toks + 1 );
请参见source on Trac.

相关推荐

有没有办法更改和隐藏RSS Feed固定链接?

现在我的RSS提要位于/Feed/。它重定向到Feedburner fine。我要做的是将/feed/链接更改为只有我知道可以直接与Feedburner共享的内容。1-我仍然需要一个RSS提要。2-我需要更改其永久链接。这可能吗?