it-swarm.com.de

Schließen Sie Kategorien von Loop, Abfragen, Widgets und der Nachnavigation aus

Ich habe vor kurzem einen Anwendungsfall, bei dem ich verhindern musste, dass eine bestimmte Kategorie im Front-End angezeigt wird. Im Detail musste ich Beiträge ausschließen, die dieser Kategorie zugewiesen waren

  • die Hauptabfrage ("die Schleife")
  • suchanfragen
  • kategorieabfragen
  • abfragen archivieren
  • beitragsnavigation (next/prev_post_link())

und der Kategoriename selbst wird nicht als Element von angezeigt

  • the_category() in Designvorlagen
  • das Categories Widget (Liste und Dropdown)

Infolgedessen befand ich mich ziemlich bald auf einer Suche, deren Ergebnisse ich hier mitteilen und die ich weiterem Feedback aussetzen möchte.

4
glueckpress

Kategorien mit pre_get_posts() ausschließen

Ich fand, dass das Ausschließen einer Kategorie über pre_get_posts() und set_query_var() ohne Widgets gut funktionieren würde. Das Recent Post Widget würde die Kategorie nur ausschließen, wenn stattdessen $query->set() verwendet wird.

<?php
/**
 * Does NOT apply to the Recent Posts widget. 
 */
function glck1403271109_exclude_categories( $query ) {

    $excluded = array( '1', '2' );

    if( ! is_admin() )
        set_query_var( 'category__not_in', $excluded );
}    
add_filter( 'pre_get_posts', 'glck1403271109_exclude_categories' );


/**
 * Does apply to the Recent Posts widget. 
 */
function glck1403271122_exclude_categories( $query ) {

    $excluded = array( '1', '2' );

    if( ! is_admin() )
        $query->set( 'category__not_in', $excluded );
}
add_filter( 'pre_get_posts', 'glck1403271122_exclude_categories' );

Ausschließen von Kategorien aus Abfragen und Widgets

Das Ausschließen von Kategorien aus Abfragen und Widgets hat mich einige Funktionen gekostet, die ich in ein Mini-Plugin integriert habe. Den Code finden Sie in einem Gist hier .

Kategorien von der Beitragsnavigation ausschließen (next/prev_post_link())

next/prev_post_link() und ihre zugrunde liegenden get_ -Funktionen basieren alle auf get_adjacent_post(), die bis heute (WordPress 3.9.1) keinen WP-Query verwendet, sondern eine eigene SQL-Abfrage behebt. Trac Ticket # 26937 soll get_adjacent_post() dazu bringen, WP_Query zu verwenden, aber es kann eine Weile dauern, bis wir da sind.

Das Ausschließen von Kategorien von next/prev_post_link() in meinem Fall konnte ausreichend erreicht werden, indem Kategorie-IDs übergeben wurden, um direkt an die Funktion ausgeschlossen zu werden. Ich bin mir sicher, dass dies auch an einem Plug-in liegen könnte, das direkt mit get_adjacent_post() interagiert. Hier ist meine Einstellung für das Vorlagen-Tag. Die Überprüfung auf glckprss_exclude_categories__category_names() über das zuvor erwähnte Mini-Plugin ist natürlich nur dann sinnvoll, wenn dieses verwendet wird.

<?php
/**
 * Exclude categories from prev/next post links.
 *
 * $exclude  (array) - category slugs to retrieve IDs from
 * $excluded (array) - category IDs to be excluded
 */
$exclude  = array();
$excluded = array();

// Mini plugin active?
if( function_exists( 'glckprss_exclude_categories__category_names' ) ) {

    $exclude = glckprss_exclude_categories__category_names();

else {

    $exclude  = array(
            get_category_by_slug( 'my-category' ),
            get_category_by_slug( 'my-other-category' )
            );
}

// Retrieve IDs
foreach( $exclude as $category ) {

    if( $category )
        $excluded[] = absint( $category->term_id );
}

/* Next Post */
next_post_link( '%link', '%title', false, $excluded );

/* Previous post */
previous_post_link( '%link', '%title', false, $excluded );

Menüs

Für meinen Anwendungsfall war es nicht erforderlich, Kategorien aus Menüs auszuschließen, da ich nur benutzerdefinierte Menüs hatte. Daher habe ich nicht nachgeforscht, in welche Richtung. Ich bin mir ziemlich sicher, dass pre_get_posts() die Menüoptionen in den Griff bekommt, nicht wahr?

Vielen Dank für das Lesen all dies, schätzen Sie alle Kommentare!

4
glueckpress