Po dłuższym czasie pracy z WordPressem prawdopodobnie w pewnym stopniu pracowałeś z metadanymi posta. Być może po prostu czytałeś metadane z bazy danych, a może zarówno zapisywałeś, jak i czytałeś z tabeli bazy danych.
Może to być naprawdę potężny interfejs API, gdy potrzebujesz powiązać określone informacje z twoimi postami (lub, jeśli jesteś jeszcze bardziej abstrakcyjny, z twoimi modelami).
To powiedziawszy, co się dzieje, gdy chcesz uwzględnić informacje z tabeli metadanych, ale nie masz wygody wtyczek, takich jak SearchWP lub Relevanssi?
Ponadto załóżmy, że przypadek użycia dotyczy tylko administratorów i dotyczy tylko obszaru administracyjnego WordPress. Oznacza to, że chcesz przeszukiwać swoje posty z poziomu ekranu Wszystkie posty, ale chcesz również uwzględnić metadane postów w kryteriach wyszukiwania.
Co wtedy?
Wyszukaj metadane posta
Po wyjęciu z pudełka, za każdym razem, gdy szukasz postów w obszarze administracyjnym WordPress, wyszuka on frazę w tytule posta, fragmencie posta i treści posta, a następnie zwróci te wyniki.
Aby więc rozszerzyć wyszukiwanie o metadane wpisu, musimy zaktualizować uruchomione zapytanie tak, aby zawierało tabele metadanych wpisu. Ale jest w tym coś więcej. W szczególności, aby uzyskać największą elastyczność i najlepsze wrażenia użytkownika, będziesz chciał:
- wstawiaj fragmenty frazy, aby nie szukało czegoś dosłownie w artykule,
- i oczywiście prawidłowo obsłużyć przypadek, w którym nie wprowadzono żadnego hasła wyszukiwania, aby ekran Wszystkie posty nadal mógł być wyświetlany w standardowym formacie.
Oznacza to, że nie tylko musimy zmodyfikować zapytanie wyszukiwania, aby zawierało klucz meta i wartość meta, ale także musimy odpowiednio zmienić znaczenie całych fraz, aby móc użyć LIKEoperacji zamiast INoperacji lub =operacji.
Niektóre z rzeczy, które warto wiedzieć przed przeczytaniem reszty tego artykułu, to:
- WP_Query
- The posts_where haczyk
- Hak pre_get_posts _
- Wyrażenia regularne z preg_replace
- Funkcje pomocnicze WordPress, a mianowicie esc_sql.
Ostatecznie będziemy potrzebować dwóch hooków z dwoma niestandardowymi funkcjami. A ponieważ nie mogę podać pełnego przykładu tego, jak to może wyglądać w twoim przypadku użycia, kod musi być nieco uogólniony.
Podłączanie do wyszukiwania
W poniższym skrócie zobaczysz trzy rzeczy:
- Weryfikacja, że użytkownik znajduje się w obszarze administracyjnym i znajduje się na stronie edycji.
- Użytkownik wprowadził wyszukiwanie.
- Wyszukiwana fraza została przekonwertowana na tablicę, zmieniona i dodana do właściwości meta zapytania wystąpienia WP_Query.
<?php
add_filter('pre_get_posts', function ($query) {
// Make sure we're in the admin, an administrator, and on the edit page.
if (!is_admin() || !current_user_can('manage_options') || 'edit' !== get_current_screen()->base) {
return;
}
// Determine if the user is running a search.
$search = filter_input(INPUT_GET, 's', FILTER_SANITIZE_STRING);
if (empty($search)) {
return;
}
$query->set(
'meta_query',
[
[
'key' => 'headline_notes',
'value' => esc_sql(preg_replace('/s+?/', '%', $search)), // For flexible search, make sure to replace all white space with % for LIKE.
'compare' => 'LIKE',
],
]
);
});
Zakładając, że wszystkie powyższe są prawdziwe, spowoduje to zaktualizowanie zapytania uruchomionego w bazie danych WordPress przed wyrenderowaniem następnej strony, tak aby wyniki zawierały informacje o metadanych.
Aktualizacja klauzuli WHERE
Zanim jednak skończymy, musimy również upewnić się, że zaktualizowaliśmy uruchomione zapytanie.
Domyślnie zapytanie jest budowane przy użyciu ANDoperacji, co uniemożliwia nam poprawne przeglądanie tytułów postów, fragmentów, treści i metadanych; jednak zapytanie musi zostać zaktualizowane, aby używało ORoperacji.
Dosłownie oznacza to, że będzie wyglądać w tytule, treści, fragmencie lub metadanych.
Zdecydowałem się użyć wyrażenia regularnego w mojej implementacji, ale Twoja implementacja może działać z zastępowaniem podciągów. W związku z tym jest trochę skomentowane, aby zapewnić największą elastyczność.
<?php
add_filter( 'posts_where', function($where, $query) {
// Determine if 'headline_notes' appears in the WHERE clause.
$position = strpos($where, 'acme_meta_key');
if (false === $position) {
return $where;
}
// Look for the 'AND' clasue and replace it with 'OR' in the WHERE clause.
$regularExpress = '//mi'; // Your regular expression.
$replacement = ''; // Your string to replace.
return preg_replace(
$regularExpression,
$replacement,
$where
);
}, 10, 2);
To aktualizuje WHEREklauzulę, która jest uruchamiana w celu zakończenia pracy ustawionej w początkowej części artykułu, w której dodajemy metadane.
Są inne sposoby
Zwróć uwagę, że istnieje kilka niezwykle elastycznych sposobów pracy z WP_Query, aby uzyskać potrzebne wyniki. Twoja implementacja będzie się różnić w zależności od tego, co robisz.
Rozważ więc ten jeden z wielu sposobów, które można wykorzystać; wiedz jednak, że jeśli masz:
- jeden klucz,
- wartość (lub wartość, którą można podzielić na tablicę),
- i chcesz wyszukiwać metadane obok tradycyjnej treści postu
Wtedy to zadziała.
