Stack Overflow на русском Asked on December 28, 2021
Как поменять местами пункты сортировки? Где это делается?
Эти возможности для сортировки я добавил так:
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' );
function custom_woocommerce_get_catalog_ordering_args( $args ) {
$orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
if ( 'diametr_asc' == $orderby_value ) {
$args['orderby'] = 'meta_value_num';
$args['order'] = 'ASC';
$args['meta_key'] = 'diametr';
}
elseif ( 'diametr_desc' == $orderby_value ) {
$args['orderby'] = 'meta_value_num';
$args['order'] = 'DESC';
$args['meta_key'] = 'diametr';
}
return $args;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby',5 );
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby',5 );
function custom_woocommerce_catalog_orderby( $sortby ) {
$sortby['diametr-desc'] = __('Размер: по убыванию','woocomerce');
$sortby['diametr-asc'] = __('Размер: по возрастанию','woocomerce');
return $sortby;
}
Вы можете воспользоваться array_merge
function custom_woocommerce_catalog_orderby( $sortby ) {
$mySort = ['diametr-desc' => __('Размер: по убыванию','woocomerce'),
'diametr-asc' => __('Размер: по возрастанию','woocomerce')];
return array_merge($mySort, $sortby);
}
Это вставит ваш массив в самое начало, но и так же сместит пункт по умолчанию "Исходная сортировка"
Если вам нужно оставить ее в самом вверху, то нужно писать свое решение, на сколько мне известно в PHP нет встроенной функции которая позволяла бы вставить в ассоциативный массив после определенного ключа.
Пример:
function custom_woocommerce_catalog_orderby( $sortby ) {
$mySort = ['diametr-desc' => __('Размер: по убыванию','woocomerce'),
'diametr-asc' => __('Размер: по возрастанию','woocomerce')];
return array_push_after($sortby,$mySort,0);
}
/**
* @param array $src
* @param array $in
* @param int|string $pos
* @return array
*/
function array_push_after($src, $in, $pos)
{
if (is_int($pos)) {
$R = array_merge(array_slice($src, 0, $pos + 1), $in, array_slice($src, $pos + 1));
} else {
foreach ($src as $k => $v) {
$R[$k] = $v;
if ($k == $pos) {
$R = array_merge($R, $in);
}
}
}
return $R;
}
Answered by Alexy on December 28, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP