Вывод товаров основываясь на полученных 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 реальные значения в виде цифр, то все работает. Что не так, не пойму...