2014-04-23 9 views
9

Mam następujący WP_Query argumenty:Zapytanie Wordpress wyświetlające post w pustej tablicy post__in?

$posts = new WP_Query(array(
     'post__in' => $postids, 
     'meta_key' =>'ratings_average', 
     'orderby'=>'meta_value_num', 
     'order' =>'DESC', 
    )); 

$ postids jest tablicą identyfikatory, które są pobierane z innego WP_Query. Mój problem polega na tym, że nawet jeśli $ postids jest pusty, pętla Wordpress pokazuje posty. Jak sobie z tym poradzić, że nie powinien pokazywać żadnego postu, jeśli $ postids jest pusty.

+0

czy to działa, jeśli w zapytaniu znajduje się pole 'post_type'? – celeriko

Odpowiedz

8

To nie jest bezpośrednio ustalające problem z post__in ale ja nie rozumiem, dlaczego to nie działa ..

if(!empty($postids)){ 
    $posts = new WP_Query(array(
     'post__in' => $postids, 
     'meta_key' =>'ratings_average', 
     'orderby'=>'meta_value_num', 
     'order' =>'DESC', 
    )); 
} else { 
    //Do something else or nothing at all.. 
} 

jak widać wywołanie WP_Query będzie tylko wtedy, gdy ma wartość $postids/w tym. jeśli nie, to żadne połączenie nie zostanie wykonane do WP_Query, a pętla nigdy się nie wydarzy, tak samo jak w przypadku, gdy zapytanie zwróciło 0 postów.

+1

Dzięki! to rozwiązało mój problem :), ale zastanawiałem się, dlaczego wordpress pokazuje post, nawet jeśli tablica jest pusta – user48752

+3

jak widać z [tego zgłoszenia błędu] (https://core.trac.wordpress.org/ticket/12212) Twórcy WP wiedzą o tym problemie od jakiegoś czasu, ale wygląda na to, że nie planują go naprawić w najbliższym czasie. Nie przeczytałem całej wątku, ale wydaje się, że powodem, dla którego nie zrobili nic na temat błędu, jest to, że 1) nie mogli uzyskać działającej poprawki i 2) wierzą, że jest to coś, co motyw powinien obsługiwać nie rdzeń. nie jestem pewien, czy się zgadzam, ale nie jestem twórcą pakietu WP, mam nadzieję, że to pomoże! – celeriko

+0

Wielkie dzięki za informacje :) – user48752

0

Może masz jakieś lepkie posty. W takim przypadku WordPress doda te posty do zapytania.

Rozwiązaniem jest ustawienie 'ignore_sticky_posts' => 1. Stosując to do swojego kodu:

$posts = new WP_Query(array(
    'post__in' => $postids, 
    'ignore_sticky_posts' => 1, 
    'meta_key' =>'ratings_average', 
    'orderby'=>'meta_value_num', 
    'order' =>'DESC', 
)); 
0

Aby zachować poprawność przepływu za pomocą WP_Query. Użyj go tak:

$postIdArray = array(
     1, 2, 3 
    ); 

    $queryArgs = array(
     'post_type' => 'any', 
     'post_status' => 'published', 
     'post__in' => ((!isset($postIdArray) || empty($postIdArray)) ? array(-1) : $postIdArray) 
    ); 

W ten sposób nadal będziesz mógł kodować obiekt WP_Query.

Na przykład:

$postIdArray = array(
     1, 2, 3 
    ); 

    $queryArgs = array(
     'post_type' => 'any', 
     'post_status' => 'published', 
     'post__in' => ((!isset($postIdArray) || empty($postIdArray)) ? array(-1) : $postIdArray) 
    ); 

    $postQuery = new \WP_Query($queryArgs); 
    $postCount = $postQuery->post_count; 
    $totalCount = $postQuery->found_posts; 
1

Jak już wspomniano, wp deweloperów nie chce, aby to naprawić. Mimo to możesz przekazać niepustą tablicę nieprawidłowych identyfikatorów, taką jak ta:

if(empty($postids)) { 
    $postids = ['issue#28099']; 
} 

$posts = new WP_Query(array(
    'post__in' => $postids, 
    'meta_key' =>'ratings_average', 
    'orderby'=>'meta_value_num', 
    'order' =>'DESC', 
)); 

Zła praktyka, którą mówisz? Tak, nie jestem pewien z czyjej strony ...

Powiązane problemy