Desde hace unas versiones WordPress introdujo una API rest con la cual permite acceder al contenido externamente. La adición de una API es una herramienta muy potente ya que nos permite fácilmente extender la oferta web a aplicaciones como puede ser Android o iOS.
Con la API de WordPress podremos realizar las siguientes peticiones:
- GET: Permite obtener datos como los posts, entradas, usuarios, entre otros datos.
- POST: Permite enviar datos para crear contenido.
- PUT: Permite la actualización de datos a partir del contenido enviado.
- DELETE: Permite la eliminación del contenido.
Sin embargo, por defecto estas peticiones son para los tipos de datos que incluye WordPress por defecto(Post, Páginas, Usuarios, etc...), pero en este artículo a parte de ver como acceder a estos datos os explicaremos como crear nuestro propio endpoint para consultar e insertar nuestros Custom Post Types.
Creación de claves de acceso a la API
Para poder acceder a la API se necesita crear unas claves de Usuario/Clave para que las peticiones no sean rechazadas. Para el ejemplo de este artículo utilizaremos el Plugin "Application Passwords" que nos permite crear una clave para el usuario de WordPress sin exponer su contraseña de acceso al panel de WordPress.
Para añadir el Plugin iremos a Plugins -> Añadir nuevo y en la barra de búsqueda escribiremos "Application Passwords" e instalamos y activamos el plugin.
Una vez tenemos el plugin activado iremos a Usuarios y seleccionamos el usuario que queramos conceder acceso a la api. Es recomendable crear un usuario nuevo para esto ya que no se recomienda utilizar el usuario "admin" de WordPress.
Cuando estemos en el perfil del usuario veremos que se ha añadido un nuevo apartado llamado "Application Passwords", aquí deberemos escribir un título descriptivo para la nueva clave y hace clic en "Add New".
Una vez hacemos clic en "Add New" deberemos guardar la clave que nos muestra ya que será la que utilizaremos para autenticarnos. Para nuestro ejemplo las claves serian usuario: clouding y contraseña Dfjp KptN ogp2 1Ytv Hq48 HPzy.
Con esto ya tenemos la base para poder acceder a la api de WordPress.
Obtener y crear Posts con la api de WordPress
Para el ejemplo utilizaremos la herramienta Postman que nos permitirá de forma sencilla probar el funcionamiento de nuestra API. Si no la conocéis podéis descargarla en este enlace https://www.postman.com/.
La URL a la que deberemos mandar las peticiones será "https://midominio.com/wp-json/wp/v2/posts". Podremos modificar "Posts" por las siguientes opciones entre otras que incluye WordPress por defecto:
Nombre | Ruta |
---|---|
Categories | /wp/v2/categories |
Tags | /wp/v2/tags |
Pages | /wp/v2/pages |
Users | /wp/v2/users |
Post Types | /wp/v2/types |
Podéis consultar el resto de endpoints en el siguiente enlace https://developer.wordpress.org/rest-api/reference/.
Obtener el listado de posts de nuestro sitio WordPress
Ahora abrimos Postman y hacemos clic en "New Collection".
Especificamos un nombre, una descripción y hacemos clic en Create.
Ahora creamos una nueva Request.
Escribimos un título y una descripción y hacemos clic en Save.
Seleccionamos la nueva Request del menú de la izquierda y añadimos la URL a la que vamos a hacer la petición de tipo GET y en el apartado Authorization escogemos el tipo Basic Auth y añadimos las credenciales creadas anteriormente.
Hacemos clic en send y nos devolverá un JSON como el siguiente. En el que podremos ver información com el ID del post, el título y el contenido.
Crear un posts en nuestro sitio WordPress
Desde Postman creamos una nueva Request como hemos realizado anteriormente. Especificamos la URL pero esta vez cambiamos el tipo de GET a POST.
Rellenamos de nuevo el apartado Authorization como hemos hecho anteriormente:
Cómo tenemos que enviar datos a la api ahora seleccionaremos Body -> raw -> JSON. Crearemos un JSON como el siguiente indicando el título y el contenido.
Una vez especificados los datos que enviaremos a la api hacemos clic en Send y obtendremos una respuesta como la siguiente:
Podemos verificar desde el panel de administración de WordPress que el Post se ha creado correctamente.
Podemos añadir parámetros a nuestra Request para que se publique automáticamente, insertar la categoría, tags, etc...
Con estos sencillos pasos hemos podido ver cómo acceder a nuestro WordPress a través de la API para obtener e insertar los datos desde una aplicación externa.
Crear un Custom Post Types
Para crear un Custom Post Type para el ejemplo iremos a Aparencia -> Editor de Temas y abriremos el fichero functions.php. En este fichero añadiremos el siguiente código, el cual crea un tipo "servidoresVps" en el que añadiremos un "TextBox" para especificar la dirección IP de nuestros servidores. También, se específica la función para guardar los datos a la base de datos de WordPress.
Además, especificamos la variable "show_in_rest" con un valor "true" para que pueda ser accesible por la API de WordPress y habilitamos "custom-fields" para poder añadir campos propios.
<?php
add_action( 'init', 'registrar_custom_post_type' );
function registrar_custom_post_type() {
$labels = array(
'name' => _x( 'Servidores VPS', 'post type general name', 'text-domain' ),
'singular_name' => _x( 'Servidor VPS', 'post type singular name', 'text-domain' ),
'menu_name' => _x( 'Servidores VPS', 'admin menu', 'text-domain' ),
'add_new' => _x( 'Añadir nuevo', 'servidor', 'text-domain' ),
'add_new_item' => __( 'Añadir nuevo servidor', 'text-domain' ),
'new_item' => __( 'Nuevo servidor', 'text-domain' ),
'edit_item' => __( 'Editar servidor', 'text-domain' ),
'view_item' => __( 'Ver servidor', 'text-domain' ),
'all_items' => __( 'Todos los servidores', 'text-domain' ),
'search_items' => __( 'Buscar servidor', 'text-domain' ),
'not_found' => __( 'No hay servidores.', 'text-domain' ),
'not_found_in_trash' => __( 'No hay servidores en la papelera.', 'text-domain' )
);
$args = array(
'labels' => $labels,
'description' => __( 'Descripción.', 'text-domain' ),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'libro' ),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'show_in_rest' => true,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments', 'custom-fields')
);
register_post_type( 'servidoresVps', $args );
}
function informacion_vps_metabox() {
add_meta_box( 'informacion-vps', 'Datos técnicos del servidor', 'informacion_vps_box_content', 'servidoresVps', 'normal', 'high' );
}
add_action( 'add_meta_boxes', 'informacion_vps_metabox' );
function informacion_vps_box_content( $post ) {
$values = get_post_custom( $post->ID );
$ip = isset( $values['info_vps_ip'] ) ? esc_attr( $values['info_vps_ip'][0] ) : '';
?>
<p>
<label for="info_vps_ip">IP del servidor</label>
<input type="text" name="info_vps_ip" id="info_vps_ip" value="<?php echo esc_html( $ip ); ?>" />
</p>
<?php
}
add_action( 'save_post', 'informacion_vps_metabox_save' );
function informacion_vps_metabox_save( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post' ) ) {
return;
}
if ( isset( $_POST['info_vps_ip'] ) ) {
update_post_meta( $post_id, 'info_vps_ip', wp_kses( $_POST['info_vps_ip'], $allowed ) );
}
}
Una vez guardemos el fichero nos aparecerá en el menú lateral izquierdo nuestro nuevo tipo.
Sí creamos un nuevo registro nos aparecerá el campo de texto para insertar la "Ip del servidor".
Exponer Custom Post Types a la API de WordPress para insertar datos
Lo primero que vamos a hacer para poder insertar datos por la API es registrar una ruta propia con el método POST. El siguiente código debemos insertarlo en Aparencia -> Editor de Temas -> functions.php. Esto declarará la url midominio.com/wp-json/api/v1/insertar_vps.
add_action( 'rest_api_init', function() {
register_rest_route( 'api/v1','/insertar_vps', [
'methods' => 'POST',
'callback' => 'insertar_vps'
] );
} );
Ahora tenemos que crear la función para el callback que insertará los datos recibidos a la base de datos de WordPress. Para ello creamos la siguiente función:
function insertar_vps($data){
$parameters = $data->get_params();
$my_post = array(
'post_title' => $parameters['post_title'],
'post_content' => $parameters['post_content'],
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'servidoresVps',
'meta_input' => array(
'info_vps_ip' => $parameters['info_vps_ip'],
)
);
$idPost = wp_insert_post( $my_post );
if($idPost != 0){
return "OK";
};
return "KO";
}
Si abrimos Postman como hemos hecho anteriormente podemos realizar la prueba de insertar datos creando una nueva Request como la siguiente:
Podemos ver el resultado en nuestro sitio WordPress haciendo clic en el menú lateral izquierdo en Servidores VPS. Como vemos en las siguientes imágenes nos ha guardado los datos que hemos pasado en la request enviada a la API.
Finalmente, crearemos las funciones para poder obtener el listado de Post del tipo servidoresVPS que hemos creado. Para ello crearemos una nueva ruta a la API i un nuevo callback que nos devolverá los posts.
add_action( 'rest_api_init', function() {
register_rest_route( 'api/v1','/obtener_vps', [
'methods' => 'GET',
'callback' => 'obtener_vps'
] );
} );
function obtener_vps() {
$args = [
'numberposts' => 10,
'post_type' => 'servidoresVps',
];
$posts = get_posts($args);
$data = [];
$data['ID'] = $posts[0]->ID;
$data['title'] = $posts[0]->post_title;
$data['content'] = $posts[0]->post_content;
$data['info_vps_ip'] = $posts[0]->info_vps_ip;
return $data;
}
Podemos realizar la prueba en Postman creando un nuevo Request de tipo GET especificando la nueva ruta. Cómo vemos en la siguiente imagen nos ha devuelto el Post creado en el ejemplo anterior.
Con los pasos realizados en este artículo hemos podido ver cómo extender las funcionalidades de nuestro sitio web WordPress para que sean accesibles desde otras plataformas como podría ser desde una APP Android o iOS.