prabegg
prabegg

Reputation: 1

How do I show woocommerce sortby/orderby dropdown menu in custom wp_query?

This is my query:

***

$args = array( 'post_type' => 'product', 'post_status' => 'publish', 'posts_per_page' => 12, 'paged' => $paged, );

$loop = new WP_Query($args);

Upvotes: 0

Views: 505

Answers (1)

prabegg
prabegg

Reputation: 1

I wanted to make a custom sortBy dropdown. This is how I solved it:

<?php
    $orderby = 'ID';
    $order = 'DESC';
    if (isset($_GET['orderby']) && $_GET['orderby'] != "") {
        $order_by = $_GET['orderby'];
        WC()->query->remove_ordering_args();
        if ($order_by == 'title-desc') {
            $orderby = 'title';
            $order = 'DESC';
        }
        if ($order_by == 'title-asc') {
            $orderby = 'title';
            $order = 'ASC';
        }
        if ($order_by == 'price-asc') {
            $meta_key = '_price';
            $orderby  = ['meta_value_num' => 'ASC', $order => 'ASC'];
        }
        if ($order_by == 'price-desc') {
            $meta_key = '_price';
            $orderby  = ['meta_value_num' => 'DESC', $order => 'DESC'];
        }
        if ($order_by == 'date-asc') {
            $orderby = 'ID';
            $order = 'ASC';
        }
        if ($order_by == 'date-desc') {
            $orderby = 'ID';
            $order = 'DESC';
        }
    }
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    if ($meta_key == '_price') {
        $args = array(
            'post_type'             => 'product',
            'post_status'           => 'publish',
            'posts_per_page'        => 12,
            'paged'                 => $paged,
            'orderby'               => $orderby,
            'order'                 => $order,
            'meta_key'              => $meta_key,
        );
    } else {
        $args = array(
            'post_type'             => 'product',
            'post_status'           => 'publish',
            'posts_per_page'        => 12,
            'paged'                 => $paged,
            'orderby'               => $orderby,
            'order'                 => $order,
        );
    }



    $loop = new WP_Query($args);
    // debug($loop);
    ?>

And this is my form:

<form class="woocommerce-ordering" method="get">
                            <select name="orderby" class="orderby form-select" aria-label="Shop order"
                                onchange="this.form.submit()">
                                <option <?php if (isset($order_by) && $orderby == 'ID' && isset($order) && $order == 'DESC') {
                                            echo 'selected';
                                        } ?> value="date-desc">Sort by latest
                                </option>

                                <option <?php if (isset($order_by) && $orderby == 'ID' && isset($order) && $order == 'ASC') {
                                            echo 'selected';
                                        } ?> value="date-asc">Sort by oldest
                                </option>

                                <option <?php if (isset($order_by) && $orderby == 'title' && isset($order) && $order == 'ASC') {
                                            echo 'selected';
                                        } ?> value="title-asc">Sort by name: a to z
                                </option>

                                <option <?php if (isset($order_by) && $orderby == 'title' && isset($order) && $order == 'DESC') {
                                            echo 'selected';
                                        } ?> value="title-desc">Sort by name: z to a
                                </option>

                                <option <?php if (isset($order_by) && $orderby == ['meta_value_num' => 'ASC', $order => 'ASC'] && isset($meta_key) && $meta_key == '_price') {
                                            echo 'selected';
                                        } ?> value="price-asc">Sort by price: low to high
                                </option>

                                <option <?php if (isset($order_by) && $orderby == ['meta_value_num' => 'DESC', $order => 'DESC']  && isset($meta_key) && $meta_key == '_price') {
                                            echo 'selected';
                                        } ?> value="price-desc">Sort by price: high to low
                                </option>
                            </select>
                        </form>

Upvotes: 0

Related Questions