Как получить категории товаров для текущей позиции заказа? - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь получить категории продуктов для позиции заказа woocommerce на хуке woocommerce_checkout_create_order_line_item.

Я могу успешно получить product_id (благодаря помощи, которую я получил здесь), но теперь, пытаясь получить категории продукта, массив возвращается пустым, пытаясь $ product-> get_categories () и, альтернативно, пытаясь wc_get_product_category_list ($ product-> get_id ().

Я не могу понять, что я делаю неправильно.

add_action('woocommerce_checkout_create_order_line_item', 
'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {

$product = $item->get_product(); // The WC_Product instance Object

$cat_names = $product->get_categories(); // one attempt  
$cat_names = wc_get_product_category_list($product->get_id()); // another attempt

$arrlength = count($cat_names);

for($x = 0; $x<$arrlength; $x++) {
$cat_name = $cat_names[$x];
}

$item->update_meta_data( '_raw_product_id', $product->get_id() ); 
$item->update_meta_data( '_raw_product_name', $cat_name ); 

}

Итак, add_action и функция работают. "$ Product = ..." работает, и я могу использовать его ниже от 2-й до последней строки кода как $ product-> get_id (), и правильное значение сохраняется как метаданные по желанию.

Так что, поскольку $ product-> get_id () работает, я подумал, что логично, что $ product-> get_categories () будет работать. Но он возвращает нулевой массив.

Затем я где-то читал, что это устарело, и я должен использовать wc_get_product_category_list. Я попробовал это, и тоже не повезло.

Итак, я застрял и не могу понять, что не так с моим кодом. Спасибо за любую помощь.

1 Ответ

1 голос
/ 14 июня 2019

Как вы упомянули, get_categories() метод класса WC_Product устарел. Вместо этого вы можете использовать get_category_ids() метод. Однако этот метод возвращает идентификаторы категорий продуктов, и кажется, что вам нужны имена категорий, чтобы мы могли получить имена из объектов WP_Term.

Финальный код будет примерно таким:

add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta($item, $cart_item_key, $cart_item, $order)
{
    $product = $item->get_product(); // The WC_Product instance Object
    $cat_ids = $product->get_category_ids(); // returns an array of cat IDs
    $cat_names = [];    

    foreach ( (array) $cat_ids as $cat_id) {
        $cat_term = get_term_by('id', (int)$cat_id, 'product_cat');
        if($cat_term){
            $cat_names[] = $cat_term->name; // You may want to get slugs by $cat_term->slug
        }
    }

    $item->update_meta_data( '_raw_product_id', $product->get_id() );
    $item->update_meta_data( '_raw_product_name', $cat_names );
}

Примечание: цикл foreach является предпочтительным способом выполнения подобных действий (вместо использования цикла for).

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