>

클라이언트의이 문제/요구 사항이 있습니다. 재고가>0 인 모든 제품 표시 재고가 0이고 맞춤 확인란이 '_show_zero_stock'인 모든 제품 표시

그러나 functions.php에 제공된 코드는 설명대로 작동하지 않습니다.

문제는 '사용처'조건에만있는 것 같아요! is_admin ()&&$q->is_main_query ()&&$q->is_search '하지만 도움이 필요합니다. meta_query를 시도했지만 ~ 1s 응답을 가진 wp는 meta_query 20s pageload 이후에 있습니다.

Wordpress 5.2.1, Woocommerce 3.5.5, 테마 : Flastome (자식) 버전이 최신 버전으로 업그레이드됩니다.

  • 제품의 '_show_zero_stock'확인란이 선택된 경우 _show_zero_stock이 존재하고 value = 'yes'
  • post_id로 postmeta 가입
  • 조건에 따라 제품을 필터링하는 쿼리 추가
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보다 큰 제품 표시 (AND) _show_zero_stock을 (를) 확인한 재고가 0 인 제품 표시

어느 부분이 영향을 받아야 하는가 : 카테고리, 검색 및 아약스 검색 [프론트 엔드]

어느 부분이 영향을받지 않아야하는지 : 제품 페이지-_show_zero_stock 값

에 관계없이 제품 URL에 액세스 할 수 있어야합니다.

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

    $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
    
    

  • 이전 internet explorer - IE11에서 정의되지 않은 IndexedDB
  • 다음 javascript - 문자열에서 두 번 이상 나타나는 문자를 삭제하는 방법