web-dev-qa-db-ja.com

WooCommerce製品関連の子カテゴリを取得する

私は簡単なことのように思われるものに完全に立ち往生しています。私があなたを助けてくれることを願っています。

各WooCommerce商品は、1つの「自動車ブランド」の子供と1つの「親車」の「自動車モデル」の子カテゴリに追加されます(ID 27)。

- MAKE
-- CAR BRAND
--- CAR MODEL
--- CAR MODEL
--- CAR MODEL
-- CAR BRAND (selected)
--- CAR MODEL
--- CAR MODEL
--- CAR MODEL (selected)

管理者からのカテゴリー選択のスクリーンショット

これらのカテゴリを製品ページで階層的に取得してフロントエンドに表示するにはどうすればよいですか。

MAKE: CAR BRAND
MODEL: CAR MODEL

私の命を救ってくれてありがとう。

1
ignaty

タイミングが乱雑になった場合やタイヤを完全にパンクした場合は逆効果になります。トマトや自転車が 1967 Ford Mustang Shelby GT500 のようにラベル付けされているか、あるいはmakeはMustang Shelby GT500そしてモデルフォード、そして我々はそれを望んでいないでしょう。

それで、上記のようなばかげたことを避けるためにここで計画を見てみましょう

  • 投稿に割り当てられた用語を取得する(car

  • すべての用語の最上位レベルの用語がMakeであるかどうかを判断します。これは、あらゆる目的のために27のIDを持つ用語になります。

  • 投稿用語が階層のどの部分に収まるか、つまり、子供という用語か子供用語かを判断する必要があります。他の深いレベルを避けるために、私たちは子供と孫だけに焦点を当てます。

  • それが確実になったら

    • 与えられた投稿用語のトップレベルの親は27です。

    • その用語は子供や孫であること

    それから私達はあなたの必要性に従って私達の言葉を出力してもいいです

これをどのように行うかを見てみましょう。(注:コードは完全にテストされていないため、少なくともPHP 5.4。理解しやすくするために、すべてのコードにコメントを付けています

あなたが最初に理解する必要があるでしょう、ポスト(またはcar)はただ1人の子供と1人の孫の用語を持つことができます。それ以上ある場合は、最後の子と孫が使用されます

function get_car_info( $taxonomy = 'product_cat', $top_level_parent = 27 )
{
    // Make sure that we have a valid taxonomy before we start. If not, return false
    $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
    if ( !taxonomy_exists( $taxonomy ) )
        return false;

    // Make sure our $top_level_parent is 27, if not, validate int value
    if ( 27 !== $top_level_parent )
        $top_level_parent = filter_var( $top_level_parent, FILTER_VALIDATE_INT );

    // Now that everything is safe and sanitized/validated, lets get the current post
    global $post;

    // Now we need to get the terms attached to the post (or car)
    $terms = get_the_terms( $post->ID, $taxonomy );
    /**
     * Make sure we actually have terms, if not, return false
     * Just a note, we already made sure the taxonomy is valid, so $terms should never
     * return a WP_Error object
     */
    if ( !$terms )
        return false;

    // Great, we have terms, now the real work starts
    // Set our variables which will store our brand and model
    $brand = '';
    $model = '';

    // We need to loop through the array of terms ...
    foreach ( $terms as $term ) {
        // ...check if the term is not top level, if so, skip the term
        if ( 0 == $term->parent )
            continue;

        /**
         * Check if the term parent is equal to $top_level_parent, if so, the term is
         * a direct child term, which mean it is the brand, so lets set $brand
         */
        if ( $term->parent == $top_level_parent ) {
            $brand = $term->name; // Adjust as needed, this output the name
            continue; // Lets move on and avoid any unnecessary work
        }

        /**
         * We have reached this point, so our term is not a top level parent or a 
         * direct child from the top level term. This term is a grandchild or even a 
         * lower level child. We now need to know where in the hierarchy this term fits in
         */
        $term_ancestor = get_ancestors( $term->term_id, $taxonomy );
        // Make sure this is a true grandchild, $term_ancestor should only have two values
        if ( 2 != count( $term_ancestor ) )
            continue;

        /**
         * Now that we know the term is a true grandchild, we need to make sure that it
         * is a true grandchild, we actually make sure that it is a grandchild to  $top_level_parent
         */
        if ( $top_level_parent != end( $term_ancestor ) )
            continue;

        /**
         * OK, we have reached the end here, the term is true grandchild of $top_level_parent,
         * so lets set $model
         */
        $model = $term->name;
    } // endforeach $terms

    /**
     * We are nearly done, make sure that we actually have values in $model and $brand
     * before we return any values to avoid silly output
     */
    if (    !$brand
         || !$model
    )
        return false;

    // YEAH!!! We are finally here, lets return our output
    return 'MAKE: ' . $brand . '</br>MODEL: ' . $model;
} 

使い方を見る前に、いくつか注意しておきますが、関数に2つのパラメータを設定しました。

  • 最初は$taxonomyで、これはデフォルトのwoocommerce分類法に設定されていますproduct_cat

  • そして2番目のパラメータ$top_level_parentは27に設定されています。

これは関数を動的にするためです。分類法や用語の親が将来変更される場合は、関数を変更せずに単純に新しい値を関数に渡すことができます。

あなたはまたあなたの正確な必要性を満たすために追加のマークアップ等を加えるべきであり、あるいは既存のコードを修正さえすべきです。

最後に、次のをループの内側に追加して車のモデルとブランドを表示することができます。また、投稿がトマトや自転車の場合は何も追加できません。

echo get_car_info();
0
Pieter Goosen