it-swarm.com.de

Schließen Sie für jede Schleife die Kategorie nach Slug aus

Ich versuche, einige Kategorien aus einer for-Schleife auszuschließen.

<?php $categories = get_categories(array('exclude' => 'apps, windows')); ?>

<?php foreach ($categories as $category) : ?>
    // the_loop
<?php endforeach; ?>

Auch wenn kein Fehler ausgegeben wird, funktioniert dies nicht: Alle Kategorien werden in der Schleife verwendet. Wie kann ich einige Kategorien per Slug ausschließen?

Ich arbeite mit mehreren Websites, die unterschiedliche Katzenkennungen, aber dieselbe Schnecke haben. Daher muss ich nach Schnecke und nicht nach Katzenkennung filtern.


Für zukünftige Leser: Pieter Goosen beantwortete diese und eine weitere Frage in einer zusammengefassten Antwort hier .

2
Bram Vanroy

Wie ich bereits sagte, direkt aus dem Kodex

ausschließen

(string) Schließt eine oder mehrere Kategorien aus der von wp_list_categories generierten Liste aus. Dieser Parameter verwendet eine durch Kommas getrennte Liste von Kategorien nach eindeutiger ID in aufsteigender Reihenfolge

Wie Sie angegeben haben, müssen Sie die Kategorie Schnecke verwenden. Um dies möglich und dynamisch zu machen, ist es meines Erachtens am besten, eine eigene Wrapper-Funktion zu schreiben, um dies zu erreichen. Wir werden get_terms() (das von get_categories() intern verwendet wird) verwenden, um unsere Kategorien abzurufen, und get_term_by() , um die Kategorie-ID abzurufen, damit wir diese an get_terms() übergeben können.

Hier ist die Funktion, die ich zum besseren Verständnis gut kommentiert habe (Benötigt PHP 5.4+)

function exclude_term_by( $taxonomy = 'category', $args = [], $exclude = [] )
{
    /*
     * If there are no term slugs to exclude or if $exclude is not a valid array, return get_terms
     */
    if ( empty( $exclude ) || !is_array( $exclude ) )
        return get_terms( $taxonomy, $args );

    /*
     * If we reach this point, then we have terms to exclude by slug
     * Simply continue the process. 
     */ 
    foreach ( $exclude as $value ) {

            /*
             * Use get_term_by to get the term ID and add ID's to an array
             */
            $term_objects = get_term_by( 'slug', $value, $taxonomy );
            $term_ids[] = (int) $term_objects->term_id;

    }

    /*
     * Set up the exclude parameter with an array of ids from $term_ids
     */
    $excluded_ids = [
        'exclude' => $term_ids
    ];

    /*
     * Merge the user passed arguments $args with the excluded terms $excluded_ids
     * If any value is passed to $args['exclude'], it will be ignored
     */
    $merged_arguments = array_merge( $args, $excluded_ids );

    /*
     * Lets pass everything to get_terms
     */
    $terms = get_terms( $taxonomy, $merged_arguments ); 

    /*
     * Return the results from get_terms
     */
    return $terms;
}

Bevor ich in den Gebrauch gehe, hier ein paar Hinweise

  • Der erste Parameter, $taxonomy, ist die bestimmte Taxonomie, die an get_terms() innerhalb der Funktion übergeben wird. Der Standardwert ist category.

  • Der zweite Parameter, $args, verwendet dieselben Parameter wie get_terms(). Nur eine Anmerkung, wenn der dritte Parameter gesetzt ist, wird der Standardwert des Parameters exclude ignoriert, wenn ihm etwas übergeben wird. Dieser Wert wird von allem, was an $exclude übergeben wird, überschrieben. Wenn an diesen Parameter nichts und an $exclude nichts übergeben wird, müssen Sie ein leeres Array als Wert übergeben

  • Der dritte Parameter, $excludes, enthält eine Reihe von Term-Slugs, die ausgeschlossen werden sollten. Wenn der Wert kein gültiges Array ist, wird get_terms() zurückgegeben, ohne die erforderlichen Ausdrücke auszuschließen. Übergeben Sie daher unbedingt ein Array von Slugs

  • Behandeln Sie die Ausgabe der Funktion genauso wie get_terms(). Denken Sie daran, dass Sie auch nach leeren Werten und WP_Error -Objekten suchen sollten, bevor Sie den Wert aus der Funktion verwenden

  • Ändern und missbrauchen Sie den Code nach Belieben

Nun zur Verwendung in Ihren Vorlagendateien. Beachten Sie das leere Array, das an den Parameter $args übergeben wird, wenn etwas an den Parameter $exclude übergeben wird

$terms = exclude_term_by( 'category', [], ['term-slug-one', 'term-slug-two'] );
if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
    ?><pre><?php var_dump($terms); ?></pre><?php
}   

Weitere Informationen zur Verwendung finden Sie unter get_terms().

2
Pieter Goosen

In Ihrer ersten Codezeile ist ein kleiner Fehler aufgetreten. Sie sollten 'jede' Kategorie mit Anführungszeichen im Array trennen. Die erste Zeile sollte also lauten:

<?php $categories = get_categories(array('exclude' => 'apps', 'windows')); ?>
0
impsart