Задача. В сайте на Woocommerce необходимо реализовать возможность вывода товаров без цены и значением 0 в конце каталога, после всех товаров, вне зависимости от выбранной сортировки.
Решение 1. Код работает точно на дефолтной теме (Storefront). На сайте заказчика не работает: срабатывает в основном Каталоге, но в категориях выводит «Товаров, соответствующих вашему запросу, не обнаружено». Возможно что-то переопределено в процессе доработок сайта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Товары без цены или с ценой равной нулю будут в конце списка add_filter('posts_clauses', 'order_by_no_price', 50, 2); function order_by_no_price($posts_clauses) { global $wpdb; if (!is_admin() && is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy())) { if($posts_clauses['join']!=' LEFT JOIN wp_wc_product_meta_lookup wc_product_meta_lookup ON wp_posts.ID = wc_product_meta_lookup.product_id '){ $posts_clauses['join'] = $posts_clauses['join'] . " LEFT JOIN wp_wc_product_meta_lookup wc_product_meta_lookup ON wp_posts.ID = wc_product_meta_lookup.product_id "; } $posts_clauses['orderby'] = "wc_product_meta_lookup.min_price > 0 DESC, " . $posts_clauses['orderby']; } return $posts_clauses; } |
Решение 2. Еще как вариант может пригодиться вывод товаров в конце которых нет в наличии:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class iWC_Orderby_Stock_Status { public function __construct() { 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; 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; |
Для себя решил это с помощью следующего костыля:
1. Стоял уже код, выводящий Цена по запросу для цены 0. Заменил в коде 0 на 9999999999, ибо такой цены у меня быть не может:
2. В массовом редакторе заменил цены товаров с 0 на 9999999999
3. Сортировка товаров по-умолчанию: по возрастанию цены
Эффект достигнут
и в корзину товары попадают с ценой 9999999999999 ?
да, в корзине и в товарном фиде, 9999999999999. Будем думать дальше
Решение простое — стираем цену. Добавить в корзину нельзя, можно Купить в 1 клик (оставить контакты), а В наличии меняем на под заказ.