Cum să faci o căutare WP_Query cu tipuri de postări personalizate?

13 feb. 2014, 19:19:07
Vizualizări: 32K
Voturi: 9

Am înregistrat un tip de postare personalizat numit "node".

Când creez un WP_Query basic pentru a obține postări de acest tip, funcționează perfect. Exemplu:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node');

$query = new WP_Query($args);       

Aceasta va returna toate postările publicate de tipul "node".

Cu toate acestea, imediat ce combin aceasta cu o căutare, nu se returnează nimic. Exemplu:

$args = array(  
'post_status' => 'publish',
'post_type' => 'node',
's' => 'Termenul meu de căutare');

$query = new WP_Query($args);

Aceasta nu va returna nimic, deși ar trebui să returneze mai multe postări de tipul 'node' care conțin 'Termenul meu de căutare'.

Din ce pot vedea, tipurile de postări sunt setate automat la "post" și "page" imediat ce includ parametrul "s" în $args. Dacă afișez un var_dump al $query, arată următoarele:

Fără "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=63)
      'post_status' => string 'publish' (length=7)
      'post_type' => string 'node' (length=4)
...

Cu "s":

object(WP_Query)
  public 'query' => 
    array (size=2)
      'post_status' => string 'publish' (length=7)
      's' => string 'Termenul meu de căutare' (length=14)
      'post_type' => string 'node' (length=4)
  public 'query_vars' => 
    array (size=66)
      'post_status' => string 'publish' (length=7)
      's' => string 'Termenul meu de căutare' (length=14)
      'post_type' => 
        array (size=2)
          0 => string 'post' (length=4)
          1 => string 'page' (length=4)
...

Deci WordPress pare să suprascrie tipurile de postări imediat ce este implicată o căutare.

Cum pot rezolva această problemă?

4
Comentarii

Nu pot confirma acest lucru. Tocmai am testat ceva foarte asemănător - cu succes. Ai încercat fără niciun plugin și/sau folosind o temă implicită? Chiar și căutarea (adică căutarea principală, folosind formularul de căutare) include toate tipurile de postări personalizate care nu sunt excluse explicit din căutare.

tfrommen tfrommen
13 feb. 2014 20:57:56

De fapt, am scris o căutare în această dimineață care a folosit post_type (un CPT), post_status (publicat) și s și funcționează perfect. Aproape sigur ai un filtru sau ceva într-un plugin/temă, așa cum a sugerat @tf.

Andrew Bartel Andrew Bartel
13 feb. 2014 23:36:40

Nu am reușit să testez acest lucru, dar sunt aproape 95% sigur că am făcut ceva similar și a funcționat. Sunt de acord cu speculația despre interferența acțiunii filtrului.

s_ha_dum s_ha_dum
14 feb. 2014 00:02:32

Ai dreptate, am încercat într-o instalare curată de WordPress și funcționează. Se pare că unul dintre plugin-urile pe care le folosesc în mediul meu se conectează la unul dintre evenimentele pre-query. Mulțumesc!

Sebastian Sebastian
17 feb. 2014 16:57:03
Toate răspunsurile la întrebare 4
1

Ai dreptate, am încercat într-o instalare curată de WordPress și funcționează.

Se pare că unul dintre plugin-urile pe care le folosesc în mediul meu se conectează la unul dintre evenimentele pre-query.

Mulțumesc!

17 feb. 2014 17:13:47
Comentarii

Știi care plugin a cauzat această problemă?

stefano1 stefano1
9 oct. 2014 19:21:23
0

Într-o instalare standard WordPress, WP_Query va folosi implicit post_type = 'post'.

Luați în considerare acest exemplu simplu:

$args = array(
  "posts_per_page"=>5,
  "ignore_sticky_posts"=>true
);

$itposts = new WP_Query( $args );

Acest lucru va rezulta în următoarea interogare executată:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

CEA MAI BUNĂ SOLUȚIE

Soluția este să adăugați un argument post_type setat la 'any'. În acest fel, WordPress va căuta automat în toate tipurile, cu excepția reviziilor și a tipurilor cu exclude_from_search setat la true. Problema este că, implicit, atașamentele nu sunt excluse din căutare. Atâta timp cât nu aveți un argument post_status setat la 'inherit', nu ar trebui să aveți probleme, deoarece atașamentele au întotdeauna post_status setat la 'inherit'.

Astfel, interogarea se va schimba în:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 5

Dacă este necesar, puteți exclude atașamentele din căutare folosind acest cod:

add_action('init', 'exclude_attachments_from_search');

function exclude_attachments_from_search() {
  global $wp_post_types;

  $wp_post_types['attachment']->exclude_from_search = true;
}
29 apr. 2015 08:57:24
0

Tocmai am dat peste această problemă, iar următoarea soluție a funcționat pentru mine:

în loc de 'post_type' => 'node' încearcă 'post_type' => ['node']

18 ian. 2023 21:44:23
0
-2

Știu că aceasta este o întrebare foarte veche, dar am dat peste ea pentru că am avut aceeași problemă. Nu pot comenta din cauza reputației, dar vreau să ajut oameni precum @Stefano, astfel încât să nu fie nevoie să parcurgeți toate pluginurile și să verificați care dintre ele provoacă modificarea interogării.

În cazul meu, a fost un plugin numit "Custom Search by BestWebSoft". Dar nu a fost vina pluginului, ci pur și simplu nu bifasem caseta pentru tipul meu de postare personalizată în setările sale.

5 sept. 2018 12:04:08