Добавление параметров в пользовательский шорткод WooCommerce для отображения прямо в woocommerce_loop

#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"]
 

Все улучшения приветствуются и высоко ценятся.