Поиск, который будет отображаться в пользовательском поле, опубликовать заголовок и опубликовать контент

Я ищу способ выполнить поиск, и при выполнении поиска он проверяет настраиваемое поле с именем «ключевые слова», заголовок сообщения и содержимое сообщения. Если какое-либо из этих полей имеет такие результаты, как то, что пользователь ищет, на странице результатов отобразится пользовательский тип сообщения (программы).

Мне не нужна помощь с результатом конечного отображения (в настоящее время он делает то, что я хочу, чтобы он это сделал), но мне нужно сделать так, чтобы при его поиске были проверены все три поля (заголовок, пост-контент и пользовательские поля) и если какой-либо из них имеет результат, подобный тому, что был обыскан, он отображает результаты. Это код, который у меня есть до сих пор. В настоящее время он просматривает только пользовательские поля ключевых слов:

elseif($program_search) { // search by program search text query_posts(array( 'post_type' => 'program', 'meta_query' => array( array( 'key' => 'keywords', 'value' => $program_search, 'compare' => 'LIKE' ), ) )); if ( have_posts() ) : while ( have_posts() ) : the_post(); $l.= "<div class='program-item'>"; $l.= "<div class='program-item-image'><a href='".get_permalink($post->ID)."'>". get_the_post_thumbnail($post->ID, 'thumbnail')."</a></div>"; $l.= "<div class='program-item-title'><a href='".get_permalink($post->ID)."'>".get_the_title($post->ID)."</a></div>"; $l.= "<div class='program-item-content'>".get_the_excerpt()."</div>"; $l.= "<div style='clear:both;'></div>"; $l.= "</div>"; endwhile; else: endif; } 

Solutions Collecting From Web of "Поиск, который будет отображаться в пользовательском поле, опубликовать заголовок и опубликовать контент"

Во-первых, не используйте query_posts .

Во-вторых, вы можете передать параметр s чтобы получить большую часть пути.

 $program_search = 'test'; $args = array( 'post_type' => 'program', 's' => $program_search, 'meta_query' => array( array( 'key' => 'keywords', 'value' => $program_search, 'compare' => 'LIKE' ), ) ); $t = new WP_Query($args); var_dump($t->request); 

Этот параметр s запускает обычные поисковые механизмы на место, и заголовок и контент просматриваются. Если вы посмотрите на этот сгенерированный запрос, вы увидите …

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND (((wp_posts.post_title LIKE '%test%') OR (wp_posts.post_content LIKE '%test%'))) AND (wp_posts.post_password = '') AND wp_posts.post_type = 'program' AND (wp_posts.post_status = 'publish') AND ((wp_postmeta.meta_key = 'keywords' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%test%')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 5 

Это большая часть того, чего вы хотите. LIMIT если не указано иное, – это ограничение, установленное в wp-admin-> Settings-> General. Однако есть проблема.

 AND ((wp_postmeta.meta_key = 'keywords' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%test%')) 

Я уверен, что вы хотите, чтобы это было OR ((wp_postmeta.meta_key ... и вы действительно хотите, чтобы это было с post_title и post_content тоже. Что-то вроде этого:

 AND ( ( (wp_posts.post_title LIKE '%test%') OR (wp_posts.post_content LIKE '%test%') OR (wp_postmeta.meta_key = 'keywords' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%test%') ) ) 

WP_Query не сделает этого, поэтому мы должны сделать это с некоторыми фильтрами. Доказательство концепции:

 function add_join_wpse_99849($joins) { global $wpdb; return $joins . " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)"; } function alter_search_wpse_99849($search,$qry) { global $wpdb; $add = $wpdb->prepare("({$wpdb->postmeta}.meta_key = 'keywords' AND CAST({$wpdb->postmeta}.meta_value AS CHAR) LIKE '%%%s%%')",$qry->get('s')); $pat = '|\(\((.+)\)\)|'; $search = preg_replace($pat,'(($1 OR '.$add.'))',$search); return $search; } $program_search = 'test'; $args = array( 'post_type' => 'program', 's' => $program_search ); add_filter('posts_join','add_join_wpse_99849'); add_filter('posts_search','alter_search_wpse_99849',1,2); $t = new WP_Query($args); remove_filter('posts_join','add_join_wpse_99849'); remove_filter('posts_search','alter_search_wpse_99849',1,2); // dump some data var_dump($t->request); var_dump($t->posts); 

Обратите внимание, что я полностью meta_query и в значительной степени дублировал функциональность. То есть, чтобы сохранить этот трудный AND от генерирования.

Вы применяете и немедленно удаляете эти фильтры, чтобы они не мешали другим запросам. Есть и другие способы, чтобы фильтр не соответствовал или другим запросам. Один из таких способов описан здесь . Вы также можете добавить remove_filter в add_filter вызов add_filter чтобы они автоматически удалили себя.