我在WP的posts表中有存储为POST的位置。
我正在使用地理数据存储进行地理定位(http://wordpress.org/plugins/geo-data-store/). 这对我来说非常有用,因为我目前可以从起点(转换为坐标的城市)选择的任何半径获得结果。
我之前在城市上使用了精确匹配-当用户单击一个城市时,它加载了与单击的城市完全匹配的Posteta的结果-我单击Asheville,我在Asheville获得了位置。
切换到地理位置导致的问题是,现在当用户单击一个城市时,该城市内的一些结果不会显示,因为它们不在城市中心的给定半径内,即使城市的邮戳与单击的城市完全匹配。
我的查询的相关部分如下所示:
$coordinates = ConvertCityStateToCoords($city.\', \'.$state);
$lat = (double)$coordinates[\'lat\'];
$long = (double)$coordinates[\'long\'];
$posts = (array) $geoDataStore->getPostIDsOfInRange(\'place\', $radius, $lat, $long);
$posts = array_map(\'intval\',$posts);
$args[\'post__in\']=$posts;
$places= new WP_Query($args);
而过去它是这样的:
$args[\'meta_query\'][] = array(
\'key\' => \'place_state\',
\'value\' => $state,
);
$args[\'meta_query\'][] = array(
\'key\' => \'place_city\',
\'value\' => $city
);
$places= new WP_Query( $args );
My question is this: will I have to abandon WP_Query (我宁愿不这样做,因为我也在使用它分页和排序)
in favor of SQL that will allow me to query an \'optional\' field - SQL that would include posts within the radius as well as posts with the exact match city, but not exclusively one or the other.
最合适的回答,由SO网友:s_ha_dum 整理而成
所有真正的工作都是由$geoDataStore->getPostIDsOfInRange
. 这就是搜索完成的地方,也是不会返回您想要的结果的地方。
WP_Query
只需拉动指定的立柱ID
s、 您没有理由放弃这部分代码,尽管您可能想添加\'orderby\' => \'posts__in\'
维护邮政秩序ID
s传递到查询中。
如果$geoDataStore->getPostIDsOfInRange
未返回所有ID
如果你想要,你必须研究它是如何工作的。
现在this looks like the code 那是你的$geoDataStore
类用于进行查询。没有可以操纵的挂钩。
我能想到的只有两件事。
扩展该类并替换该函数,以便它搜索您的元信息或者运行另一个查询来检查您的元信息,并包括生成半径之外的位置--something like this.换句话说。。。
$posts = (array) $geoDataStore->getPostIDsOfInRange(\'place\', $radius, $lat, $long);
$posts2 = new WP_Query(array(
// query for the others
\'fields\' => \'ids\',
// other parameters
// Much like your original meta_query but
// I do think you need the \'OR\' relationship
));
$posts = array_unique($posts + $posts2);
$args[\'post__in\'] = $posts;
$places = new WP_Query($args);
SO网友:GhostToast
您需要声明OR
查询之间的关系,如AND
是默认值。
示例取自http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
$args = array(
\'post_type\' => \'product\',
\'meta_query\' => array(
\'relation\' => \'OR\',
array(
\'key\' => \'color\',
\'value\' => \'blue\',
\'compare\' => \'NOT LIKE\'
),
array(
\'key\' => \'price\',
\'value\' => array( 20, 100 ),
\'type\' => \'numeric\',
\'compare\' => \'BETWEEN\'
)
)
);