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

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

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

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

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

	
'attribute_names' =>
 array (
 0 => 'pa_pub-year',
 1 => 'pa_pub-author',
...
 ),
 'attribute_position' =>
 array (
 0 => '1',
 1 => '1',
......
'attribute_is_taxonomy' =>
 array (
 0 => '1',
......
 ),
 'attribute_values' =>
 array (
 0 => '1990',
 1 => '',
 2 => '',
......
 ),

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

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

		
/************* Добавляем сортировку по пользовательским свойствам **************/
 
/**
 *  Определяем критерии для сортировки с опциями, определяемыми способом ниже
 */
add_filter('woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args');
 
function custom_woocommerce_get_catalog_ordering_args( $args ) {
    global $wp_query;
        // Изменили $_SESSION на $_GET
    if (isset($_GET['orderby'])) {
        switch ($_GET['orderby']) :
            case 'pa_pub-year' :
                $args['order'] = 'ASC';
                $args['meta_key'] = 'pa_pub-year';
                $args['orderby'] = 'meta_value_num';
            break;
        endswitch;
    }
    return $args;
}
 
/**
 *  Добавляем способ сортировки в выпадающий список. Логика/критерии в методе выше
 */
add_filter('woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby');
 
function custom_woocommerce_catalog_orderby( $sortby ) {
    $sortby['pa_pub-year'] = 'Сортировка по году: от старых к новым';
    return $sortby;
}
 
/**
 *  Сохраняем пользовательские свойства в виде мета данных записи для того, чтобы можно было их использовать в сортировке и поиске
 */
add_action( 'save_post', 'save_woocommerce_attr_to_meta' );
function save_woocommerce_attr_to_meta( $post_id ) {
        // Получаем attribute_names .. Для каждого элемента получаем index и имя свойства
        // Затем используем index для получения соответствующего отправленного значения из массива attribute_values.
    foreach( $_REQUEST['attribute_names'] as $index => $value ) {
        update_post_meta( $post_id, $value, $_REQUEST['attribute_values'][$index] );
    }
}
/************ Окончание сортировки ***************************/

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

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

VN:F [1.9.22_1171]
Rating: 5.0/5 (7 votes cast)

Об авторе ADv

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

    Добрый день! Очень понадобилась сортировка по свойствам. Почитал статью, спасибо. Применил данное- вроде все хорошо в сортировке отобразилось, поменял свойство на свое- но к сожалению сортировка не работает точнее…всегда один и тот же результат- что то типо отсутствуют товары — тоесть все товары исчезают остается лишь пустая страница с надписью. Как решить данную задачу? надеюсь на вашу помощь! Спасибо!

  • Дмитрий

    Поддерживаю вопрос Олега. После добавления кода в functions.php и замены в нем pa_pub-year на свой Slug свойства товара при попытке сортировки выдает сообщение: «Товаров, соответствующих вашему запросу, не обнаружено.»

  • Константин

    Спасибо очень помогло!! Но очень нужно сделать сортировку и от новых к старым(( Не подскажите как это реализовать?? Очень буду признателен.

Scroll To Top