如果您不想使用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.