wp query – wyszukiwanie w WordPressie WP_Query obejmujące wiele typów wpisów i ich pola niestandardowe?
Próbuję uczynić domyślne wyszukiwanie WP nieco bardziej inteligentnym, używając niestandardowych pól. Przeszukuje moje niestandardowe typy postów, ale tylko zwykłe pola (fragment, tytuł, treść).
W moich argumentach do WP_Query określam wszystkie typy postów. Ale nie jestem pewien, jak precyzyjnie określić wszystkie pola niestandardowe za pomocą OR
ponieważ w zasadzie szukam treści w każdym typie postu.
Poniższy kod nie działa, zwraca 0 wyników dla słowa kluczowego quality
na przykład. Ale bezpośrednie wyszukiwanie w MySQL na wp_postmeta
tabela sugeruje, że jest 12 postów ze słowem jakość. Chcę, aby moje zapytanie wydobyło je wszystkie.
Jaki jest właściwy sposób uwzględnienia ich w WP_Query?
- Brak filtrów/akcji
- Żadnych wtyczek. Chciałbym to teraz zrobić bezpośrednio w WP_Query, a musi obsługiwać dwa języki. Będę musiał wyszukiwać tylko jeden język w każdej wyszukiwarce (PolyLang).
Kod:
$SEARCH = $_GET['s'];
$args = array(
's' => $SEARCH
,'orderby' => 'relevance'
,'post_type' => array('page', 'services', 'resources', 'events', 'reports', 'posts')
,'post_status' => 'publish'
,'posts_per_page' => 15
,'meta_query' => array(
'relation' => 'OR'
// SEARCH THROUGH "reports" post type's custom fields
,array(
'key' => 'report_content',
'value' => "$SEARCH",
'compare' => 'LIKE'
)
,array(
'key' => 'report_details',
'value' => "$SEARCH",
'compare' => 'LIKE'
)
// SEARCH THROUGH "events" post type's custom fields
,array(
'key' => 'event_brief',
'value' => "$SEARCH",
'compare' => 'LIKE'
)
)
);
To, co próbuję zrobić powyżej, to wyszukać słowo w zmiennej $SEARCH wewnątrz tych pól niestandardowych.
EDYCJA: Dodam tylko, że oddzielne zapytania działają. Ale zamiast wywoływać WP_Query
trzy razy, chciałbym łączyć je w jedno. Przejrzałem dziesiątki postów „Chcę połączyć meta_query i tax_query” na Stack Overflow, ale żaden z nich nie dotyczył łączenia różny post_types w warunku OR, jak potrzeba w wyszukiwaniu na stronie internetowej. Trzy, które działają indywidualnie:
//MAIN QUERY
$args = array(
's' => $SEARCH
,'orderby' => 'relevance'
,'post_type' => array('page', 'services', 'resources', 'events', 'reports', 'posts')
,'post_status' => 'publish'
,'posts_per_page' => 15
);
// SEARCH THROUGH REPORTS
$args2 = array(
'post_type' => 'reports'
,'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'report_content',
'value' => "$SEARCH",
'compare' => 'LIKE',
),
array(
'key' => 'report_details',
'value' => "$SEARCH",
'compare' => 'LIKE',
),
),
);
// SEARCH THROUGH EVENTS
$args3 = array(
'post_type' => 'events'
,'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'event_brief',
'value' => "$SEARCH",
'compare' => 'LIKE',
),
array(
'key' => 'event_instruction',
'value' => "$SEARCH",
'compare' => 'LIKE',
),
),
);
Ale łącząc je w ten niezdarny sposób:
$wp_query = new WP_Query( $args);
$wp_query2 = new WP_Query( $args2);
$wp_query3 = new WP_Query( $args3);
$posts = $wp_query->posts;
$posts2 = $wp_query2->posts;
$posts3 = $wp_query3->posts;
$posts = array_unique( array_merge(
$posts
,$posts2
,$posts3
) );
Nie działa. Daje okropny błąd:
Uncaught Error: Object of class WP_Post could not be converted to string
Tak czy inaczej, chciałbym je połączyć meta_query
z warunkiem OR między nimi. Znalazłem wiele przykładów meta_query, ale zakładają one, że AND… jak we wszystkich tych meta_query powinno być dopasowane. To nie jest to, czego chcę. Wielkie dzięki.