Folosirea pre_get_posts pentru rezultatele de căutare negăsite

17 mai 2012, 18:11:02
Vizualizări: 4.76K
Voturi: 0
function hotlinkers_wp_query($query) {

     // Verificăm dacă interogarea nu este în admin și este o căutare
     if ( !$query->is_admin && $query->is_search) {
            // Înlocuim liniuțele cu spații în termenul de căutare
            $search_query = str_replace('-',' ', $query->query_vars['s']);
            $query->set('s', $search_query);
     }

     return $query;
}
add_action('pre_get_posts', 'hotlinkers_wp_query');

Acest cod este pentru rezultatele de căutare găsite. În search.php am o condiție else, astfel încât dacă nu sunt găsite rezultate, afișez 15 postări aleatorii (folosind wp query).

Doresc să evit acest lucru dacă este posibil de realizat prin pre_get_posts.

1
Comentarii

nu sunt sigur că înțeleg întrebarea - cum ai de știut că nu s-a găsit nimic dacă încă nu ai interogat?

Milo Milo
17 mai 2012 19:06:50
Toate răspunsurile la întrebare 2
0

@Milo are dreptate. Nu poți utiliza pre_get_posts pentru a determina numărul de rezultate, deoarece pre_get_posts modifică o interogare înainte ca aceasta să fie executată (de aceea este atât de util, dar nu pentru acest caz de utilizare).

Nu pot să mă gândesc la o metodă bună de a face asta folosind un filtru. Bucla ta normală este de fapt ceea ce dorești:

if( have_posts() ) : while( have_posts() ) : the_post();

// faci lucruri aici

endwhile;

else :

// nicio rezultată de căutare, rulează o nouă interogare cu WP_Query

endif;
17 mai 2012 23:03:58
0

După cum au menționat și alții, nu poți utiliza pre get posts deoarece nu există nicio modalitate de a ști dacă căutarea a returnat articole sau nu. Aș mai adăuga că utilizarea if else este o metodă foarte clară de a face acest lucru și ar putea fi alegerea mai bună dacă altcineva va lucra la acest proiect.

Dar dacă chiar dorești să o faci cu un filtru pe fie posts_results sau the_posts pentru a returna articolele de înlocuire care ar trebui afișate dacă căutarea este goală.

<?php

add_filter('the_posts', 'np_replace_empty_search', 10, 2);
function np_replace_empty_search($posts, $wp_query){
    if($wp_query->is_search && empty($posts)){
        $new_query = new WP_Query();

        return $new_query->posts;
    }
    return $posts;
}
18 mai 2012 20:04:58