Разрешить отображение некоторых продуктов OutOfStock - PullRequest
0 голосов
/ 23 мая 2019

У меня есть эта проблема / спрос со стороны клиента: Показать все товары со складами> 0 Показать также все товары со складами = 0 и для пользовательского флажка '_show_zero_stock' установлено значение true

Но предоставляется код в functions.phpне работает, как описано.

Я думаю, что проблема только в состоянии «ГДЕ ИСПОЛЬЗОВАТЬ»!is_admin () && $ q-> is_main_query () && $ q-> is_search ', но мне нужна ваша помощь.Я попытался meta_query, но wp с ответом ~ 1s после загрузки страницы meta_query 20s.

Wordpress 5.2.1, Woocommerce 3.5.5, Тема: версии Flastome (дочерние) будут обновлены до последних.

  • если в продукте установлен флажок «_show_zero_stock», то _show_zero_stockсуществует и значение = 'да'
  • присоединиться к postmeta по post_id
  • добавить запрос для фильтрации товаров по условию
function custom_posts_join($join, $q){
 if( ! is_admin() && $q->is_main_query() && $q->is_search) {// No global $wp_query here
    global $wpdb;
    $join .= " LEFT JOIN $wpdb->postmeta as meta_1 ON $wpdb->posts.ID = meta_1.post_id";
 }
 return $join;
}

function filter_function_name_2925( $where, $q ){ // No global $wp_query here
    if( ! is_admin() && $q->is_main_query() && $q->is_search) {
        $where .= " AND ((meta_1.meta_key = '_stock' AND meta_1.meta_value > 0) OR (meta_1.meta_key = '_hide_zero_stock' AND meta_1.meta_value = 'yes' ))"; 
    }
    return $where;
}
add_filter( 'posts_join' , 'custom_posts_join', 10, 2);
add_filter( 'posts_where', 'filter_function_name_2925', 10, 2 );

Ожидаемый результат - показать товары со склада>0 (И) показывает продукты с запасом = 0, который проверил _show_zero_stock

Какие части должны быть затронуты: категории, поиск и поиск ajax [интерфейс]

Какие части не должны быть затронуты: продуктстраницы - URL продукта должен быть доступным и видимым независимо от значения _show_zero_stock

Я пробовал это с meta_query.ужасное влияние производительности:

add_action( 'woocommerce_product_query', 'show_out_of_stock_products' );
function show_out_of_stock_products( $q ) {
$meta_query = $q->get( 'meta_query' );
    $meta_query[] = array(
    'cache_results' => false,
        'relation' => 'OR',
                array(
                    'key' => '_stock',
                    'compare' => '>',
                    'value' => '0',
                    'type'    => 'numeric',
                ),
                array(
                    'relation' => 'AND',
                    array(
                        'key' => '_stock',
                        'compare' => '=',
                        'value' => '0',
                        'type'  => 'numeric',
                    ),
                    array(
                            'key' => '_show_zero_stock',
                            'compare'   => 'EXISTS',
                        )
                )
    );
    $q->set( 'meta_query', array($meta_query) );
}

1 Ответ

0 голосов
/ 23 мая 2019
 $args = array(
      'post_type' => 'product',
      'posts_per_page' => -1,
      'post_status' => 'publish',
      'meta_query' => array(
         array(
            'key' => '_stock',
            'value' => 1,
            'compare' => '<'
         )
      ),
      'fields' => 'ids',
   );`enter code here`
    $product_ids = get_posts( $args ); 
   $product_ids = implode( ",", $product_ids );
This will return all out of stock products
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...