Woocommerce按属性值排序

时间:2018-08-20 22:18:56

标签: php wordpress sorting woocommerce attributes

在我的商店中,我有一个名为“件”的属性,phpmyadmin在wp_postmeta中将其列为“ pa_pieces”。 我的商店列出了玩具,因此我希望能够按件数/属性对其进行排序。因此,我的意思是不是要按价格从低到高的顺序排序,我要按件数添加排序。它应该在每个商店页面上都可用。

我在网上找到了下面的代码(实际上是最近的代码),并将其添加到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 个答案:

没有答案