Получение дочерних категорий, связанных с продуктами WooCommerce


Я полностью застрял на том, что кажется легким делом. Я надеюсь, что вы сможете мне в этом помочь.

Каждый продукт WooCommerce будет добавлен в одну дочернюю категорию "марка автомобиля" и одну дочернюю категорию "модель автомобиля" основного родителя "Марка" (идентификатор 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

Заранее благодарю вас за спасение моего жизнь.

Author: ignaty, 2015-12-08

1 answers

Это может привести к обратным последствиям, если время выйдет из строя или полностью проколет шину, если вы наедете на гвозди, из-за чего ваш автомобиль никуда не поедет. Нам нужно рассмотреть здесь несколько вещей, в противном случае помидор или велосипед можно обозначить как Ford Mustang Shelby GT500 1967 года выпуска, или марка будет Mustang Shelby GT500 и модель Ford, и мы бы этого не хотели.

Итак, давайте рассмотрим план здесь, чтобы избежать глупостей, как указано выше

  • Получить термины, присвоенные должности (автомобиль)

  • Определите, является ли термин верхнего уровня для всех терминов , который для всех целей будет термином с идентификатором 27

  • Нам нужно определить, где термины должности вписываются в иерархию, т. Е. Является ли термин дочерним или дочерним термином. Чтобы избежать каких-либо других более глубоких уровней, мы сосредоточимся только на детях и внуках

  • Как только мы будем уверены, что

    • Тот родитель высшего уровня с любого данного срока службы является 27

    • И что этот термин - ребенок или внук

    Затем мы можем вывести наши условия в соответствии с вашими потребностями

Давайте посмотрим, как мы это сделаем: ( ПРИМЕЧАНИЕ: Код не полностью протестирован и требует, по крайней мере, PHP 5.4. Весь код прокомментирован для удобства понимания)

Сначала вам нужно понять, что у должности ( или автомобиля ) может быть только один ребенок и один срок для внука. Если их будет больше, то будут использованы последний ребенок и внук

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

Всего несколько заметок, прежде чем мы рассмотрим, как ее использовать, я установил два параметра для функции,

  • Первым является $taxonomy, для которого установлена таксономия woocommerce по умолчанию product_cat

  • И второй параметр, называемый $top_level_parent, который имеет значение 27

Это делается для того, чтобы сделать функцию динамичной. Должна ли таксономия или родительский термин измениться в будущем, вы можете просто передать новые значения функции без изменения функции

Вы также должны добавить любую дополнительную разметку и т.д., чтобы удовлетворить ваши конкретные потребности, или даже изменить существующий код

Наконец, вы можете добавить следующее внутри цикла для отображения модели и марки автомобиля или ничего, если сообщение о помидорах или велосипедах

echo get_car_info();
 0
Author: Pieter Goosen, 2015-12-08 18:58:18