Сортируем товары в WooCommerce по произвольным свойствам

Для того, чтобы добавить дополнительные варианты сортировки в ваш магазин WooCommerce, используя метаданные, можно воспользоваться этой статьей Сортировка товаров по имени в WooCommerce

Однако, если вы захотите добавить способы сортировки, которые будут использовать произвольные свойства WooCommerce, тогда эта статья для вас. Свойства товара сохраняются в базе данных в определенном формате и поэтому не представляется возможным получить к ним доступ напрямую, используя свойство WordPress orderby.

Для того, чтобы использовать эти свойства в фильтрах WooCommerce, они (свойства) должны быть сохранены как мета данные.

Когда запись, которая содержит какие-либо произвольные свойства, обновляется, отправляемые данные ($_REQUEST) содержат следующее:

1     
2'attribute_names' =>
3 array (
4 0 => 'pa_pub-year',
5 1 => 'pa_pub-author',
6...
7 ),
8 'attribute_position' =>
9 array (
10 0 => '1',
11 1 => '1',
12......
13'attribute_is_taxonomy' =>
14 array (
15 0 => '1',
16......
17 ),
18 'attribute_values' =>
19 array (
20 0 => '1990',
21 1 => '',
22 2 => '',
23......
24 ),

Подход, который мы использовали, заключается в том, чтобы получить отправляемые свойства и сохранить их как метаданные для записи. После этого, код упомянутый в статье выше, с небольшой модификацией, прекрасно справился с задачей сортировки по произвольным свойствам. В качестве примера было взято свойство pa_pub-year — год публикации.

Просто добавьте код в файл functions.php вашей темы или в плагин для сайта WordPress:

1         
2/************* Добавляем сортировку по пользовательским свойствам **************/
3  
4/**
5 *  Определяем критерии для сортировки с опциями, определяемыми способом ниже
6 */
7add_filter('woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args');
8  
9function custom_woocommerce_get_catalog_ordering_args( $args ) {
10    global $wp_query;
11        // Изменили $_SESSION на $_GET
12    if (isset($_GET['orderby'])) {
13        switch ($_GET['orderby']) :
14            case 'pa_pub-year' :
15                $args['order'] = 'ASC';
16                $args['meta_key'] = 'pa_pub-year';
17                $args['orderby'] = 'meta_value_num';
18            break;
19        endswitch;
20    }
21    return $args;
22}
23  
24/**
25 *  Добавляем способ сортировки в выпадающий список. Логика/критерии в методе выше
26 */
27add_filter('woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby');
28  
29function custom_woocommerce_catalog_orderby( $sortby ) {
30    $sortby['pa_pub-year'] = 'Сортировка по году: от старых к новым';
31    return $sortby;
32}
33  
34/**
35 *  Сохраняем пользовательские свойства в виде мета данных записи для того, чтобы можно было их использовать в сортировке и поиске
36 */
37add_action( 'save_post', 'save_woocommerce_attr_to_meta' );
38function save_woocommerce_attr_to_meta( $post_id ) {
39        // Получаем attribute_names .. Для каждого элемента получаем index и имя свойства
40        // Затем используем index для получения соответствующего отправленного значения из массива attribute_values.
41    foreach( $_REQUEST['attribute_names'] as $index => $value ) {
42        update_post_meta( $post_id, $value, $_REQUEST['attribute_values'][$index] );
43    }
44}
45/************ Окончание сортировки ***************************/

По всем вопросам и отзывам просьба писать в комментарии ниже.

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

VN:F [1.9.22_1171]
Rating: 4.9/5 (12 votes cast)

Об авторе ADv

Занимаюсь разработкой сайтов и магазинов на WordPress. Оказываю платные помощь и консультации. Skype: advokat_b
Scroll To Top