web-dev-qa-db-ja.com

特定のカスタム投稿タイプのフィードを無効にする

特定のカスタム投稿タイプのフィードを削除したいです。最も推奨される方法はきれいではありません。 $args->feedsというオプションがあるようですが、これはregister_post_type()関数内では機能しません。

 register_post_type(
  ...
   'rewrite' => array('slug' => 'slug/%term&', 
                      'with_front' => false,
                      'feeds' => false), // Remove feed rewrite-rules?
  ...
 );

出典:1324行目 - /wp-includes/post.php(Wordpress 3.5

私は$wp_rewrite->rules内のルール生成を無効にするための解決策を探しています。

2
mate64

WordPressソースのregister_post_type()関数を見ると、WordPressはisset()の代わりにempty()を使ってフィード引数をチェックしているようです。つまり、false値はtrueを返します。これを修正するには、'feeds' => nullを設定してからSettings> Permalinksから書き換えルールをフラッシュします(奇妙な風変わりな作業を過ぎるために2回行うことを忘れないでください)。

別の方法として、他のページ(フィードを含む)をロードする前にシャットダウンすることもできます。

do_action('wp','kill_feeds',-1);
function kill_feeds(){
    if ( is_feed( array('post','my-custom-type') ) ) {
        exit;
    }
}

これがすべきことは、現在のリクエストが(あなたが指定した特定の投稿タイプの)フィードであるかどうかを検出し、そうであればそれ以上の出力を停止することです。

あなたが本当に夢中になりたい場合は、代わりにあなたのサイトに404ページにリダイレクトすることができます。 :-)

最後に、これらすべてに失敗した場合は、書き換え規則を手動で変更できます。 rewrite_rules_array フィルタは全体の書き換えルール配列を公開しています。適用可能なフィードルールあなたの投稿が 'foo'だったとすると、これは次のようになります。

add_filter('rewrite_rules_array', 'kill_feed_rewrites');
function kill_feed_rewrites($rules){
    foreach ($rules as $rule => $rewrite) {
        if ( preg_match('/^foo.*(feed)/',$rule) ) {
            unset($rules[$rule]);
        }
    }
    return $rules;
}

フィード参照、ルール自体は次のようになります。

'foo/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => string 'index.php?attachment=$matches[1]&feed=$matches[2]'
3
Matt van Andel