Искать все (сообщения, страницы, теги, cpt, мета)
Я хотел бы знать, как использовать встроенный поиск wordpress для возврата результатов со всего контента на моем сайте. В частности, я хочу выполнить поиск;
- сообщения
- страницы
- теги
- пользовательский тип публикации (портфолио)
- пользовательская таксономия, используемая в пользовательском типе записи (навык, клиент)
- метабоксы, используемые в пользовательском типе записи (portfolio_caption, portfolio_excerpt, portfolio_credits, portfolio_линки)
Я хотел бы получить одну форму поиска и не нужно ограничивать поиск определенными типами записей или категориями. Просто введите поисковый запрос > нажмите поиск > посмотреть совпадения со всем контентом на моем сайте. Просто;)
Обновление: Предпочтительно, я бы достиг этого с помощью функции или пользовательского запроса к базе данных, а не с помощью плагина. Это связано с тем, что я разрабатываю тему и хочу, чтобы эта функциональность была включена из коробки, а не требовала от пользователя загрузки плагина. (название изменено)
3 answers
DeluxeBlogTips.com 1) есть статья о том, как выполнять комбинированный поиск как в сообщениях, так и в метаданных. В основном, это включает в себя два запроса через объект $wpdb; один для поиска в мета-таблице, чтобы получить список post_id
s, а другой - запрос сообщений, чтобы получить post_id
s. Затем вы объединяете массивы и используете их для выполнения запроса с WP_Query
, используя аргумент posts__in
.
Использование тегов может быть немного сложным, потому что 1. теги предназначены для группировки сообщений вместе и 2. теги и таксономии включают 3 различные таблицы.
1) Связанная статья не совсем верна. Это должно быть $keyword = "%".like_escape( $keyword )."%";
.
Используя ссылку, опубликованную @Wyck, проверьте http://wordpress.org/extend/plugins/search-everything /. Учитывая сложность задачи, плагин действительно является вашим лучшим выбором для ее выполнения.
Если вы действительно против плагина и знаете немного SQL, вы можете сделать это с помощью глобальной переменной $wpdb.
Например, чтобы запросить все сообщения, содержащие "sample_text" в заголовке, вы должны сделать что-то вроде:
global $wpdb;
$post = $wpdb->get_results("SELECT * FROM $wpdb->wp_posts WHERE post_title LIKE '%sample_text%' ");
Затем вы бы сделали аналогичные действия для каждой из других таблиц.