Получение дочерних категорий, связанных с продуктами 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
Заранее благодарю вас за спасение моего жизнь.
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();