Very short trick: WordPress, escludere pagine e post dalla ricerca

Il motore interno di WordPress sfruttato per la ricerca (quella standard senza l’aggiunta di plugin) effettua a basso livello una classica query_post(). La ricerca viene svolta dapperttutto, senza escludere nulla. Questa caratteristica può essere tuttavia controllata permettendo, ad esempio, di effettuare una ricerca su tutto tranne che in particolari categorie, pagine o post. Esistono vari modi per “filtrare” la ricerca standard di WordPress, uno è sfruutando il filtro pre_get_posts:

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * Inserire questo codice nel file functions.php
*  Esclude dalla ricerca le pagine/post con id 26,27 e 32
 */

function search_filter($query) {
    if ($query->is_search) {
        $query->set('post__not_in', array(26,27,32));
    }
    return $query;
}

add_filter('pre_get_posts','search_filter');

Questo filtro è interessante e permette di eseguire varie attività sulla nostra query di ricerca. Analizzando il parametro di ingresso $query si può avere un’idea delle operazioni che si possono svolgere:

1
2
3
4
5
6
7
8
9
10
function search_filter($query) {
    if ($query->is_search) {
       echo '<pre>';
       print_r($query);
       echo '</pre>';
    }
    return $query;
}

add_filter('pre_get_posts','search_filter');

Ad esempio è possibile escludere dalla ricerca particolari categorie:

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * Inserire questo codice nel file functions.php
 * Esclude la categoria con id 14
 */

function search_filter($query) {
    if ($query->is_search) {
        $query->set('cat', '-14');
    }
    return $query;
}

add_filter('pre_get_posts','search_filter');

La prima if nel codice determina in che modalità siamo, in questo caso search. Questo significa che possiamo applicare questo filtro anche in altri contesti, come ad esempio:

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * Inserire questo codice nel file functions.php
 * Esclude la categoria con id 14 dai Feed
 */

function search_filter($query) {
    if ($query->is_feed) {
        $query->set('cat', '-14');
    }
    return $query;
}

add_filter('pre_get_posts','search_filter');

6 commenti a: “ ”

  1. 08 lug, 2009 Undolog.com» Very short trick: Wordpress, escludere pagine e post …:

    [...] approfondire consulta articolo originale: Undolog.com» Very short trick: WordPress, escludere pagine e post … Articoli correlati: Very short trick: pagine padri e pagine figlie in WordPress [...]

  2. 09 ott, 2011 matteo:

    Molto interessante. Io però avrei bisogno un’altra cosa ancora: attualmente la ricerca effettua scansione anche sul testo della pagina/post. Come posso modificare la cosa perché non cerchi all’interno del contenuto testuale ma si limiti ad esempio a cercare solo nel titolo e nelle tag?

  3. 10 ott, 2011 Giovambattista Fazioli:

    @matteo:: per cercare solo nel titolo, che ne sappia io, si può agire sulle condizioni di where generate durante la ricerca. Se provi ad inserire nel file functions.php il seguente codice:

    1
    2
    3
    4
    5
    6
    7
    8
    function exclude_post_content($where) {
      if (is_search()) {
        $pattern = '/OR\s*\(\w+\.post_content\s+LIKE\s*(\'[^\']+\')\s*\)/';
        $where = preg_replace( $pattern, "", $where);
    }
    return $where;
    }
    add_filter('posts_where', 'exclude_post_content');

    In pratica elimini la codizione di ricerca del contenuto dalla select che esegue normalmente WordPress.

    Per le ‘tag’ la questione è simile agli esempi che si trovano nell’artiolo, cioè userie il filtero pre_get_posts. Ad esempio, se vuoi cercare solo negli articoli con tag ‘prima-tag’, usa:

    1
    2
    3
    4
    5
    6
    7
    function search_filter($query) {
      if ($query->is_search) {
        $query->set('tag', 'prima-tag');
      }
      return $query;
    }
    add_filter('pre_get_posts','search_filter');
  4. 04 mag, 2012 Gabriele:

    Ciao, articolo interessante. Io avrei bisogno di qualcosa di simile ma con qualche accorgimento. In una pagina prodotto ho un bottone che dovrebbe effettuare una ricerca che ritorna le ricette a base di quel prodotto. Come posso fare sì che vengano restituiti solo questi risultati (che non sono altro che post) omettendo la pagina del prodotto stesso e non modificando la ricerca generica del sito web?
    Grazie

  5. 14 ago, 2012 AleX:

    Grazie Giova, era proprio quello che cercavo.

  6. 24 nov, 2012 Antonio Bonaccorso:

    Ciao bell’articolo … Io sto costruendo un sito gratuito e uso anche qtranslate. Il problema è che il search di wordpress mi riporta i risultati di ricerca nella lingua di default. Stessa cosa vale per i risultati di multiple category widget. Spero tu possa aiutarmi.

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
                   <code></code> // blocco generico
                   [cc_actionscript][/cc_actionscript] // Actionscript
                   [cc_actionscript3][/cc_actionscript3] // Actionscript 3
                   [cc_css][/cc_css] // CSS Style Sheet
                   [cc_html][/cc_html] // HTML
                   [cc_js][/cc_js] // Javascript
                   [cc_objc][/cc_objc] // Objective-C
                   [cc_php][/cc_objc] // PHP
                   [cc_sql][/cc_sql] // SQL