web-dev-qa-db-de.com

Überprüfen Sie, ob sich ein Beitrag in einer untergeordneten Kategorie einer übergeordneten Kategorie befindet

In einer Site, die ich entwickle, habe ich die folgende Kategoriestruktur:

* movies (parent)
    * thriller (child)
    * comedy (child)
    * drama (child)

Der aktuelle Beitrag befindet sich in der Kategorie Comedy . Die Funktion has_term mit den folgenden Parametern gibt true zurück:

has_term( 'comedy', 'category' )

Dieselbe Funktion mit den folgenden Parametern gibt jedoch false zurück:

has_term( 'movies', 'category' )

Meine Frage ist, gibt es eine Kernfunktion, um zu überprüfen, ob der aktuelle Beitrag in einer Kindkategorie einer bestimmten Elternkategorie ist? Wenn nicht, wie kann ich das überprüfen?

Danke im Voraus

6
leemon

Füge Folgendes zur functions.php deines Themas hinzu:

/**
 * Tests if any of a post's assigned categories are descendants of target categories
 *
 * @param int|array $cats The target categories. Integer ID or array of integer IDs
 * @param int|object $_post The post. Omit to test the current post in the Loop or main query
 * @return bool True if at least 1 of the post's categories is a descendant of any of the target categories
 * @see get_term_by() You can get a category by name or slug, then pass ID to this function
 * @uses get_term_children() Passes $cats
 * @uses in_category() Passes $_post (can be empty)
 * @version 2.7
 * @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
 */
if ( ! function_exists( 'post_is_in_descendant_category' ) ) {
    function post_is_in_descendant_category( $cats, $_post = null ) {
        foreach ( (array) $cats as $cat ) {
            // get_term_children() accepts integer ID only
            $descendants = get_term_children( (int) $cat, 'category' );
            if ( $descendants && in_category( $descendants, $_post ) )
                return true;
        }
        return false;
    }
}

Verwenden Sie die Funktion, um die ID der übergeordneten Kategorie zu überprüfen, nicht den Namen oder den Slug. Das heißt Wenn die Kategorie-ID "Filme" 50 ist:

if ( post_is_in_descendant_category( 50 ) ) {
    // do something
}

Wenn Sie die Kategorie-ID "Filme" nicht kennen, können Sie die ID mit get_term_by () abrufen und an post_is_in_descendant_category () übergeben:

$category_to_check = get_term_by( 'name', 'movies', 'category' );

if ( post_is_in_descendant_category( $category_to_check->term_id ) ) {
    // do something
}
13
Gabriel