搜索将查找自定义域、帖子标题和帖子内容

时间:2013-05-17 作者:Brandon

我正在寻找一种执行搜索的方法,在执行搜索时,它会检查一个名为“关键字”的自定义字段、帖子标题和帖子内容。如果这些字段中的任何一个有用户搜索的结果,它将在结果页面中显示自定义帖子类型(程序)。

我不需要有关最终显示结果的帮助(它当前执行我希望它执行的操作),但我需要这样做,当它搜索时,它会检查所有三个字段(帖子标题、帖子内容和自定义字段关键字),如果其中任何字段有与搜索结果类似的结果,它会显示结果。这是我目前掌握的代码。当前仅在“关键字自定义”字段中查找:

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;
}

1 个回复
SO网友:s_ha_dum

首先,不要使用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(wp管理->设置->常规)中设置的限制。但有一个问题。

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 从生成。

您正在应用并立即删除这些过滤器,以便它们不会干扰任何其他查询。还有其他方法可以避免筛选或其他查询。One such method is outlined here. 您还可以添加remove_filteradd_filter 回调,让它们自动删除自己。

结束

相关推荐

从WordPress unction.php文件中的挂钩预填充表单

我有一个表单,只需在wp admin后端使用HTML编辑器创建页面即可。我在该页面的挂钩中有一些变量,我想用挂钩中的变量预先填充一些表单字段。add_action(\'wp\', \'simple_form\'); function simple_form(){ $firstname = \'Bob\'; //Do something to populate the form field name <fname> with \"Bob\"&#x