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