#woocommerce #shortcode
Вопрос:
Я пытаюсь добавить такие параметры, как столбцы, ограничение, тег и orderby
пользовательский шорткод для отображения вариаций переменных продуктов. Некоторые части работают, однако я не могу все сделать правильно.
add_shortcode( 'show_single_variations', array($this, 'custom_shortcode'));
function custom_shortcode ($atts) {
// Shortcode Attributes
$args = shortcode_atts( array(
'products' => '',
'categories' => '',
'columns' => '4',
'limit' => '24',
'tag' => '',
'orderby' => 'menu_order',
), $atts );
if(!empty($args['products'])) {
$products_in = explode(',', $args['products']);
$products_in = $products_in;
}
elseif(!empty($args['categories'])) {
$categories_in = explode(',', $args['categories']);
$categories_in = $categories_in;
}
if(!empty($categories_in)) {
$args['tax_query'] = array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $categories_in,
'operator' => 'IN'
),
);
}
if(!empty($tag)) {
$args['tax_query'] = array(
array(
'taxonomy' => 'product_tag',
'field' => 'term_id',
'terms' => $tag,
'operator' => 'IN'
),
);
}
$limit = $args['limit'];
$columns = $args['columns'];
$orderby = $args['orderby'];
$args = new WP_Query( array (
'post_type' => 'product_variation',
'post_status' => 'publish',
'ignore_sticky_posts' => 1,
'posts_per_page' => $limit,
'post__in' => $products_in,
'orderby' => $orderby,
) );
global $woocommerce_loop;
$woocommerce_loop['columns'] = $columns;
$woocommerce_loop['is_shortcode'] = 1;
$woocommerce_loop['per_page'] = $limit;
$woocommerce_loop['orderby'] = $orderby;
ob_start();
$products = new WP_Query($args);
if(!isset($products->posts) || empty($products->posts)) {
return __('No products found', 'single-variations');
}
$products = $products->posts;
$original_post = $GLOBALS['post'];
woocommerce_product_loop_start();
foreach ( $products as $product ) {
$GLOBALS['post'] = get_post( $product->ID ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
setup_postdata( $GLOBALS['post'] );
wc_get_template_part( 'content', 'product' );
}
$GLOBALS['post'] = $original_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
woocommerce_product_loop_end();
$output = ob_get_contents();
ob_end_clean();
return $output;
}
Конечная цель состоит в том, чтобы добавить шорткод примерно так:
[show_single_variations produtcs="236, 237, 256, 257, 258, 301, 302, 303" column="4" orderby="date"]
или
[show_single_variations produtcs="tshirts" tag="yellow" column="5" orderby="rand"]
Все улучшения приветствуются и высоко ценятся.