Как добавить выпадающий список woocommerce-pagination и woocommerce-ordering в собственный шорткод - PullRequest
0 голосов
/ 25 января 2019

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

Вотшорткод:

// 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>';
}

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

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

1 Ответ

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

Хорошо, у меня работает пагинация, и я немного прибрался (в журнале отладки было несколько ошибок), теперь код выглядит так:

// 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',
            'stock'                 => '',
            ),
            $atts, 'minimum_stock'
        );

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

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

        if ( isset( $ordering_args['meta_key'] ) ) { 
$args['meta_key'] = $ordering_args['meta_key']; 
}


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 wc_get_template_part( 'content', 'product' ); ?>

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

    <?php woocommerce_product_loop_end(); ?>

<?php endif;

if($products->max_num_pages>1){
?>

<nav class="woocommerce-pagination"> 

<?php echo paginate_links( apply_filters(
        'woocommerce_pagination_args', array( 
            'base'      => esc_url( str_replace( 999999999, '%#%', remove_query_arg( 'add-to-cart', get_pagenum_link( 999999999, false ) ) ) ), 
            'format'    => '', 
            'current'   => max( 1, get_query_var( 'paged' ) ), 
            'total'     => $products->max_num_pages, 
            'prev_text' => '&larr;', 
            'next_text' => '&rarr;', 
            'type'      => 'list', 
            'end_size'  => 3, 
            'mid_size'  => 3 
        )
    )       
);

?>

</nav>

<?php }

woocommerce_reset_loop(); 
wp_reset_postdata();

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

// Remove ordering query arguments 
WC()->query->remove_ordering_args();

return $return; 
}

Кто-нибудь знает, какТеперь я могу вызвать выпадающий список woocommerce-заказа?

Я пытался добавить:

<?php do_action( 'woocommerce_before_shop_loop' ); ?>

Но это не работает, когда я проверяю страницу, на которой есть 'woocommerce-notices-wrapper ', но нет признаков того, что' woocommerce_catalog_ordering ', как я думал, следует также вызывать с помощью' woocommerce_before_shop_loop '.

Любая помощь будет очень цениться:)

Обновление:

Я нашел этот вопрос Добавление выпадающего меню "сортировка" на пользовательской странице с помощью краткого кода woocommerce , которое дало мне ответ, который мне был необходим для добавления выпадающего списка woocommerce-заказа.

Вот мой обновленный код:

// 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'               => 'date',
            'order'                 => 'desc',
            'category'              => '',
            'cat_operator'          => 'IN',
            'stock'                 => '',
            ), $atts );

    if ( ! $atts['category'] ) {
        return '';
    }

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

// Default ordering args
$ordering_args = WC()->query->get_catalog_ordering_args( $atts['orderby'],    
$atts['order'] );
$orderby = 'date';
$order = 'desc';
if ( isset( $_GET['orderby'] ) ) {
    $getorderby = $_GET['orderby'];
}
if ($getorderby == 'date') {
    $orderby = 'date';
    $order = 'desc';
} elseif ($getorderby == 'sku_desc') {
    $orderby = 'meta_value';
    $order = 'desc';
    $meta_key = '_sku';
} elseif ($getorderby == 'sku_asc') {
    $orderby = 'meta_value';
    $order = 'asc';
    $meta_key = '_sku';
}

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

        if ( isset( $ordering_args['meta_key'] ) ) { 
            $args['meta_key'] = $ordering_args['meta_key']; 
}


ob_start();

$products = new WP_Query( $args );

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

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

<div style="width:100%;">
    <div style="float:right">
        <form class="woocommerce-ordering" method="get">
            <select name="orderby" class="orderby">
                <?php
                    $catalog_orderby = apply_filters( 'woocommerce_catalog_orderby', array(
                        'date'      => __( 'Sort by latest', 'woocommerce' ),
                        'sku_asc'   => __( 'A-Z / Low to High Numbers', 'woocommerce' ),
                        'sku_desc'  => __( 'Z-A / High to Low Numbers', 'woocommerce' )
                    ) );

                    foreach ( $catalog_orderby as $id => $name )
                        echo '<option value="' . esc_attr( $id ) . '" ' . selected( $getorderby, $id, false ) . '>' . esc_attr( $name ) . '</option>';
                ?>
            </select>
            <?php
                // Keep query string vars intact
                foreach ( $_GET as $key => $val ) {
                    if ( 'orderby' === $key || 'submit' === $key )
                        continue;

                    if ( is_array( $val ) ) {
                        foreach( $val as $innerVal ) {
                            echo '<input type="hidden" name="' . esc_attr( $key ) . '[]" value="' . esc_attr( $innerVal ) . '" />';
                        }

                    } else {
                        echo '<input type="hidden" name="' . esc_attr( $key ) . '" value="' . esc_attr( $val ) . '" />';
                    }
                }
            ?>
        </form>
    </div>
</div>
<div style="clear:both;"></div>

    <?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 endif;

if($products->max_num_pages>1){
?>

<nav class="woocommerce-pagination"> 

<?php echo paginate_links( apply_filters(
        'woocommerce_pagination_args', array( 
            'base'      => esc_url( str_replace( 999999999, '%#%', remove_query_arg( 'add-to-cart', get_pagenum_link( 999999999, false ) ) ) ), 
            'format'    => '', 
            'current'   => max( 1, get_query_var( 'paged' ) ), 
            'total'     => $products->max_num_pages, 
            'prev_text' => '&larr;', 
            'next_text' => '&rarr;', 
            'type'      => 'list', 
            'end_size'  => 3, 
            'mid_size'  => 3 
        )
    )       
);

?>

</nav>

<?php }

woocommerce_reset_loop(); 
wp_reset_postdata();

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

// Remove ordering query arguments 
WC()->query->remove_ordering_args();

return $return; 
}

Я надеюсь, что кто-то может найти это полезным:)

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

...