it-swarm.com.de

Nur den Haupt-Feed deaktivieren?

Es ist möglich, eine Site über Feeds (RSS, Atom, RDF) mit einer Funktion wie der folgenden vollständig unzugänglich zu machen:

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

Damit werden jedoch Feeds für die gesamte Website deaktiviert, d. H. Für den Haupt-Feed, Feeds für Kategorien, Tags, Kommentare, Beiträge, Seiten, benutzerdefinierte Beitragstypen usw.

Wie deaktiviere ich nur den Hauptfeed und den Hauptkommentarfeed von der Standort? machen Sie nur site.com/feed/ und site.com/comments/feed/ unzugänglich.

Das einfache Ausblenden von Feeds mit so etwas (siehe unten) ist keine Option:

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

Sehr, sehr schnelle unwissenschaftliche Untersuchungen legen nahe, dass nur ein query_var für den Haupt-Feed festgelegt ist. Andere Feeds wie Kategorie-, Tag- und Autoren-Feeds haben mehr als einen query_var. Das Folgende sollte also das Hauptfutter töten, andere aber intakt lassen.

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

Um den Hauptkommentar-Feed zu entfernen, benötigen Sie eine kleine Bearbeitung, um das Vorhandensein von $fvars['withcomments'] zu überprüfen.

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

Seien Sie gewarnt: kaum getestet. Möglicherweise fehlerhaft. Warnung . Keine Rückerstattung.

3
s_ha_dum

Dies ist eine modifizierte Version von @ s_ha_dum .

Ich stimme ihm zu, dass die einzige Variable, die im Haupt-Feed festgelegt wurde, 'feed' (für Posts-Feed) und 'withcomments' für den Hauptkommentar-Feed ist, aber ich denke, anstatt sich auf die aktuellen Abfrageobjektvariablen zu verlassen und die vielen leeren Standardwerte mit array_filter zu filtern dass - wahrscheinlich - bei $wp->query_vars zuverlässiger ist: ein Array, das nur die Abfragevariablen enthält, die effektiv zum Ausführen der Abfrage verwendet werden:

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

Die Prüfung auf is_comment_feed() ist eigentlich unnötig, da is_feed() im Hauptkommentar-Feed true ist, aber ich denke, sie macht die Absichten von Code klarer , ist wahrscheinlich auch zukunftssicherer und macht es schließlich nicht. ' t weh ...

Im Gegensatz zu anderen Antworten hier funktioniert (sollte) es mit jeder Permalink-Struktur und auch, wenn hübsche Permalinks überhaupt deaktiviert sind.

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

mit Umschreiberegeln können Sie ein URL-Muster deaktivieren, das mit dem Haupt-Feed übereinstimmt.

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

Der Hook-Rückruf muss prüfen, ob es sich um einen Tag-Feed handelt, ob es sich um einen Kategorie-Feed handelt oder ob es sich möglicherweise um einen Autoren-Feed handelt. Sie können viele Informationen über den Feed erhalten, der erstellt wird, wenn Sie diese beiden Zeilen in den Rückruf einfügen. die Funktion itsme_disable_feed () {...}

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

Sie werden feststellen, dass es für einen Tag-Feed, einen Kategorie-Feed, einen Kommentar-Feed oder sogar einen Autoren-Feed bestimmte Parameter gibt, die Werte enthalten. Führen Sie einfach eine Überprüfung durch, damit Sie nichts tun, wenn diesen Parametern ein Wert zugeordnet ist. Und wenn nicht, was bedeutet, dass es sich um einen Haupt-Feed handelt, rufen Sie die () auf.

Ich hoffe es hilft.

0
Hasin Hayder