2017-02-10 100 views
1

我有一个搜索字段,它允许用户搜索地点和邮政编码。当用户输入搜索值时,我有两个隐藏的输入字段,根据用户选择填充经度和纬度。在Wordpress中更改搜索查询

我想运行一个查询其搜索与隐藏输入值来帖 - latitudelongitude什么类型的用户在

<form role="search" method="get" id="searchform" class="searchform" action=""> 
<div class="search"> 
<input type="text" value="" name="s" id="search-input" class="s" placeholder="Enter your Location or Postcode" /> 
<input type="hidden" value="profile" name="post_type" id="post_type" /> 
<input type="hidden" value="country" name="taxonomy" /> 
<input type="hidden" name="latitude" id="latitude" /> 
<input type="hidden" name="longitude" id="longitude"/> 
<input type="submit" id="searchsubmit" value="Search" class="submit btn" /> 
</form> 

我怎么能替换搜索查询完全与另一个查询搜索帖子根据用户选择的经纬度?

这是SQL查询,我想,以取代主查询:

SELECT SQL_CALC_FOUND_ROWS wp_posts. * 
FROM wp_posts 
WHERE 1 =1 
AND wp_posts.ID 
IN (

SELECT post_id 
FROM lat_lng_post 
WHERE (3959 * ACOS(COS(RADIANS(- 27.922459)) * COS(RADIANS(lat)) * COS(RADIANS(lng) - RADIANS(153.334793)) + SIN(RADIANS(- 27.922459)) * SIN(RADIANS(lat)))) <=125 
) 
LIMIT 0 , 30 

我有一个函数准备好,但我不知道这WordPress的钩,我应该用它来改变搜索查询另一个without modifying the search template

function custom_search() 
{ 

    global $wpdb; 

    if (is_search()) 
    $latitude = filter_input(INPUT_GET, "latitude", FILTER_SANITIZE_STRING); 
    $longitude = filter_input(INPUT_GET, "longitude", FILTER_SANITIZE_STRING); 
    $radius = 125; 

    $sql = "SELECT SQL_CALC_FOUND_ROWS wp_posts. * 
       FROM wp_posts 
       WHERE 1 = 1 
       AND $wpdb->posts.ID IN (SELECT post_id FROM lat_lng_post WHERE 
       (3959 * acos(cos(radians(%f)) 
           * cos(radians(lat)) 
           * cos(radians(lng) 
           - radians(%f)) 
           + sin(radians(%f)) 
           * sin(radians(lat)))) <= %s)"; 

    $sql = $wpdb->prepare($sql, $latitude, $longitude, $latitude, $radius); 

    //$wpdb->show_errors(); 
    $results = $wpdb->get_results($sql); 
    //$wpdb->print_error();  


    return $results; 

} 

任何帮助将不胜感激。

回答

0

难道你不能钩入posts_clauses并使用$ pieces对象来改变查询吗? (我想补充一点的注释,但不具备名誉)

add_filter('posts_clauses', function($pieces, $obj) { 
    print_r($pieces); 
}); 

HM - 这可能仍然是不够的。 post_clauses $件对象返回:

Array (
    [where] => AND (((wp_posts.post_title LIKE '%test%') OR (wp_posts.post_excerpt LIKE '%test%') OR (wp_posts.post_content LIKE '%test%'))) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') 
    [groupby] => 
    [join] => 
    [orderby] => wp_posts.post_title LIKE '%test%' DESC, wp_posts.post_date DESC 
    [distinct] => 
    [fields] => wp_posts.* 
    [limits] => LIMIT 0, 10 
) 
+0

你能举个例子吗?因为我想彻底改变查询,而不仅仅是它的一部分。 – input

+0

啊,对不起 - post_clausules会更好。查看更新的答案。 –