Введите часть искомого слова, названия или фразы...
↑ ↓
  1. Новые темы озаглавленные с маленькой буквы - удаляются без предупреждения!
  2. Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!

Решено Сортировка по наличию

Тема в разделе "Ищу плагин, функционал", создана пользователем hardwaremaster, 2 сен 2015.

  1. hardwaremaster

    hardwaremaster

    Сообщения:
    26
    Симпатии:
    9
    Баллы:
    3
    Коллеги, нужна помощь, может кто-то уже сталкивался, но на форуме вроде не нашел эту тему. Как можно вывести товары по наличию, т.е. те которых нет в наличии выводить в самом конце? Искал пока ничего не нарыл кроме как того что вроде нужно хук цеплять на
    woocommerce_get_catalog_ordering_args
     
  2. searchingman

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    553
    Баллы:
    113
    По материалам статьи от ADv, за что ему спасибо!
    В functions.php своей темы вставляем код.
    PHP:
    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'] ) ? woocommerce_clean$_GET['orderby'] ) : apply_filters'woocommerce_default_catalog_orderby'get_option'woocommerce_default_catalog_orderby' ) );

    if ( 
    'stock_list_asc' == $orderby_value ) {
        
    $args['orderby'] = 'meta_value_num wp_posts.ID';
        
    $args['order'] = 'ASC';
        
    $args['meta_key'] = '_stock';
    }
    elseif ( 
    'stock_list_desc' == $orderby_value ) {
        
    $args['orderby'] = 'meta_value_num wp_posts.ID';
        
    $args['order'] = 'DESC';
        
    $args['meta_key'] = '_stock';
    }

    return 
    $args;
    }

    add_filter'woocommerce_default_catalog_orderby_options''custom_woocommerce_catalog_orderby' );
    add_filter'woocommerce_catalog_orderby''custom_woocommerce_catalog_orderby' );

    function 
    custom_woocommerce_catalog_orderby$sortby ) {
    $sortby['stock_list_desc'] = 'Остаток: по убыванию';
    $sortby['stock_list_asc'] = 'Остаток: по возрастанию';
    return 
    $sortby;
    }
    В итоге не теме storefront выглядит так.
    1. В админке появились 2 пункта сортировки. http://take.ms/vPPik
    Можно выбрать нужный пункт по умолчанию.
    2. В публичной части появились 2 новых пункта сортировки. http://take.ms/5ye1G
     
    • Нравится Нравится x 1
    • Согласен Согласен x 1
    • Не согласен Не согласен x 1
  3. hardwaremaster

    hardwaremaster

    Сообщения:
    26
    Симпатии:
    9
    Баллы:
    3
    searchingman, спасибо за помощь как всегда (y), но у меня оказалось проблема чуть в другом, понял это уже после того как написал тут. Но этот код очень кстати! Думаю многим будет полезен, еще раз спасибо!
     
  4. Vladimirus

    Vladimirus

    Сообщения:
    2
    Симпатии:
    2
    Баллы:
    3
    Вот еще интересный код вставляется в functions.php
    PHP:
    class iWC_Orderby_Stock_Status
    {

        public function 
    __construct()
        {
            
    // Check if WooCommerce is active
            
    if (in_array('woocommerce/woocommerce.php'apply_filters('active_plugins'get_option('active_plugins')))) {
                
    add_filter('posts_clauses', array($this'order_by_stock_status'), 2000);
            }
        }

        public function 
    order_by_stock_status($posts_clauses)
        {
            global 
    $wpdb;
            
    // only change query on WooCommerce loops
            
    if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
                
    $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
                
    $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " $posts_clauses['orderby'];
                
    $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " $posts_clauses['where'];
            }
            return 
    $posts_clauses;
        }
    }

    new 
    iWC_Orderby_Stock_Status;
     
    • Нравится Нравится x 1
  5. cwolo4

    cwolo4

    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    обьясните мне как это может работать?
    $args['meta_key'] = '_stock'; ключа "_stock" не существует, тут скорее всего _stock_status
    $args['orderby'] = 'meta_value_num wp_posts.ID'; в это вообще как?

    а где запрос/фильтрация к таблице wp_postmeta, ведь в ней мы ведем учет статуса наличия товара
    ниже что приведен код работает как сортировка по умолчанию, сначала тот товар, что есть в наличии, затем того что нет, но хотелось бы применить сортировку, по наличию, сначала те что есть, нажал на кнопку и сортировка вначале тех что нет
     
  6. searchingman

    searchingman Местный

    Сообщения:
    1.634
    Симпатии:
    553
    Баллы:
    113
    Нас рассудят исходники плагина.
    Откройте файл \wp-content\plugins\woocommerce\includes\abstracts\abstract-wc-product.php (ссылка на GitHub)
    Код из того же файла из public function set_stock()
    PHP:
    // Update stock in DB directly
                
    switch ( $mode ) {
                    case 
    'add' :
                        
    $wpdb->query$wpdb->prepare"UPDATE {$wpdb->postmeta} SET meta_value = meta_value + %f WHERE post_id = %d AND meta_key='_stock'"$amount$this->id ) );
                    break;
                    case 
    'subtract' :
                        
    $wpdb->query$wpdb->prepare"UPDATE {$wpdb->postmeta} SET meta_value = meta_value - %f WHERE post_id = %d AND meta_key='_stock'"$amount$this->id ) );
                    break;
                    default :
                        
    $wpdb->query$wpdb->prepare"UPDATE {$wpdb->postmeta} SET meta_value = %f WHERE post_id = %d AND meta_key='_stock'"$amount$this->id ) );
                    break;
                }
    meta_key='_stock' !!!
     
    Последнее редактирование: 15 ноя 2016
  7. cwolo4

    cwolo4

    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    ага и если мы не указали колличество то в итоге таблица будет
    [​IMG]
    а надо сортировку по ключу _stock_status
    [​IMG]
    тогда сортировка будет instock, потом по outofstock тогда количество не играет роли в сортировке.


    первый же код сортировки не сортирует по наличию, основа его взята от сюда https://docs.woocommerce.com/document/custom-sorting-options-ascdesc/ ,
    тут же указано что можно туда вносить https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters
    $args['orderby'] = 'meta_value_num';//поле по которому сортируем
    $args['order'] = 'DESC';//по возрастанию (ASC) или убыванию (DESC)
    $args['meta_key'] = '';//по конкретному совпадению ключа, нам бы не плохо было бы вставить _stock_status , но его то нет .
    Помогите туда добавить данный запрос, что бы товар сортировался по статусу наличия, а не по его остатку на складе.
     
    Последнее редактирование: 15 ноя 2016