Woocommerce Сортировка по значению атрибута

В моем магазине у меня есть атрибут "части", который phpmyadmin перечисляет как "pa_pieces" в wp_postmeta. В моем магазине перечислены игрушки, поэтому я хочу иметь возможность сортировать их по количеству штук / атрибуту. Под этим я подразумеваю вместо сортировки по цене от низкой до высокой я хочу добавить сортировку по количеству штук. Он должен быть доступен на каждой странице магазина.

Я нашел приведенный ниже код в сети (на самом деле очень недавний) и добавил его в functions.php и изменил его для своего названия таксономии. Отображается имя моих параметров сортировки, но когда я пытаюсь выполнить сортировку по нему, оно просто показывает: "Не найдено товаров, соответствующих вашему выбору". Я обновил свои продукты, и каждый элемент содержит по крайней мере 1 часть.

Я знаю, что у woocommerce / wordpress есть фильтр, где я могу фильтровать, чтобы показывать только выбранные номера. Но с ~500 различными значениями это на самом деле не вариант.

Я благодарен за любую помощь.

/**
 * Save product attributes to post metadata when a product is saved.
 *
 * @param int $post_id The post ID.
 * @param post $post The post object.
 * @param bool $update Whether this is an existing post being updated or not.
 *  
 * Refrence: https://codex.wordpress.org/Plugin_API/Action_Reference/save_post
 */
function wh_save_product_custom_meta($post_id, $post, $update) {
    $post_type = get_post_type($post_id);
    // If this isn't a 'product' post, don't update it.
    if ($post_type != 'product')
        return;

    if (!empty($_POST['attribute_names']) && !empty($_POST['attribute_values'])) {
        $attribute_names = $_POST['attribute_names'];
        $attribute_values = $_POST['attribute_values'];
        foreach ($attribute_names as $key => $attribute_name) {
            switch ($attribute_name) {
                //for lenght (int)
                case 'pa_length':
                    if (!empty($attribute_values[$key][0])) {
                        update_post_meta($post_id, 'pa_length', $attribute_values[$key][0]);
                    }
                    break;
                default:
                    break;
            }
        }
    }
}

add_action( 'save_post', 'wh_save_product_custom_meta', 10, 3);

/** 
 *  Main ordering logic for orderby attribute
 *  Refrence: https://docs.woocommerce.com/document/custom-sorting-options-ascdesc/
 */
add_filter('woocommerce_get_catalog_ordering_args', 'wh_catalog_ordering_args');

function wh_catalog_ordering_args($args) {
    global $wp_query;
    if (isset($_GET['orderby'])) {
        switch ($_GET['orderby']) {
            //for attribute/taxonomy=pa_length
            case 'pa_length_asc' :
                $args['order'] = 'ASC';
                $args['meta_key'] = 'pa_length';
                $args['orderby'] = 'meta_value_num';
                break;
            case 'pa_length_desc' :
                $args['order'] = 'DESC';
                $args['meta_key'] = 'pa_length';
                $args['orderby'] = 'meta_value_num';
                break;
        }
    }
    return $args;
}

/**
 *  Lets add the created sorting order to the dropdown list.
 *  Refrence: http://hookr.io/filters/woocommerce_catalog_orderby/
 */
//To under Default Product Sorting in Dashboard > WooCommerce > Settings > Products > Display.
add_filter( 'woocommerce_default_catalog_orderby_options', 'wh_catalog_orderby' );
add_filter('woocommerce_catalog_orderby', 'wh_catalog_orderby');

function wh_catalog_orderby($sortby) {
    $sortby['pa_length_asc'] = 'Sort by pieces: Low - High';
    $sortby['pa_length_desc'] = 'Sort by pieces: High - Low';
    return $sortby;
}

0 ответов

Другие вопросы по тегам