web-dev-qa-db-ja.com

投稿が親カテゴリのいずれかの子カテゴリにあるかどうかを確認します

私が開発しているサイトでは、私は次のカテゴリ構造を持っています:

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

現在の投稿は コメディー カテゴリーにあります。以下のパラメータを指定した has_term 関数は、trueを返します。

has_term( 'comedy', 'category' )

ただし、次のパラメータを指定した同じ関数はfalseを返します。

has_term( 'movies', 'category' )

私の質問は、現在の投稿が特定の親カテゴリのいずれかの子カテゴリにあるかどうかを確認するためのコア機能はありますかそうでない場合、どうすればこれを確認できますか?

前もって感謝します

6
leemon

テーマのfunctions.phpに以下を追加してください。

/**
 * 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;
    }
}

この関数を使用して、名前やスラッグではなく、親カテゴリIDを確認します。すなわち「映画」カテゴリIDが50の場合:

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

映画のカテゴリIDがわからない場合は、get_term_by()を使用してIDを取得し、それをpost_is_in_descendant_category()に渡すことができます。

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

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