web-dev-qa-db-fra.com

Désactiver uniquement le flux principal?

Il est possible de rendre un site totalement inaccessible via des flux (RSS, Atom, RDF) avec une fonction comme celle-ci:

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

Mais cela désactive les flux pour l’ensemble du site, c’est-à-dire le flux principal, les flux de catégories, les balises, les commentaires, les publications, les pages, les types de publication personnalisés, etc.

Comment désactiver uniquement le fil principal et le fil principal de le site? c'est-à-dire que rendre site.com/feed/ et site.com/comments/feed/ inaccessibles.

Cacher simplement le fil en utilisant quelque chose comme ceci (ci-dessous) n'est pas une option:

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

Des recherches non scientifiques très très rapides suggèrent qu’il n’ya qu’un seul query_var défini pour l’alimentation principale. Les autres flux tels que les catégories, les balises et les auteurs ont plusieurs query_var. Ainsi, ce qui suit devrait tuer le flux principal mais laisser les autres intacts.

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

Pour supprimer le flux de commentaires principal, vous avez besoin d'une petite modification pour vérifier la présence de $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
);

Soyez averti: À peine testé. Peut-être un buggy. Caveat emptor . Pas de remboursement.

3
s_ha_dum

Ceci est une version modifiée de @ s_ha_dum réponse.

Je suis d'accord avec lui pour dire que, dans le flux principal, la seule variable configurée est 'feed' (pour les flux de messages) et 'withcomments' pour le flux de commentaires principal, mais au lieu de s'appuyer sur les variables d'objet de requête actuelles et filtrer les nombreuses valeurs par défaut vides à l'aide de array_filter, je pense que - probablement - est plus fiable si on regarde $wp->query_vars: un tableau contenant uniquement les variables de la requête effectivement utilisées pour exécuter la requête:

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

La vérification de is_comment_feed() est en fait inutile, car lorsque dans le flux de commentaires principal is_feed() est true, mais je pense que cela rend le code plus clair , probablement aussi une preuve pour le futur, et enfin ne fait pas mal ...

Contrairement à d’autres réponses ici, cela (devrait) fonctionner avec n’importe quelle structure de permalien et aussi si de jolis permaliens sont désactivés.

2
gmazzap
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;
}
2
sam

en utilisant les règles de réécriture, vous pouvez désactiver un modèle d’URL qui correspond au flux principal.

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

Le rappel de hook doit vérifier s'il s'agit d'un flux de balises, ou d'un flux de catégorie ou éventuellement d'un flux d'auteur. Vous pouvez obtenir beaucoup d'informations sur le flux en cours de production si vous ajoutez ces deux lignes dans le rappel. c'est-à-dire itsme_disable_feed () {...}

global $wp_query;
die(print_r($wp_query->query_vars));

Vous remarquerez que pour un fil d'étiquettes, un fil de catégorie ou un fil de commentaires ou même pour un fil d'auteur, certains paramètres contiennent des valeurs. Faites juste une vérification pour que si ces paramètres ont une valeur associée, vous ne ferez rien. Et si non, ce qui signifie que c'est un flux principal, vous appellerez die ().

J'espère que ça aide.

0
Hasin Hayder