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