2013-11-14 1 views
2

Google지도에 표시되는 WordPress 게시물이 있습니다. 게시물은 latlng 값을 포함하는 사용자 정의 게시 필드에서 가져옵니다. lat와 lng는이 값에 함께 있습니다.가까운 위치의 WordPress 게시물 필터링

지도에는 Google 지역 정보가있는 사용자 위치도 표시됩니다.

사용자가 사용자 위치에 가장 가까운 100 개의 게시물로 게시물을 필터링하는 올바른 방향으로 나를 가리킬 수 있습니까?

다른 인스턴스에서 query_posts 메타 키로 필터링 중이며이 경우에도 작동 할 수 있다고 생각합니다.

--UPDATE--

지금 두 개의 별도의 필드에 위도 긴 값을 저장하고

. 내가 위도/경도과 같이 사용자의 값을 미리 정해진 설정하면 내가 사용자의 현재 위치를 기반으로이 값을 설정하고자하고

$lat_plus = '40.496755'; 
    $lat_minus = '35.496755'; 
    $long_plus = '-85.051597'; 
    $long_minus = '-89.3874682'; 
    $the_query = new WP_Query(array(
     'cat' => $custom_category, 
     'posts_per_page' => 50, 
     'order' => 'ASC', 
     'meta_query' => array(
      'relation' => 'AND', 
       array(
        'key' => 'latitude', 
        'value' => $lat_plus, 
        'compare' => '<', 
        'type' => 'NUMERIC' 
      ), 
       array(
        'key' => 'latitude', 
        'value' => $lat_minus, 
        'compare' => '>', 
        'type' => 'NUMERIC' 
      ), 
       array(
        'key' => 'longitude', 
        'value' => $long_plus, 
        'compare' => '<', 
        'type' => 'NUMERIC' 
      ), 
       array(
        'key' => 'longitude', 
        'value' => $long_minus, 
        'compare' => '>', 
        'type' => 'NUMERIC' 
      ) 

나는 ...이 잘 필터링 할 수 있습니다. 이 코드를 사용하여 사용자의 현재 위치를 정사각형으로 만들려면이 값을 가져오고 숫자를 더하거나 뺍니다.

<SCRIPT type="text/javascript"> 
     $(function() { 
      if(navigator.geolocation) { 
       var fallback = setTimeout(function() { fail('10 seconds expired'); }, 10000); 
       navigator.geolocation.getCurrentPosition(
        function (pos) { 
         clearTimeout(fallback); 
         console.log('pos', pos); 
         var point = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude); 

         new google.maps.Geocoder().geocode({'latLng': point}, function (res, status) { 
          if(status == google.maps.GeocoderStatus.OK && typeof res[0] !== 'undefined') { 
           var change = '2.5'; 
           var lat1 = pos.coords.latitude; 
           var lat2 = parseFloat(lat1,10) + parseFloat(change,10); 
           if(lat2) { 
            $("._lat_more").html(lat2); 
           } else fail('Failed to parse'); 
           var lat3 = parseFloat(lat1,10) - parseFloat(change,10); 
           if(lat3) { 
            $("._lat_minus").html(lat3); 
           } else fail('Failed to parse'); 

           var long1 = pos.coords.longitude; 
           var long2 = parseFloat(long1,10) + parseFloat(change,10); 
           if(long2) { 
            $("._long_more").html(long2); 
           } else fail('Failed to parse'); 
           var long3 = parseFloat(long1,10) - parseFloat(change,10); 
           if(long3) { 
            $("._long_minus").html(long3); 
           } else fail('Failed to parse'); 
           var zip = res[0].formatted_address.match(/,\s\w{2}\s(\d{5})/); 

          } else { 
           fail('Failed to reverse'); 
          } 
         }); 
        }, function(err) { 
         fail(err.message); 
        } 
       ); 
      } else { 
       $("._res").html('Geolocation unsupported!'); 
      } 
      function fail(err) { 
       console.log('err', err); 
       $("._res").html('Error ' + err); 
      } 
     }); 
     </SCRIPT> 
<?php 
$lat_plus = '<div class="_lat_more"></div>'; 
$lat_minus = '<div class="_lat_minus"></div>'; 
$long_plus = '<div class="_long_more"></div>'; 
$long_minus = '<div class="_long_minus"></div> 

echo $lat_plus 
echo $lat_minus 
echo $long_plus 
echo $long_minus 
?> 

문제는 JavaScript로 생성 된 값을 WordPress meta_query로 가져 오는 것입니다. 내 변수는 기본적으로 WordPress에서 div의 값을 메타 값으로 읽을 수없는 div를 만드는 것이므로 추측합니다.

누군가 나를 올바른 방향으로 안내 할 수 있습니까?

+0

을 그래서 당신은 쉼표로 구분 된 문자열로 저장 각 게시물에 대한 위도/LNG를, 사용자가 Google로부터 위도/현자를 사용하고 있습니까? 별도의 값이라면 mysql 검색을하는 것이 더 쉬울 것이다. 여기에 [관련 질문] (http://stackoverflow.com/questions/4687312/querying-within-longitude-and-latitude-in-mysql/4690450#4690450)입니다. – boodle

답변

2

나를 위해 다음 작업했습니다 (http://www.bluefinengineering.com/blog/wordpress-geolocation-query-wp_query-lat-lng-post-metadata에서). 이것은 PHP에서 이미 게시물을 필터링합니다.

첫째는 WP_Query 클래스

<?php 

class WP_Query_Geo extends WP_Query { 
    var $lat; 
    var $lng; 
    var $distance; 

    function __construct($args=array()) { 
    if(!empty($args['lat'])) { 
     $this->lat = $args['lat']; 
     $this->lng = $args['lng']; 
     $this->distance = $args['distance']; 
     add_filter('posts_fields', array($this, 'posts_fields')); 
     add_filter('posts_groupby', array($this, 'posts_groupby')); 
     add_filter('posts_join_paged', array($this, 'posts_join_paged')); 
    } 

    parent::query($args); 

    remove_filter('posts_fields', array($this, 'posts_fields')); 
    remove_filter('posts_groupby', array($this, 'posts_groupby')); 
    remove_filter('posts_join_paged', array($this, 'posts_join_paged')); 
    } 

    function posts_fields($fields) { 
    global $wpdb; 
    $fields = $wpdb->prepare(" ((ACOS(SIN(%f * PI()/180) * SIN(mtlat.meta_value * PI()/180) + COS(%f * PI()/180) * COS(mtlat.meta_value * PI()/180) * COS((%f - mtlng.meta_value) * PI()/180)) * 180/PI()) * 60 * 1.1515) AS distance", $this->lat, $this->lat, $this->lng); 
    return $fields; 
    } 

    function posts_groupby($where) { 
    global $wpdb; 
    $where .= $wpdb->prepare(" HAVING distance < %d ", $this->distance); 
    return $where; 
    } 

    function posts_join_paged($join) { 
    $join .= " INNER JOIN uc_postmeta AS mtlat ON (IF(mtmaster.meta_value != uc_posts.ID, mtmaster.meta_value, uc_posts.ID) = mtlat.post_id AND mtlat.meta_key = 'lat') "; 
    $join .= " INNER JOIN uc_postmeta AS mtlng ON (IF(mtmaster.meta_value != uc_posts.ID, mtmaster.meta_value, uc_posts.ID) = mtlng.post_id AND mtlng.meta_key = 'lng') "; 
    return $join; 
    } 
} 

을 확장 그런 다음 게시물 조회 할 새 WP_Query_Geo 클래스를 사용

<?php 
$args = array(
    'post_status' => 'publish', 
    'posts_per_page' => $per_page, 
    'paged' => $paged, 
    'fields' => 'all', 
    'lat' => $distance['lat'], 
    'lng' => $distance['lng'], 
    'distance' => $distance['range'] 
); 

$query = new WP_Query_Geo($args); 
+0

mtmaster는 무엇입니까? 그것은 테이블 이름입니까? – TukangBeling

+0

@NightCode : 예, * wp_postmeta *. 내 구현에서는 이러한 조인 명령을 사용 :'$ join. = "INNER JOIN wp_postmeta AS lat ON (lat.post_id = wp_posts.id and lat.meta_key = 'lat')"; $ join. = "INNER JOIN wp_postmeta AS lng ON (lng.post_id = wp_posts.id 및 lng.meta_key = 'lng')"; ' –

관련 문제