¿Deshabilitar solo la fuente principal?

2

Es posible hacer que un sitio sea totalmente inaccesible a través de feeds (RSS, Atom, RDF) con una función como esta:

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

Pero eso deshabilita las fuentes para todo el sitio, es decir, la fuente principal, las fuentes de categorías, etiquetas, comentarios, publicaciones, páginas, tipos de publicaciones personalizadas, etc.

¿Cómo deshabilito solo el feed principal y el main feed de comentarios del sitio? es decir, solo hacer que site.com/feed/ y site.com/comments/feed/ sean inaccesibles.

Simplemente ocultar un feed usando algo como esto (a continuación) no es una opción:

remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );
    
pregunta its_me 19.10.2013 - 19:06

5 respuestas

3

Una investigación no científica muy, muy rápida sugiere que solo hay un query_var establecido para la alimentación principal. Otras fuentes como categoría, etiqueta, fuente de autor tienen más de un query_var . Por lo tanto, lo siguiente debería matar la alimentación principal, pero dejar a otros intactos.

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

Para eliminar la fuente principal de comentarios, necesita una pequeña edición para verificar la presencia 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
);

Tenga cuidado: Apenas probado. Posiblemente buggy. Caveat emptor . No hay reembolsos.

    
respondido por el s_ha_dum 19.10.2013 - 21:12
2

Esta es una versión modificada de la respuesta de @s_ha_dum

Estoy de acuerdo con él en que cuando en la fuente principal la única variable establecida es 'feed' (para la fuente de publicaciones) y 'withcomments' para la fuente principal de comentarios, pero en lugar de depender de las variables de objeto de consulta actuales, filtre las muchas los valores predeterminados vacíos que usan array_filter , creo que - probablemente - es más confiable al ver $wp->query_vars : una matriz que contiene solo las variables de consulta utilizadas efectivamente para ejecutar la consulta:

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

El cheque para is_comment_feed() es en realidad innecesario, porque cuando en el feed principal de comentarios is_feed() es true , pero creo que hace más claras las intenciones del código , probablemente también sea más una prueba de futuro. , y finalmente no duele ...

A diferencia de otras respuestas, aquí (debería) funciona con cualquier estructura de enlace permanente y también si todos los enlaces permanentes están deshabilitados.

    
respondido por el gmazzap 22.10.2013 - 06:01
2
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;
}
    
respondido por el sam 29.10.2013 - 19:59
1

Al usar reglas de reescritura, puedes desactivar un patrón de URL que coincida con la fuente 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;
}
    
respondido por el Butuzov 21.10.2013 - 21:43
0

La devolución de llamada del gancho debe comprobar si se trata de un feed de etiquetas, o si se trata de un feed de categoría o puede ser si se trata de un feed de autor. Puede obtener mucha información sobre la fuente que se está produciendo si agrega estas dos líneas en la devolución de llamada. es decir, funciona itsme_disable_feed () {...}

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

Observará que para un feed de etiquetas, un feed de categoría o un feed de comentarios o incluso para un feed de autor hay ciertos parámetros que contienen valores. Simplemente haga una comprobación para que, si esos parámetros tienen algún valor asociado, no hará nada. Y si no, lo que significa que es una fuente principal, llamará die ().

Espero que ayude.

    
respondido por el Hasin Hayder 26.10.2013 - 20:03

Lea otras preguntas en las etiquetas