带有高级自定义字段的Wordpress Rest API谷歌地图字段返回奇怪的字符串


Wordpress Rest API with advanced custom fields Google map field returns weird string

我想使用一个带有高级自定义字段和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>'r'n'r'nConsectetur 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>'r'n'r'nConsectetur 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:"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"];