З деяким вразливим рішенням, розміщеним тут, я надходжу з трохи спрощеною та санітарною версією.
По-перше, ми створюємо функцію для 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()
.