Cómo integrar artículos WordPress en nuestra web

By | 13 abril, 2014

La manera más directa para integrar artículos de nuestro blog, sea de WordPress o de otros, es accediendo directamente a la base de datos, por ejemplo en PHP, por medio de Mysqli; para lo que debemos conocer un poco la estructura de la base de datos para que las instrucciones “SELECT”, etc., funcionen correctamente y la consulta nos devuelva los datos deseados: artículos, enlaces, fechas, títulos, imágenes, etc.

SELECT ID AS id, meta_value AS thumbnail_id, post_title AS titulo, post_date AS fecha, post_content AS texto, guid AS enlace FROM wp_posts inner join wp_postsmeta on (ID = post_id) WHERE post_type LIKE 'post' AND post_status LIKE 'publish' AND meta_key LIKE '_thumbnail_id' ORDER BY post_date DESC LIMIT 4

 Pero esta no es la más intuitiva precisamente, puesto que el más mínimo error en nuestras consultas nos devolverá errores inesperados y el consiguiente cuelgue de nuestro sitio.

La mejor manera de acceder a nuestra base de datos WordPress, en este caso que nos ocupa, es usar las clases “wpdb” y “WP_Query” de la API WordPress.

La clase “wpdb”, incluida en el archivo “wp-includes/wp-db.php” de nuestro WordPress nos permite acceder a múltiples opciones de la base de datos como si de una consulta “Mysqli” se tratara, con los problemas antes relatados intrínsecos a ellas…

La clase “WP_Query”, incluida en el archivo “wp-includes/query.php” por su parte, junto con “wpdb”, nos permite acceder a todos los datos necesarios de la base de datos, pero con la ayuda de las funciones determinadas que usa el propio “Wordpress” en sus archivos PHP para mostrar en nuestro blog los artículos, etc.

The_content; Get_the_title, The_date, etc…

Como en otras integraciones, lo mejor es incluir en nuestra web el archivo “wp-load.php” del WordPress principal de los que tengamos y cuyos artículos pretendamos incluir en nuestra web…

define('WP_USE_THEMES', false);
include_once "../../wp-load.php";

Esto nos garantiza que se cargarán todas las funciones que podamos necesitar, pero también nos dará algunos problemillas en lo que se refiere al uso de “wpdb” para enlazar con una segunda o tercera o cuarta base de datos de “Wordpress”; relativamente fáciles de solucionar, eso sí, con un poco de código personalizado…

Uso de “wpdb”…

La clase “wpdb” incluye un constructor para recibir los datos del usuario, contraseña, base de datos, y host, con los que iniciar el enlace. (El orden es diferente que en “Mysqli”):

global $wpdb;
$wpdb_anterior = $wpdb;
$wpdb = @new wpdb($usuario_db, $clave_db, $db, $host);
//
//Código…
//
$wpdb = $wpdb_anterior ;

Nótese que la variable objeto en la que será asignado el enlace a la base de datos ha de llamarse “$wpdb”, aunque esta variable ya exista en “Wordpress”, porque es la que necesita “WP_Query”, sino no funcionará… Debe ser declarada “global”. También es interesante realizar una copia de seguridad de la variable para asegurarse de que un uso anterior en cualquier otra parte del programa podrá ser recuperado…

Podremos hacer la llamada tantas veces como bases de datos “Wordpress” queramos enlazar…

Para muestra, un botón…

He creado una clase que nos permitirá acceder a los artículos de nuestro “Wordpress” en tantas instancias como queramos, con una llamada de la siguiente manera:

$datos_articulos = $clase_wpdb_query->wpdb_query("usuario db", "contraseña", "base de datos", "localhost", NULL, NULL, "opinion");

// Usuario...
// Contraseña...
// Base de datos...
// Host...
// Nueva Url... : En el caso de querer enlazar una base de datos diferente de aquélla a la que pertenece "wp-load", para que sea sustituido el valor de la Url original por el nuevo dado en los enlaces recuperados...
// Número de artículos... : Número de artículos que deseamos recibir en la consulta, por defecto he puesto 4...
// Categoría... : Categoría sobre la que deseamos recibir los artículos, NULL en el caso de que queramos cualquier artículo de cualquier categoría...

Y nos devolverá un array con los datos solicitados para cada artículo, que, ni que decir tiene, pueden ser editados en la función para obtener otros diferentes o eliminar aquellos que no nos convienen…

 $datos_articulos = array("id" => "",
                         "titulo" => "",
                         "fecha" => "",
                         "contenido" => "",
                         "enlace" => "",
                         "array_categorias" => "",
                         "categorias" => "",
                         "thumbnail" => "");

 

<?php
	defined( '_JEXEC' ) or die( 'Va a ser que no...' );

	define('WP_USE_THEMES', false);
	include_once "../laislasolitaria/wp-load.php";// Carga todos los archivos necessarios de uno de nuestros blog WordPress para que se puedan usar todas las funciones necesarias... 

	class clase_wpdb_query{
		public $parte_original_url = "/laislasolitaria/";// En esta variable se guarda la parte de la url del blog al que pertenece el archivo "wp-load" incluido y que deberá ser sustituida en ciertos casos cuando accedamos a la base de datos de otro blog diferente con "wpdb_query", "wpdb" y "WP_Query"...

		function wpdb_query($usuario_db, $clave_db, $db, $host, $parte_nueva_url = NULL, $numero_articulos = 4, $categoria = ""){			
			global $wpdb;
			$wpdb_anterior = $wpdb;
			$wpdb = @new wpdb($usuario_db, $clave_db, $db, $host);
			if(!$wpdb->connect_errno){
				//$wpdb->show_errors();
				$wpdb->set_prefix('wp_');

				$argumentos = array('post_type' => 'post',
									'posts_per_page' => $numero_articulos,
									'category_name' => $categoria,);
				$nueva_consulta = new WP_Query($argumentos);
				$datos_articulo = NULL;
				$datos_articulos = NULL;
				if($nueva_consulta->have_posts()){
					while($nueva_consulta->have_posts()){
						$nueva_consulta->the_post();
						$datos_articulo = array("id" => "",
												"titulo" => "",
												"fecha" => "",
												"contenido" => "",
												"enlace" => "",
												"array_categorias" => "",
												"categorias" => "",
												"thumbnail" => "");

						$datos_articulo['id'] = get_the_ID();
						$datos_articulo['titulo'] = get_the_title();
						$datos_articulo['fecha'] = get_the_date();
						$datos_articulo['contenido'] = get_the_content();
						$datos_articulo['enlace'] = get_permalink();
						$datos_articulo['array_categorias'] = get_the_category();// Array de categorías, enlaces, etc...
						$thumbnail = get_post_thumbnail_id();
						$thumbnail = wp_get_attachment_image_src($thumbnail,'thumbnail-size', true);
						$datos_articulo['thumbnail'] = $thumbnail[0];

						if(!is_null($parte_nueva_url)){
							$datos_articulo['enlace'] = str_replace($this->parte_original_url, $parte_nueva_url, $datos_articulo['enlace']);
							$datos_articulo['thumbnail'] = str_replace($this->parte_original_url, $parte_nueva_url, $datos_articulo['thumbnail']);
							}

						$datos_articulos[] = $datos_articulo;
						}
					if(isset($datos_articulos)){
						return $datos_articulos;
						}
						else{
							return false;
							}
					}
					else{
						//echo "Vaya, no hay entradas...";
					}
				$wpdb->close;
				}
				else{
					//echo "Error...";
					}
				$wpdb = $wpdb_anterior;
				}
		}
?>

AVISO:

Este código es funcional, pero absolutamente mejorable, por lo que cada cual se debe responsabilizar del uso que le dé al integrarlo en su propio código…