2017-02-10 11 views
1

У меня есть поле поиска, которое позволяет пользователю искать места и почтовые индексы. Когда пользователь вводит значение поиска, у меня есть два скрытых поля ввода, которые заполняют широту и долготу на основе выбора пользователя.Изменить поисковый запрос в Wordpress

Я хочу выполнить запрос, который осуществляет поиск сообщений с скрытыми входными значениями -. 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

Не можете ли вы подключиться к сообщениям 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 
) 
+0

Можете привести пример? Поскольку я хочу полностью изменить запрос, а не только его части. – input

+0

Ах, извините - post_clausules будет лучше. См. Обновленный ответ. –