WordPress

wp query – wyszukiwanie w WordPressie WP_Query obejmujące wiele typów wpisów i ich pola niestandardowe?

  • 10 kwietnia, 2022
  • 3 min read
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?

  1. Brak filtrów/akcji
  2. Ż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.

Warto przeczytać!  9 najlepszych miejsc, w których można uzyskać niestandardowe logo dla swojej witryny WordPress

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:

Warto przeczytać!  css — Oddzielne elementy sterujące typografią dla tytułów i meta w bloku niestandardowym?

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.


Źródło