Для того, чтобы добавить дополнительные варианты сортировки в ваш магазин 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] ); } } /************ Окончание сортировки ***************************/
По всем вопросам и отзывам просьба писать в комментарии ниже.
Не забывайте, по возможности, оценивать понравившиеся записи количеством звездочек на ваше усмотрение.