反序列化json-api插件中的wordpress自定义字段


deserialize wordpress custom field in json api plugin

在我的wordpress主题中,有一个名为歌曲的自定义帖子类型,在该帖子类型中有一个名称为播放列表的自定义字段,其中包含歌曲信息,如艺术家姓名、下载链接、歌曲歌词等

我的问题是这个自定义字段是在我的网站的json版本中序列化的我不知道该怎么解决。

我使用json-api插件进行word press。

下面是它在json 中显示的一个示例

...
"custom_fields": {
    ...
    "playlist": [
      "a:1:{i:0;a:19:{s:5:'"title'";s:44:'"Hosein Tohi And Sami Beigi - Ba Man Miraghsi'";s:3:'"mp3'";s:134:'"http:'/'/dl.paradi3emusic.com'/Musics'/Aban%2094'/Persian'/Single'/Hosein%20Tohi%20And%20Sami%20Beigi%20-%20Ba%20Man%20Miraghsi%20-%20128.mp3'";s:7:'"radioip'";s:0:'"'";s:9:'"radioport'";s:0:'"'";s:11:'"buy_title_a'";s:14:'"'u06a9'u06cc'u0641'u06cc'u062a 320'";s:10:'"buy_icon_a'";s:14:'"cloud-download'";s:10:'"buy_link_a'";s:134:'"http:'/'/dl.paradi3emusic.com'/Musics'/Aban%2094'/Persian'/Single'/Hosein%20Tohi%20And%20Sami%20Beigi%20-%20Ba%20Man%20Miraghsi%20-%20320.mp3'";s:11:'"buy_title_b'";s:14:'"'u06a9'u06cc'u0641'u06cc'u062a 128'";s:10:'"buy_icon_b'";s:14:'"cloud-download'";s:10:'"buy_link_b'";s:134:'"http:'/'/dl.paradi3emusic.com'/Musics'/Aban%2094'/Persian'/Single'/Hosein%20Tohi%20And%20Sami%20Beigi%20-%20Ba%20Man%20Miraghsi%20-%20128.mp3'";s:11:'"buy_title_c'";s:0:'"'";s:10:'"buy_icon_c'";s:14:'"cloud-download'";s:10:'"buy_link_c'";s:0:'"'";s:11:'"buy_title_d'";s:0:'"'";s:10:'"buy_icon_d'";s:14:'"cloud-download'";s:10:'"buy_link_d'";s:0:'"'";s:10:'"buy_custom'";s:0:'"'";s:11:'"lyric_title'";s:0:'"'";s:5:'"lyric'";s:0:'"'";}}"
    ],
    ...
},
...

****编辑*****

我想要另一个自定义字段,它包含这些序列化数据的json数组,但未序列化我也尝试过,但没有成功。

add_post_meta($id, 'myplaylist1', $playlist);

在json-api插件输出内容之前,您需要编写一个过滤器来反序列化内容。

在json输出之前,插件应用了一个过滤器,文档如下:

https://en-gb.wordpress.org/plugins/json-api/other_notes/#5.-扩展-JSON-API

这将适合这项任务。

将以下内容添加到您的主题functions.php:

add_filter('json_api_encode', function($response){
    if (isset($response['posts'])) {
        foreach ($response['posts'] as $post) {
            deserialize_playlist($post);
        }
    } else if (isset($response['post'])) {
        deserialize_playlist($response['post']);
    }
    return $response;
});

function deserialize_playlist(&$post) {
    if(isset($post->custom_fields->playlist)){
        $playlists = $post->custom_fields->playlist;
        //custom fields appear to always be returned as an array
        foreach($playlists as &$playlist){
            $playlist = unserialize($playlist);
        }
        $post->custom_fields->playlist = $playlists;
    }
}

您可以使用maybe_unseralize()函数中内置的wordpress来取消序列化数据的序列化

https://codex.wordpress.org/Function_Reference/maybe_unserialize