wordpress虽然已经提供了Restful API,但对于某些自定义的文章类型,要想获取它们的Json数据的话,我们还需要用到PHP来写一段程序。
本文提供的代码可以获取在wordpress或者blogspot的文章数据,生成的json文件可以用于制作APP。我的一个项目用到了wp-job-manager,我希望能够针对每一个店铺的搜索结果,获取这个店铺独立的RSS feed,然后用PHP将其生成json文件,然后再利用AnglarJS做前端就好办了。
首先我们新建一个文件 feed.php 代码如下:
header('Content-Type: application/json; Charset=UTF-8'); $feed = new DOMDocument(); $feed->load('http://someblogsite/feed/'); // put your feed url here $json = array(); $json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue; $json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue; $json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue; $items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item'); $json['item'] = array(); $i = 0; foreach($items as $item) { $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue; $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue; $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue; $guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue; $json['item'][$i++]['title'] = $title; $json['item'][$i++]['description'] = $description; $json['item'][$i++]['pubdate'] = $pubDate; $json['item'][$i++]['guid'] = $guid; } echo json_encode($json);
将代码中的网址更改为你自己的feed地址即可(wp-job-manager的RSS feed可以通过job board的搜索功能获取),然后将该文件上传到服务器,在浏览器中输入http://www.youdomain.com/feed.php
就可以看到效果了。
下面,我们需要更改URL的结构,将 http://www.youdomain.com/feed.php
改为 http://www.youdomain.com/feed.json
因为 JSON API 需要 .json
的文件,在上述代码的 echo json_encode($json);
之前加上:
//create a new array out of it file_put_contents('feed.json', json_encode($json)); $json_string = json_encode($json); $file = 'feed.json'; file_put_contents($file, $json_string);
现在,在浏览器地址栏输入 http://yourdomain.com/feed.json
查看效果,.json
文件就生成好了。完整代码如下:
<?php header('Content-Type: application/json; Charset=UTF-8'); $feed = new DOMDocument(); $feed->load('http://someblogsite/feed/');// put your feed url here $json = array(); $json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue; $json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue; $json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue; $items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item'); $json['item'] = array(); $i = 0; foreach($items as $item) { $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue; $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue; $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue; $guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue; $json['item'][$i++]['title'] = $title; $json['item'][$i++]['description'] = $description; $json['item'][$i++]['pubdate'] = $pubDate; $json['item'][$i++]['guid'] = $guid; //create a new array out of it file_put_contents('feed.json', json_encode($json)); $json_string = json_encode($json); $file = 'feed.json'; file_put_contents($file, $json_string); } echo json_encode($json); ?>
生成.json
文件的时候,需要注意文件和文件夹的权限,你需要将包含feed.php
的各级目录权限更改为可写,并将feed.php
文件本身的权限改为777。