web-dev-qa-db-fra.com

Désactiver les flux pour des types de publication personnalisés spécifiques

Je souhaite supprimer les flux pour des types de publication personnalisés spécifiques. La plupart des méthodes recommandées ne sont pas propres. Il semble y avoir une option appelée $args->feeds mais cela ne fonctionne pas dans la fonction register_post_type().

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

Source: Ligne 1324 - /wp-includes/post.php (Wordpress 3.5)

Je cherche une solution pour désactiver la génération de règles dans $wp_rewrite->rules.

2
mate64

En regardant la fonction register_post_type() dans le source WordPress, il apparaît que WordPress utilise isset() pour vérifier les flux arg au lieu de empty(), ce qui signifie qu'une valeur false retournera true. Pour résoudre ce problème, vous pouvez essayer de définir 'feeds' => null, puis de vider vos règles de réécriture dans Paramètres> Permaliens (n'oubliez pas de le faire DEUX FOIS pour éviter une bizarrerie bizarre).

Alternativement, vous pouvez fermer n'importe quelle autre page (y compris les flux) avant qu'elle ait une chance de charger ...

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

Cela devrait permettre de détecter si la demande en cours est un flux (des types de publication spécifiques que vous spécifiez) et, le cas échéant, d’arrêter toute sortie ultérieure.

Si vous voulez devenir vraiment fou, vous pouvez rediriger vers la page 404 de vos sites. :-)

Enfin, à défaut de tout cela, vous pourriez modifier vos règles de réécriture manuellement. Le filtre rewrite_rules_array expose le tableauentier/ rewrite et vous pouvez utiliser un peu de magie regex pour supprimer toutes les règles de flux applicables. En supposant que votre message soit "foo", cela pourrait ressembler à ...

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;
}

Référence de flux, les règles elles-mêmes ressemblent à ça ...

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