Скрыть товары с нулевой или пустой ценой на страницах архивов Woocommerce - PullRequest
0 голосов
/ 09 октября 2018

Я устанавливаю оптовый магазин с Woocommerce и не могу выяснить следующую проблему.

Я хочу автоматически скрывать или удалять все товары, для которых установлена ​​нулевая цена, или если товар не имеет цены навсе!

Я брожу по сети и нашел следующий код, который должен делать именно то, что мне нужно, но я поместил его в файл дочерней темы functions.php, и он не работает для меня!

Скрыть продукты с нулевой ценой в WooCommerce

add_action( 'woocommerce_product_query', 'react2wp_hide_products_higher_than_zero' );
function react2wp_hide_products_higher_than_zero( $q ){
   $meta_query = $q->get( 'meta_query' );
   $meta_query[] = array(
      'key'       => '_price',
      'value'     => 0,
      'compare'   => '>'
   );
   $q->set( 'meta_query', $meta_query );
}

Скрыть продукты без цены в WooCommerce

add_action( 'woocommerce_product_query', 'react2wp_hide_products_without_price' );
function react2wp_hide_products_without_price( $q ){
   $meta_query = $q->get( 'meta_query' );
   $meta_query[] = array(
      'key'       => '_price',
      'value'     => '',
      'compare'   => '!='
   );
   $q->set( 'meta_query', $meta_query );
}

Источник - https://react2wp.com/woocommerce-hide-products-without-price-simple-fix/

Я использую Woocommerce 3.4.5 и плоская тема (изменение темы тоже не помогло)

Как выяснить, почему код не работает?

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Обновление - Добавлено добавление к автоматического перехода в корзину товаров с нулевой или пустой ценой

Чтобы скрыть оба товара, у которых нетцена или которая имеет нулевую цену со страниц архива как магазина, используйте следующее:

add_filter( 'woocommerce_product_query_meta_query', 'shop_only_instock_products', 10, 2 );
function shop_only_instock_products( $meta_query, $query ) {
    // In frontend only
    if( is_admin() ) return $meta_query;

    $meta_query['relation'] = 'OR';

    $meta_query[] = array(
        'key'     => '_price',
        'value'   => '',
        'type'    => 'numeric',
        'compare' => '!='
    );
    $meta_query[] = array(
        'key'     => '_price',
        'value'   => 0,
        'type'    => 'numeric',
        'compare' => '!='
    );
    return $meta_query;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы).Протестировано и работает.


Но использование чего-то вроде вашего первого фрагмента кода даст тот же результат (цены больше нуля) :

add_filter( 'woocommerce_product_query_meta_query', 'shop_only_instock_products', 10, 2 );
function shop_only_instock_products( $meta_query, $query ) {
    // In frontend only
    if( is_admin() ) return $meta_query;

    $meta_query[] = array(
        'key'     => '_price',
        'value'   => 0,
        'type'    => 'numeric',
        'compare' => '>'
    );
    return $meta_query;
}

Код идетв файле function.php вашей активной дочерней темы (или активной темы).Протестировано и работает.


Перемещение товаров в корзину (без их удаления) с нулевой или пустой ценой.

Следующий код обновит состояние всех продуктов, у которых Ноль или пусто цена, до trash с очень легким прямым запросом SQL .

Вам нужно запускать его только один раз каждый раз, когда вы этого захотите.

// Function that will add products to trash that have Zero price or no price
function auto_add_product_to_trash(){
    global $wpdb;

    $number_of_products_processed = $wpdb->query("
        UPDATE {$wpdb->prefix}posts as a
        JOIN {$wpdb->prefix}postmeta AS b ON a.ID = b.post_id
        JOIN {$wpdb->prefix}postmeta AS c ON a.ID = c.post_id
        SET a.post_status = 'trash'
        WHERE a.post_status LIKE 'publish' AND a.post_type LIKE 'product'
        AND b.meta_key LIKE '_price' AND c.meta_key LIKE '_sale_price'
        AND ( b.meta_value LIKE '' OR b.meta_value LIKE '0' )
        AND c.meta_value != '0'
    ");

    // Return the number of products added to trash
    return $number_of_products_processed;
}

// Execute the function - Run it just once and comment it
auto_add_product_to_trash();

Код находится в файле function.php вашей активной дочерней темы (или активной темы).Протестировано и работает.

Теперь, когда вы переходите на свои продукты в Backend, все продукты с нулевой или пустой ценой находятся в корзине.Вы можете просмотреть их по одному и легко удалить:

enter image description here

Таким образом, все безопасно, так как вы можете восстановить любой продукт, добавленный в корзину.Если вы восстанавливаете продукт, вам нужно установить его статус «опубликовано» (восстановленные продукты получают статус «черновик»)

0 голосов
/ 09 октября 2018

Как дикая догадка: измените react2wp_hide_products_without_price() на 'value'=> '', на 'value'=> 0,

...