Muszę zrobić WP_Query
z LIKE
na post_title
.
Zacząłem od tego regularnego WP_Query
:
$wp_query = new WP_Query(
array (
'post_type' => 'wp_exposants',
'posts_per_page' => '1',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
'paged' => $paged
)
);
Ale tak naprawdę chcę to zrobić w SQL:
$query = "
SELECT *
FROM $wpdb->posts
WHERE $wpdb->posts.post_title LIKE '$param2%'
AND $wpdb->posts.post_type = 'wp_exposants'
ORDER BY $wpdb->posts.post_title
";
$wpdb->get_results($query);
Dane wyjściowe drukują wyniki, których oczekuję, ale używam zwykłego, <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
aby wyświetlić wyniki.
I to nie działa $wpdb->get_results()
.
Jak mogę osiągnąć to, co tutaj opisałem?
$wpdb->prepare()
.prepare()
.$wpdb->prepare('LIKE "%s%%"', 'banana')
wróci"LIKE ''banana'%'"
, więc musimy sami zbudować zapytanie i wykonać ucieczkę.prepare()
. Tak, to trudne i musiałem spróbować kilka razy, zanim się obejrzałem. Od czegoś Zrobiłem:$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )
. I jestem prawie pewien, żeesc_sql()
jest to niepotrzebne i po prostu paranoiczne.'
(apostrofem) w środku. Myślę, że to z powodu ucieczki? Nie znalazłem jeszcze rozwiązaniaUproszczony:
źródło
Chciałeś zaktualizować ten kod, nad którym pracowaliście dla wordpress 4.0 i wyżej, ponieważ esc_sql () jest przestarzałe w wersji 4.0 wyższej.
Reszta rzeczy jest taka sama.
Chciałbym również zaznaczyć, że możesz użyć zmiennej s w argumentach WP_Query, aby przekazać wyszukiwane hasła, które, jak sądzę, będą również wyszukiwać tytuł postu.
Lubię to:
źródło
search_prod_title
jest? Czy powinienem zmienić to na coś innego?esc_sql
tracony? To nie jest.$wpdb->escape
jest jednak ... developer.wordpress.org/reference/functions/esc_sqlPo opublikowaniu tutaj jakiegoś wrażliwego rozwiązania dostarczam nieco uproszczoną i odkażoną wersję.
Najpierw tworzymy funkcję
posts_where
filtra, która pozwala wyświetlać tylko posty spełniające określone warunki:Teraz dodajemy
cc_search_post_title
do naszych argumentów zapytania:I wreszcie owiń filtr wokół zapytania:
Korzystanie z get_posts ()
Niektóre funkcje pobierające posty nie uruchamiają filtrów, więc dołączone funkcje filtru posts_where nie zmodyfikują zapytania. Jeśli planujesz używać
get_posts()
zapytania do swoich postów, musisz ustawić wartośćsuppress_filters
false w tablicy argumentów:Teraz możesz użyć
get_posts()
:Co z
s
parametrem?s
Parametr jest dostępny:Dodając wyszukiwane hasło do
s
parametru praca i przeszukuje tytuł postu, przeszukuje również treść postu.Co z
title
parametrem dodanym do WP 4.4?Przekazywanie wyszukiwanego terminu do
title
parametru:Rozróżnia małe i wielkie litery, a
LIKE
nie%LIKE%
. Oznacza to, że wyszukiwaniehello
nie zwróci postu z tytułemHello World
lubHello
.źródło
Opierając się na innych odpowiedziach przede mną, aby zapewnić elastyczność w sytuacji, w której chcesz wyszukać post zawierający słowo w polu meta LUB w tytule wpisu, podam tę opcję za pomocą argumentu „tytuł_plik_filtrowy”. W tej implementacji zezwalam tylko na wejścia „OR” lub „AND” z domyślną wartością „AND”.
Oto przykład kodu w działaniu dla bardzo prostego typu posta „faq”, w którym pytaniem jest sam tytuł posta:
źródło
WP_Query
, aby mieć dostęp do nich wposts_where
filtrze.