Мне нужно сделать WP_Query
с собой LIKE
на post_title
.
Я начал с этого регулярно 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
)
);
Но то, что я на самом деле хочу сделать, выглядит так в 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);
Вывод выводит результаты, которые я ожидаю, но я использую регулярное <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
отображение результатов.
И это не работает с $wpdb->get_results()
.
Как я могу добиться того, что я описал здесь?
$wpdb->prepare()
.prepare()
.$wpdb->prepare('LIKE "%s%%"', 'banana')
будет возвращаться"LIKE ''banana'%'"
, поэтому мы должны сами построить запрос и выполнить экранирование тоже.prepare()
. Да, это сложно, и я должен был попробовать это несколько раз, прежде чем обойти это. От чего - то я только что сделал:$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )
. И я уверен, чтоesc_sql()
это не нужно и просто параноик.'
(апостроф) внутри. Я думаю, это из-за побега? Я еще не нашел решенияУпрощенная:
источник
Хотели обновить этот код, над которым вы работали, для WordPress 4.0 и выше, так как esc_sql () устарела в 4.0 и выше.
Остальные вещи такие же.
Также я хочу отметить, что вы можете использовать переменную s в аргументах WP_Query для передачи поисковых терминов, которые, как я полагаю, также будут искать заголовок поста.
Так:
источник
search_prod_title
? Должен ли я изменить это на что-то еще?esc_sql
пор он изгнан? Это не.$wpdb->escape
хотя ... developer.wordpress.org/reference/functions/esc_sqlС некоторым уязвимым решением, опубликованным здесь, я пришел с немного упрощенной и продезинфицированной версией.
Сначала мы создаем функцию для
posts_where
фильтра, которая позволяет отображать только сообщения, соответствующие определенным условиям:Теперь мы добавим
cc_search_post_title
в наш запрос аргументы:И, наконец, оберните фильтр вокруг запроса:
Использование get_posts ()
Некоторые функции, которые извлекают сообщения, не запускают фильтры, поэтому прикрепленные вами функции фильтра posts_where не будут изменять запрос. Если вы планируете использовать
get_posts()
для запроса ваших сообщений, вам нужно установитьsuppress_filters
значение false в массив аргументов:Теперь вы можете использовать
get_posts()
:Как насчет
s
параметра?s
Параметр доступен:При добавлении вашего поискового термина в
s
параметр работа, и он будет искать заголовок сообщения, он также будет искать содержимое сообщения.Как насчет
title
параметра, который был добавлен в WP 4.4?Передача поискового термина в
title
параметр:Чувствителен к регистру и
LIKE
, нет%LIKE%
. Это означает, что поискhello
не вернет сообщение с заголовкомHello World
илиHello
.источник
Основываясь на других ответах до меня, чтобы обеспечить гибкость в ситуации, когда вы хотите найти пост, содержащий слово в метаполе или в заголовке поста, я даю эту опцию через аргумент «title_filter_relation». В этой реализации я допускаю только ввод «ИЛИ» или «И» со значением по умолчанию «И».
Вот пример кода в действии для очень простого типа поста "faq", где вопрос - сам заголовок поста:
источник
WP_Query
, чтобы иметь возможность доступа к ним вposts_where
фильтре.