我想使用一个带有高级自定义字段和json Wordpress API的Wordpress后端来为移动应用程序提供数据。
对于这个项目,客户端需要在地图自定义字段中选择一个位置。API应该返回一个json数组,其中包含一些其他数据和来自Google maps字段的数据。
API返回的对象格式如下:
{
"0": [
{
"title": "Test 1",
"evenement_afbeelding": "38",
"kunstenaars": "Name One",
"openingstijden": "9:00 - 18:30",
"evenementbeschrijving": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ac pharetra tortor.",
"evenement_lokatie": "a:3:{s:7:"address";s:40:"Jansweg 50, 2011 KN Haarlem, Netherlands";s:3:"lat";s:17:"52.38513460768028";s:3:"lng";s:17:"4.638633728027344";}",
"biografie": "<strong>Lorem ipsum dolor sit amet</strong>rnrnConsectetur adipiscing elit. Nullam ac pharetra tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos."
}
],
"status": "ok"
}
奇怪的是键"evenement_lokatie"(Google maps字段)上的值返回一个字符串,我无法将其转换为数组。"evenement_lokatie"键上的值应该包含另一个数组,如下所示:
{
"0": [
{
"title": "Test 1",
"evenement_afbeelding": "38",
"kunstenaars": "Name One",
"openingstijden": "9:00 - 18:30",
"evenementbeschrijving": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ac pharetra tortor.",
"evenement_lokatie": [
{
"Stad": "Haarlem",
"lang": "32143241",
"lat": "721321"
}
],
"biografie": "<strong>Lorem ipsum dolor sit amet</strong>rnrnConsectetur adipiscing elit. Nullam ac pharetra tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos."
}
],
"status": "ok"
}
这是用来格式化wordpress中的数据的PHP代码:
<?php
class json_api_events_controller{
public function hello_world(){
return array('message'=>'Hello World!');
}
public function get_events(){
$array = array();
$args = array('post_type'=>'evenementen', 'posts_per_page'=>-1, 'order_by'=>'title', 'order'=>'ASC');
$loop = new WP_Query($args);
$counter = 0;
while ( $loop->have_posts() ) : $loop->the_post();
$id = get_the_id();
$custom = get_post_custom($id);
// add the title
$array[$id][$counter]['title'] = get_the_title();
// add all the custom fields
foreach($custom as $k => $v){
// if key starts with '_' symbol, don't add to the array
if(strpos($k, '_') !== 0) {
$array[$id][$counter][$k] = array_shift($v);
}
}
$counter++;
endwhile;
return $array;
}
}
字符串中也有奇怪的字符,如";s:17:"one_answers";s:40:"。谁能告诉我如何将这样的字符串转换为我描述的数组?
提前感谢!
这个"weird"值实际上是PHP序列化的——你可以在json_encode之前在服务器端使用unserialize对它进行反序列化,这样就不会有问题了。
Wordpress以这种方式序列化元数据,因此任何对象都可以保存为字符串。诀窍是在创建有效的JSON对象之前使用PHP反序列化来获得一个有效的PHP对象。
我解决的方式是查询帖子,获取位置字段和它的数据,为lat和lng添加两个元字段。
查询:
while( $query->have_posts() ) : $query->the_post();
$id = get_the_ID();
$location = get_field('location');
$lat = $location['lat'];
$lng = $location['lng'];
if (! metadata_exists( 'post', $id, 'lat' ) ) {
add_post_meta($id, 'lat', $lat, true);
}
if (! metadata_exists( 'post', $id, 'lng' ) ) {
add_post_meta($id, 'lng', $lng, true);
}
然后因为我使用的是javascript,所以我像这样读取数据:
$.each(data, function(i) {
var lat = data[i]["details"]["lat"];
var lng = data[i]["details"]["lng"];