Вывод товаров основываясь на полученных product ID Woocommerce

Стоит задача отобразить товары Woocommerce с одинаковым значением атрибута (исключая текущий товар) непосредственно на странице товара. С помощью Google и форумов удалось подобрать рабочий код:

add_action( 'woocommerce_single_product_summary', 'custom_output_product_collection', 25 );
function custom_output_product_collection(){

$attribute = "artikul"; // <== HERE define your attribute name
$limit     = "6";     // <== Number of products to be displayed
$cols      = "2";     // <== Number of columns
$orderby   = "rand";  // <== Order by argument (random order here)

## --- THE CODE --- ##
global $wpdb;
// Formatting the attribute
$attribute = sanitize_title( $attribute );
$taxonomy  = 'pa_' . $attribute;

// Get the WP_Term object for the current product and the defined product attribute
$terms = wp_get_post_terms( $post->ID, $taxonomy );
$term = reset($terms);

// Get all product IDs that have  the same product attribute value (except current product ID)
$product_ids = $wpdb->get_col( "SELECT DISTINCT tr.object_id
FROM {$wpdb->prefix}term_relationships as tr
JOIN {$wpdb->prefix}term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id
JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
WHERE tt.taxonomy LIKE '$taxonomy' AND t.term_id = '{$term->term_id}' AND tr.object_id != 
'{$post->ID}'" );

// Convert array values to a coma separated string
$ids = implode( ',', $product_ids );

## --- THE OUTPUT --- ##

echo '<section class="'.$attribute.' '.$attribute.'-'.$term->slug.' products">';

echo do_shortcode("[products ids='$ids' columns='$cols' limit='$limit' orderby='$orderby']");

echo '</section>';
}

Таким образом получается собрать необходимые ID товаров. Но вот вывод через шорткод - не совсем то, что нужно, т.к. товары выводятся в обычном архивном виде.

Я хотел бы получить вывод указанных товаров в виде горизонтальной таблицы, включая заголовок, цену и кнопку добавления в корзину. Т.е. иметь возможность настроить вывод любых данных "своими руками", типа $product->get_name(); или $product->get_sku();.

Были испробованы разные способы, но почему-то ничего не работает. Не получается присвоить выводимые через $ids номера непосредственно товарам. Пробовал после строки с выводом $ids добавить следующий код:

$products = wc_get_products(array( $ids ) );

И после уже вывести что-то подобное:

echo '<div class="related-attributes">
foreach($products as $product ){
$title = $product->get_name();
$stock = $product->get_stock_quantity();
$price = $product->get_price();
 
<span class="name">'.$title.'</span>
<span class="stock">'.$stock.' шт.</span>
<span class="prices">'.$price.'</span>';
}
echo '</div>';

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

ПРАВКА:

Магическим образом удалось получить хоть какой-то результат. После $ids = implode( ',', $product_ids ); был немного изменен код и добавлено следующее:

$ids = implode( ',', $product_ids );

$args = array(
'include' => array( $ids ),
);
$products = wc_get_products( $args );

echo '<div class="related-attributes">';
## --- THE OUTPUT --- ##
foreach($products as $product ){
    $title = $product->get_name();
    $stock = $product->get_stock_quantity();
    $price = $product->get_price();

   echo '
   <span class="name">'.$title.'</span>
   <span class="stock">'.$stock.' шт.</span>
   <span class="prices">'.$price.'</span>';
}
echo '</div>';

Но проблема все же осталась, т.к. выводится только первый товар вне зависимости от того, сколько айдишников запечатано в $ids. Если немного изменить код и прописать в $args реальные значения в виде цифр, то все работает. Что не так, не пойму...


Ответы (0 шт):