我有一个搜索字段,允许用户搜索地点和邮政编码。当用户输入搜索值时,我有两个隐藏的输入字段,根据用户选择填充纬度和经度。
我想运行查询,搜索具有隐藏输入值的帖子 - latitude
和longitude
以及 不 用户输入的内容英寸
<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 :(得分:0)
您是否可以挂钩到posts_clauses并使用$ pieces对象来更改查询? (我会将此添加为评论但不具备声誉)
add_filter('posts_clauses', function($pieces, $obj) {
print_r($pieces);
});
嗯 - 这可能还不够。 post_clauses $ pieces对象返回:
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
)