С некоторым уязвимым решением, опубликованным здесь, я пришел с немного упрощенной и продезинфицированной версией.
Сначала мы создаем функцию для posts_where
фильтра, которая позволяет отображать только сообщения, соответствующие определенным условиям:
function cc_post_title_filter($where, &$wp_query) {
global $wpdb;
if ( $search_term = $wp_query->get( 'cc_search_post_title' ) ) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . $wpdb->esc_like( $search_term ) . '%\'';
}
return $where;
}
Теперь мы добавим cc_search_post_title
в наш запрос аргументы:
$args = array(
'cc_search_post_title' => $search_term, // search post title only
'post_status' => 'publish',
);
И, наконец, оберните фильтр вокруг запроса:
add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 );
$query = new WP_Query($args);
remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
Использование get_posts ()
Некоторые функции, которые извлекают сообщения, не запускают фильтры, поэтому прикрепленные вами функции фильтра posts_where не будут изменять запрос. Если вы планируете использовать get_posts()
для запроса ваших сообщений, вам нужно установить suppress_filters
значение false в массив аргументов:
$args = array(
'cc_search_post_title' => $search_term,
'suppress_filters' => FALSE,
'post_status' => 'publish',
);
Теперь вы можете использовать get_posts()
:
add_filter( 'posts_where', 'cc_post_title_filter', 10, 2 );
$posts = get_posts($args);
remove_filter( 'posts_where', 'cc_post_title_filter', 10 );
Как насчет s
параметра?
s
Параметр доступен:
$args = array(
's' => $search_term,
);
При добавлении вашего поискового термина в s
параметр работа, и он будет искать заголовок сообщения, он также будет искать содержимое сообщения.
Как насчет title
параметра, который был добавлен в WP 4.4?
Передача поискового термина в title
параметр:
$args = array(
'title' => $search_term,
);
Чувствителен к регистру и LIKE
, нет %LIKE%
. Это означает, что поиск hello
не вернет сообщение с заголовком Hello World
или Hello
.
$wpdb->prepare()
.