Woocommerce шорткод для отображения продуктов с запасом, равным или превышающим указанное значение (обновлено снова) - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать собственный шорткод, который позволит мне отображать продукты с уровнем запасов, равным или превышающим установленное числовое значение.

Так что в идеале я мог бы поместить шорткод в строку: [product_category category = "secret-wars" stock = "3"]

Что будет отображать продукты в категории секретных войн с 3 или более на складе.

Обновление № 1:

Итак, я нашел некоторый код LoicTheAztec, который, я надеюсь, я смогу изменить в соответствии с моими требованиями здесь Отображение продуктов WooCommerce с помощью шорткода с использованием пользовательского meta_query

Я попытался внести некоторые изменения, но не могу заставить код работать, вот код, который у меня сейчас есть:

    if( ! function_exists('minimum_stock') ) {

    // Add Shortcode
    function minimum_stock( $atts ) {
        global $woocommerce_loop;

        // Attributes 
        $atts = shortcode_atts(
            array(
                'columns'   => '5',
                'limit'     => '40',
                'stock'     => '3',
            ),
            $atts, 'minimum_stock'
        );


        $woocommerce_loop['columns'] = $atts['columns'];

        // The WP_Query
        $products = new WP_Query( array (
            'post_type'         => 'product',
            'post_status'       => 'publish',
            'posts_per_page'    => $atts['limit'],
            'meta_query'        => array(
                'stock'  => array(
                    'key'       =>'_stock',
                    'type'    => 'numeric',
                    'value'   => ''
                    'compare'   => '>=',
                ),
            )
        ));

        ob_start();

        if ( $products->have_posts() ) { ?>

            <?php woocommerce_product_loop_start(); ?>

                <?php while ( $products->have_posts() ) : $products->the_post(); ?>

                    <?php wc_get_template_part( 'content', 'product' ); ?>

                <?php endwhile; // end of the loop. ?>

            <?php woocommerce_product_loop_end(); ?>

            <?php
        } else {
            do_action( "woocommerce_shortcode_products_loop_no_results", $atts );
            echo "<p>There are no results.</p>"
        }

        woocommerce_reset_loop();
        wp_reset_postdata();

        return '<div class="woocommerce columns-' . $atts['columns'] . '">' . ob_get_clean() . '</div>';
    }

    add_shortcode( 'stock', 'minimum_stock' );
}

Я тоже пытался прийти к этому немного по-другому:

// Add Minimum Stock Shortcode
function minimum_stock_func ( $atts , $args ) {
    $a = shortcode_atts( array(
                'stock' => $args = array(
                        'meta_key'      => '_stock',
                        'type'          => 'numeric',
                        'meta_value'    => '',
                        'compare'       => '>='
                ), $atts ) );

    return "stock = {$a['stock']}";
}
add_shortcode( 'stock', 'minimum_stock_func' );

Если кто-нибудь поймет, что я делаю неправильно, ваша помощь будет очень признательна!

Обновление № 2: Хорошо, я думаю, что я доберусь Мне удалось получить минимальный запас 3, чтобы показать, используя этот код:

// Minimum Stock Shortcode
add_shortcode( 'minimum_stock', 'minimum_stock_shortcode' );

function minimum_stock_shortcode( $atts ) {
global $product, $woocommerce, $woocommerce_loop;

// Attributes 
        $atts = shortcode_atts(
            array(
            'limit'         => '40',
            'columns'       => '5',
            'orderby'       => 'title',
            'order'         => 'asc',
            'category'      => '',
            'cat_operator'  => 'IN',
            ),
            $atts, 'minimum_stock'
        );

        $woocommerce_loop['columns'] = $atts['columns'];

        $args = array(
            'post_type'             => 'product',
            'post_status'           => 'publish',
            'posts_per_page'        => $atts['limit'],
            'orderby'               => $atts['orderby'],
            'order'                 => $atts['order'],
            'meta_query'            => array(
                array(
                    'key'           => '_stock',
                    'value'         => 3,
                    'compare'       => '>='
                )
            ),
            'tax_query' => array( array(
                        'taxonomy'  => 'product_cat',
                        'field'     => 'slug',
                        'terms'     => $atts['category'],
                )
            )
        );

$loop = new WP_Query($args);

ob_start();

woocommerce_product_loop_start();

while ( $loop->have_posts() ) : $loop->the_post();
wc_get_template_part( 'content', 'product' );
endwhile; 

woocommerce_product_loop_end();

woocommerce_reset_loop();
wp_reset_postdata();

return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
}

Это отобразит товары в категории с минимальным запасом 3, с этим коротким кодом:

[минимум_сток категории = "издатели комиксов"]

Кто-нибудь знает, как я могу заставить его работать, если шорткод был таким:

[productsimum_stock = "2" категория = "комиксы-издатели"]

Я хотел бы иметь возможность использовать шорткод Woocommerce [products], так как с ним я также получу пагинацию, и над продуктами появится выпадающее меню «orderby». Я также хотел бы иметь возможность указывать минимальную сумму с помощью [Minimum_stock = "2"], а не указывать ее в запасе для шорткода.

Любая помощь будет принята с благодарностью.

С уважением, JP

1 Ответ

0 голосов
/ 25 января 2019

Хорошо, я сделал большую часть этого.

Шорткод в его текущей форме позволяет мне отображать продукты с установленным минимальным количеством товара в определенной категории, например, так [минимальное количество акций = "4" категория = "комиксы-издатели"]

Вот код:

// Minimum Stock Shortcode
add_shortcode( 'minimum_stock', 'minimum_stock_shortcode' );

function minimum_stock_shortcode( $atts ) {

global $woocommerce_loop;

// Attributes 
        $atts = shortcode_atts(
            array(
            'limit'         => '40',
            'columns'       => '5',
            'orderby'       => 'title',
            'order'         => 'asc',
            'category'      => '',
            'cat_operator'  => 'IN',
            'stock'         => '',
            ),
            $atts, 'minimum_stock'
        );

        $args = array(
            'post_type'             => 'product',
            'post_status'           => 'publish',
            'ignore_sticky_posts'   => 1,
            'posts_per_page'        => $atts['limit'],
            'orderby'               => $atts['orderby'],
            'order'                 => $atts['order'],
            'meta_query'            => array(
                array(
                    'key'           => '_stock',
                    'value'         => $atts['stock'],
                    'compare'       => '>='
                )
            ),
            'tax_query'             => array(
                array(
                    'taxonomy'      => 'product_cat',
                    'field'         => 'slug',
                    'terms'         => $atts['category'],
                )   
            )
        );


ob_start();

$products = new WP_Query( $args );

$woocommerce_loop['columns'] = $atts['columns'];

if ( $products->have_posts() ) : ?>     

    <?php woocommerce_product_loop_start(); ?>

        <?php while ( $products->have_posts() ) : $products->the_post(); ?>

            <?php woocommerce_get_template_part( 'content', 'product' ); ?>

        <?php endwhile; // end of the loop. ?>

    <?php woocommerce_product_loop_end(); ?>

<?php endif;

wp_reset_postdata();

return '<div class="woocommerce">' . ob_get_clean() . '</div>';
}

Теперь мне нужно разобраться, как применить нумерацию страниц к шорткоду и включить порядок Woocommerce по выпадающему списку ... пора начинать новый вопрос! :)

Если кто-нибудь знает, как я могу это сделать, пожалуйста, дайте мне знать, новый вопрос по этому вопросу можно найти здесь: Как добавить выпадающий список woocommerce-pagination и woocommerce-ordering в пользовательский шорткод

...