La estructura de un feed
Un feed JSON comienza con alguna información en la parte superior: dice de dónde proviene el feed, y puede decir quién lo creó, etc. Después de eso, hay una serie de objetos, elementos, que describen cada objeto en la lista.
{
"version": "https://jsonfeed.org/version/1",
"title": "My Example Feed",
"homepageurl": "https://example.org/",
"feed_url": "https://example.org/feed.json",
"items": [
{
"id": "2",
"content_text": "This is a second item.",
"url": "https://example.org/second-item"
},
{
"id": "1",
"content_html": "<p>Hello, world!</p>",
"url": "https://example.org/initial-post"
}
]
}
Ejemplo rápido con laravel: obtener la lista de post
$posts = Posts::latest();
Configura los datos básicos para el JSON Feed
La especificación de JSON Feed tiene algunos campos de nivel superior opcionales, como título, URL de fuente, ícono de sitio y más. Estos campos no son dinámicos por lo que hay que agregarlos a un arreglo de forma manual:
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'El nombre de tu feed',
'homepageurl' => 'https://domain.tld',
'feed_url' => 'https://domain.tld/feed/json',
'icon' => 'https://domain.tld/apple-touch-icon.png',
'favicon' => 'https://domain.tld/apple-touch-icon.png',
'items' => [],
];
Agregando los items al feed
Este punto es lo más sencillo del mundo, únicamente hay que hacer:
<?php
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://domain.tld/' . $post->uri, // o la ruta de los post
'image' => $post->featured_image,
'content_html' => $post->content,
'datepublished' => $post->created_at->tz('UTC')->toRfc3339String(),
'datemodified' => $post->updated_at->tz('UTC')->toRfc3339String(),
'author' => [
'name' => $post->user->name
],
];
}
El resultado final
Nuestro método quedaría de esta forma:
<?php
class JsonApi
{
public function jsonFeed()
{
$posts = Posts::latest();
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'El nombre de tu feed',
'homepageurl' => 'https://domain.tld',
'feed_url' => 'https://domain.tld/feed/json',
'icon' => 'https://domain.tld/apple-touch-icon.png',
'favicon' => 'https://domain.tld/apple-touch-icon.png',
'items' => [],
];
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://domain.tld/' . $post->uri, // o la ruta de los post
'image' => $post->featured_image,
'content_html' => $post->content,
'datepublished' => $post->created_at->tz('UTC')->toRfc3339String(),
'datemodified' => $post->updated_at->tz('UTC')->toRfc3339String(),
'author' => [
'name' => $post->user->name
],
];
}
return $data;
}
}