Cum să faci o căutare WP_Query cu tipuri de postări personalizate?
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ă?

Î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;
}

Ș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.
