WooCommerce - назначить родительский термин, если установлен дочерний термин - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть настройка WooCommerce, и когда я создаю новый продукт, я назначаю ему категорию продукта как обычно.

Clothing
- Womens
-- Accessories
- Mens
-- Accessories <-- assigned to this term

enter image description here

Что я пытаюсь достичь:
Когда я выбираю дочернюю категорию, я также хочу установить эту запись для каждой родительской категории, расположенной над ней. В этом случае это будет выглядеть следующим образом:

Clothing <-- assigned to this term
- Womens
-- Accessories
- Mens <-- assigned to this term
-- Accessories <-- assigned to this term

enter image description here

Примечание. Большинство моих продуктов создаются из интерфейса другие пользователи, поэтому я не могу просто выбрать другие поля, я знаю, что это вариант.

Моя попытка до сих пор:

function set_product_parent_categories( $post_id ) {

  $term_ids = wp_get_post_terms( $post_id, 'product_cat' );

  foreach( $term_ids as $term_id ) {

    if( $term_id->parent > 0 ) {

      // Assign product to the parent category too.
      wp_set_object_terms( $post_id, $term_id->parent, 'product_cat' );

    }

  }

}
add_action( 'woocommerce_update_product', __NAMESPACE__.'\\set_product_parent_categories', 10, 1 );

Это устанавливает только верхний родительский термин.
enter image description here

1 Ответ

1 голос
/ 27 апреля 2020

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

function set_product_parent_categories( $post_id ) {
    $category = wp_get_post_terms( $post_id, 'product_cat' );
    // If multiple categories are set. Bail Out
    if (count ($category) > 1 ) return;

    $terms = array($category[0]->term_id);
    if ($category[0]->parent > 0){
        $parent = $category[0]->parent;
        while ($parent > 0){
            // Make an array of all term ids up to the parent.
            $terms[] = $parent;
            $grandpa = get_term($parent, 'product_cat');
            $parent = $grandpa->parent;
        }
    }
    // If multiple terms are returned, update the object terms
    if (count($terms) > 1) wp_set_object_terms( $post_id, $terms, 'product_cat' );
}
add_action( 'woocommerce_update_product', 'set_product_parent_categories', 10, 1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...