2013-11-14 102 views
2

我有在Google地图上显示的WordPress帖子。帖子从包含latlng值的自定义帖子字段中拉出。 lat和lng在这个值中。按最近的位置过滤WordPress帖子

该地图还显示了Google地理位置的用户位置。

难道有人指出我在正确的方向过滤到用户位置的100个最接近的职位的帖子?

我在其他情况下通过query_posts meta key过滤,并认为它也可能在这种情况下工作。

--UPDATE--

我存储在两个不同的领域lat和长值了。我可以过滤这个就好了,如果我设定的预定用户的价值纬度/长这样的...

$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中。我猜测,因为我的变量基本上是创建一个div,WordPress无法读取div的值作为元值。

有人能帮我指出正确的方向吗?

+0

所以,你必须存储为逗号分隔字符串中的每个职位的纬度/经度,你有Google的用户lat/lng吗?如果他们是单独的值,那么执行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 AND lng.meta_key ='lng')”;' –

相关问题