Получите соответствующую подкатегорию, связанную с текущим продуктом, из родительской категории в WooCommerce - PullRequest
1 голос
/ 14 июля 2020

Это не дублирующийся вопрос, однако, похоже, что форум wordpress.stackexchange молчит по этому поводу ... Надеюсь, кто-то может помочь!

Следующая моя ссылка относится: Получить только соответствующую подкатегорию категории ...

Я занят сайтом c musi. Сценарий следующий:

  1. Песня (продукт WooCommerce), имеет категорию «Рок». Рок является подкатегорией «Жанр».
  2. Категория «Жанр» имеет ряд различных подкатегорий (рок, поп, классика и т. д. c).
  3. Эти категории были настроены при импорте продуктов в WooCommerce, и моя строка «Категории» в исходном импортируемом CSV-файле выглядит следующим образом (I ' m с использованием фиктивных данных для целей разработки):

Genre, Genre > Rock, Artist, Artist > Abigail Jay > Hulking Depend Weigh, Album > Hulking Depend Weigh, Year, Year > 2014

В приведенном выше примере рок является подкатегорией жанра.

со следующим кодом Я получаю все подкатегории, перечисленные в разделе «Жанр»:

global $product;
$terms = get_the_terms($product->get_id(), 'product_cat');
foreach($terms as $term)
{
    if($term->slug == "genre")
    {
        $_id = $term->term_id;
        $_s = $term->slug;
        $_ar = array('parent' => $_id);
        $assoc_categories = get_terms('product_cat', $_ar);
    }
}

Однако это неверно. Что я пытаюсь сделать (и не выигрываю), так это получить соответствующую подкатегорию (например, Rock), связанную с текущим продуктом, через php. Другими словами, мне нужно посмотреть, какая подкатегория жанра связана с продуктом.

Мне, вероятно, не хватает чего-то небольшого, однако это заставляло меня довольно долго работать ... любая помощь будет очень признателен!

РЕДАКТИРОВАТЬ:

Хорошо, я придумал немного обходной способ получить то, что мне нужно, и обновил свой код следующим образом:

global $product;
$terms = get_the_terms($product->get_id(), 'product_cat');
$_x = array();
foreach($terms as $term)
{
    if($term->slug == "genre")
    {
        $_id = $term->term_id;
        $_s = $term->slug;
        $_ar = array('parent' => $_id);
        $assoc_categories = get_terms('product_cat', $_ar);
        
        foreach(get_terms('product_cat', $_ar) as $_gt)
        {
            $genre_dict[] = $_gt->name;
        }
    }
    if(in_array($term->name, $genre_dict))
    {
        echo($term->name);
    }
}

Краткое объяснение вышеизложенного :

  1. Я создаю массив с именем $genre_dict, содержащий все подкатегории, содержащиеся в категории Genre.
  2. Затем я сравниваю $term->name с каждой записью в $genre_dict и, если найдено совпадение, выхожу $term->name.

Есть ли лучший способ достичь того же результата?

1 Ответ

0 голосов
/ 14 июля 2020

Хорошо, я придумал немного обходной способ получить то, что мне нужно, и обновил свой код следующим образом:

global $product;
$terms = get_the_terms($product->get_id(), 'product_cat');
$_x = array();
foreach($terms as $term)
{
    if($term->slug == "genre")
    {
        $_id = $term->term_id;
        $_s = $term->slug;
        $_ar = array('parent' => $_id);
        $assoc_categories = get_terms('product_cat', $_ar);
        
        foreach(get_terms('product_cat', $_ar) as $_gt)
        {
            $genre_dict[] = $_gt->name;
        }
    }
    if(in_array($term->name, $genre_dict))
    {
        echo($term->name);
    }
}

Краткое объяснение вышеизложенного :

  1. Я создаю массив с именем $genre_dict, содержащий все подкатегории, содержащиеся в категории Genre.
  2. Затем я сравниваю $term->name с каждой записью в $genre_dict и если совпадение найдено, я выводю $term->name.

EDIT

Я создал более подробный фрагмент кода, который создает массив, содержащий следующие:

  • Имя исполнителя, ID, Слаг>
    • Название каждого альбома, ID, Слаг, Год, Жанр>
      • Имя каждой песни, ID, Слаг, SKU, ссылка на предварительный просмотр трека
if((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443)
{
    $GLOBALS['base_href'] = 'https://'.$_SERVER['SERVER_NAME'].'/';
}
else
{
    $GLOBALS['base_href'] = 'http://'.$_SERVER['SERVER_NAME'].'/';
} // END OF: if((!empty($_SERVER['HTTPS'...
$main_category = get_queried_object();
$main_category_id = $main_category->term_id;
$main_category_name = $main_category->name;
$main_category_slug = $main_category->slug;
foreach(get_terms('product_cat',  $main_category_id) as $term)
{
    if($term->slug == "genre")
    {
        foreach(get_terms('product_cat', ['parent' => $term->term_id]) as $_gt)
        {
            $genre_dict[] = $_gt->name;
        }
    } // END OF: if($term->slug == "genre"...
    if($term->slug == "year")
    {
        foreach(get_terms('product_cat', ['parent' => $term->term_id]) as $_gt)
        {
            $year_dict[] = $_gt->name;
        }
    } // END OF: if($term->slug == "year"...
} // END OF: foreach(get_terms('product_cat',  $sub_category_id...

$_ARTIST_OBJ = 
[
    'artist_id' => $main_category->term_id,
    'artist_name' => $main_category->name,
    'artist_slug' => $main_category->slug
];
foreach(get_terms('product_cat', ['parent' => $main_category_id]) as $sub_category)
{
    
    $sub_category_id = $sub_category->term_id;
    $sub_category_name = $sub_category->name;
    $sub_category_slug = $sub_category->slug;

    $_ARTIST_OBJ['artist_albums'][$sub_category->slug] = 
    [
        'album_id' => $sub_category->term_id,
        'album_name' => $sub_category->name,
        'album_slug' => $sub_category->slug,
        'album_year' => "",
        'album_genre' => "",
        'album_artwork' => $GLOBALS['base_href'].'wp-content/uploads/album_images/'.$sub_category->slug.'.jpg',
        'album_tracks' => []
    ];

    $product_loop = new WP_Query
    (
        [
            'post_type' => 'product',
            'product_cat' => $sub_category_name,
            'field' => $sub_category_id
        ]
    );
    if($product_loop->have_posts())
    {
        while($product_loop->have_posts())
        {
            $product_loop->the_post();
            global $product;
            $_ARTIST_OBJ['artist_albums'][$sub_category->slug]['album_tracks'][$product->get_slug()] = 
            [
                'track_id' => $product->get_id(),
                'track_name' => $product->get_name(),
                'track_slug' => $product->get_slug(),
                'track_sku' => $product->get_sku(),
                'track_preview' => $GLOBALS['base_href'].'wp-content/uploads/audio/samples/'.strtolower(str_replace(array(" ", "-"), "", $product->get_name().$product->get_sku())).'-sample.mp3'
            ];
            foreach(get_the_terms($product->get_id(), 'product_cat') as $term)
            {
                if(in_array($term->name, $genre_dict))
                {
                    $_ARTIST_OBJ['artist_albums'][$sub_category->slug]['album_genre'] = $term->name;
                } // END OF: if(in_array($term->name, $genre_dict...
                if(in_array($term->name, $year_dict))
                {
                    $_ARTIST_OBJ['artist_albums'][$sub_category->slug]['album_year'] = $term->name;
                } // END OF: if(in_array($term->name, $year_dict...
                
            }

        } // END OF: while($product_loop->have_posts(...
    }
    else
    {
        echo("<p>There are no products...</p>");
    } // END OF: if($product_loop->have_posts(...
} // END OF: foreach(get_terms('product_cat', ['parent' => $main_category_id...

print_r($_ARTIST_OBJ);

Надеюсь, это может помочь другому нубу, который столкнется с той же проблемой где-то в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...