json_wordpress

Hace unos días nos encontramos con la tarea de importar a WordPress el contenido antiguo de un blog a partir únicamente de una URL que devolvía un JSON. Es un proceso que requiere algo de «trabajo sucio» para identificar la estructura del JSON  si no la conocemos, pero una vez tengamos los claros los campos a importar la función wp_insert_post se encargará de todo.

Lo más fácil es crear en el directorio raíz de la instalación de WordPress un archivo php, por ejemplo, import.php.

Identificar los componentes

Empezaremos capturando la cadena JSON y descodificándola para convertirla en un array. En el ejemplo utilizaré un JSON con el contenido estático de la web de TEDx Cuesta del Bailío.

<?php
$json=file_get_contents('http://tedxcuestadelbailio.com/json.php');
$array=json_decode($json);

Llega el momento «sucio» que comentaba antes: hay que estudiar la estructura del array que hemos obtenido para localizar los campos que necesitamos. Para ello utilizaremos var_dump.

<?php
$json=file_get_contents('http://tedxcuestadelbailio.com/json.php');
$array=json_decode($json);
echo("<pre>");
var_dump($array);
echo("</pre>");

Abrimos el archivo en el navegador (p. ej. http://localhost/blog/import.php) y debemos obtener algo parecido a esto:

captura JSON WordPressVemos que hay un array llamado «contenidos» que contiene lo que nos interesa: identificamos rápidamente que «título» se correspondería con  el título del artículo y «descripción» sería el contenido. Podría haberse dado el caso de contener la fecha del post, categorías, etc.

Crear el array del post e insertarlo

Aislamos ese subarray «contenidos» que será el que recorramos para extraer todos los artículos y cargamos el archivo wp-blog-header.php para poder utilizar las funciones de WordPress.

<?php
$json=file_get_contents('http://tedxcuestadelbailio.com/json.php');
$array=json_decode($json);
echo("<pre>");
var_dump($array);
echo("</pre>");

$subarray=$array->contenidos;
require('wp-blog-header.php');

foreach($subarray as $articulo)
{
	$titulo=$articulo->titulo;
	$contenido=$articulo->descripcion;
}

Ya solo nos queda «montar» el array que le pasaremos a la función wp_insert_post:

<?php
$json=file_get_contents('http://tedxcuestadelbailio.com/json.php');
$array=json_decode($json);
//echo("<pre>");
//var_dump($array);
//echo("</pre>");

$subarray=$array->contenidos;
require('wp-blog-header.php');

foreach($subarray as $articulo)
{
	$titulo=$articulo->titulo;
	$contenido=$articulo->descripcion;
	$post=array(
			'post_title'=>$titulo,
			'post_content'=>$contenido
	);
	wp_insert_post($post,$wp_error);
}

Si todo ha salido bien, al abrir nuestra url (http://localhost/blog/import.php) los artículos del JSON deberían de aparecer en la lista de entradas de nuestro blog como borradores.

importar JSON WodPress

Este es uno de los ejemplos más básicos, pero podríamos haber definido el id del autor al que se le atribuirán los artículos (post_author), que los artículos aparecieran directamente como publicados (post_status) o el tipo de post que será (post_type).

Podéis aprender más sobre esta función en el codex de WordPress, sobre los campos que podemos incluir en el array y, muy importante, cómo utilizar el ID para actualizar un post en lugar de insertar uno nuevo.

Cómo introducir custom fields

Se puede dar el caso de que necesitemos asignar también alguno de los campos importados como si fuera un custom field. Para ello basta con introducir un par de modificaciones, con lo que el archivo quedaría:

<?php
$json=file_get_contents('http://tedxcuestadelbailio.com/json.php');
$array=json_decode($json);
//echo("<pre>");
//var_dump($array);
//echo("</pre>");

$subarray=$array->contenidos;
require('wp-blog-header.php');

foreach($subarray as $articulo)
{
	$titulo=$articulo->titulo;
	$contenido=$articulo->descripcion;
	$post=array(
		'post_title'=>$titulo,
		'post_content'=>$contenido
	);
	$id=wp_insert_post($post,$wp_error);
	$valor_campo_personalizado="HOLA";
	add_post_meta( $id, 'campo personalizado', $valor_campo_personalizado, true);
}

Espero que os haya sido útil.