Skip to main content

Crear una tabla en wordpress

En este ejemplo nos ha surgido la necesidad de crear una tabla en la base de datos de wordpress para guardar unos registros, para ello vamos a utilizar la función dbDelta, el código sería el siguiente:

require './wp-load.php';
require './wp-admin/includes/upgrade.php';

global $wpdb;

$prefix = $wpdb->prefix;

$crearTabla = "CREATE TABLE IF NOT EXISTS `".$prefix."bloques_datos2` (
  `id_bloque_dato` int(11) NOT NULL AUTO_INCREMENT,
  `id_post` int(11) NOT NULL,
  `id_bloque` int(11) NOT NULL,
  `bloque` varchar(255) NOT NULL,
  `key_bloque` varchar(255) NOT NULL,
  `valor_bloque` longtext NOT NULL,
  `id_subbloque` int(11) NOT NULL,
  `key_subbloque` varchar(255) NOT NULL,
  `valor_subbloque` longtext NOT NULL,
  PRIMARY KEY (`id_bloque_dato`),
  KEY `id_bloque` (`id_bloque`),
  KEY `id_post` (`id_post`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8";

dbDelta($crearTabla);

Explicación del código

Lo primero que hay que hacer es cargar los ficheros wp-load.php y upgrade.php (en el caso de que ya estén cargados no es necesario, en este ejemplo el código esta en un fichero fuera de la jerarquía de wordpress).

Con «$prefix = $wpdb->prefix;» obtenemos el prefijo de las tablas para incorporarlo a la query.

$crearTabla contiene el «Create table» que va a ejecutar dbDelta, que es la función que se encargara de ejecutar la consulta pasada.

Pruebas realizadas con la versión 5.4.1 de wordpress.

PD: En el caso de no funcionar, comprobar que el «Create table» es correcto.

Mostrar consultas realizadas por mi WordPress

Si lo que estamos buscando es optimizar nuestro wordpress, esta función te puede venir bien para saber cuantas consultas realiza a la base de datos.

Lo primero que tenemos que hacer es habilitar SAVEQUERIES en nuestro fichero «wp-config.php«

define('SAVEQUERIES', true);

Esto le dice a WordPress que guarde todas las consultas.

Para obtener la consultas realizadas hay que utilizar $wpdb->query, añadimos este código a nuestra página (por ejemplo en el footer)

global $wpdb;
echo '<pre>';
print_r($wpdb->queries);
echo '</pre>';

Obtendremos:

[0] => Array
        (
            [0] => SELECT option_name, option_value FROM dg_options WHERE autoload = 'yes'
            [1] => 0.00107002258301
            [2] => require('wp-blog-header.php'), require_once('wp-load.php'), require_once('wp-config.php'), require_once('wp-settings.php'), wp_not_installed, is_blog_installed, wp_load_alloptions
            [3] => 1588409077.08
            [4] => Array
                (
                )

        )

Pruebas realizadas en la versión de WordPress 5.4.1

Cuantas consulta a la base de datos realiza mi WordPress

WordPress nos facilita una función (get_num_queries()) para obtener el número de consultas a la base de datos:

get_num_queries()

Ejemplo:

Añado este código al fichero footer.php justo antes de cerrar el body (</body).

<?php echo '<!-- ' . get_num_queries() . ' consultas a la base de datos -->'; ?>

Para ver la cantidad tienes que ver el código fuente puesto que esta comentado en el html.

Consultar los posts de wordpress desde un fichero externo

En este ejemplo vamos a realizar una consulta a la base de datos de wordpress utilizando $wpdb desde un fichero externo php (fuera de la estructura de wordpress)

WordPress $wpdb nos proporciona un objeto global para realizar las consultas a la base de datos, dicho objeto es una instancia de /wp-includes/wp-db.php.

Empécemos con el ejemplo:

Creamos un fichero php, yo le llamare exportacion.php y pegamos el siguiente código:

<?php
require './wp-load.php';
global $wpdb;

$prefix = $wpdb->prefix;
$table = $prefix . "posts";

$posts = $wpdb->get_results("SELECT * FROM $table");

print_r($posts);

Detallo, mi ejemplo esta creado en la raiz de ficheros:

require './wp-load.php';

Con este require añadimos toda la infraestructura de wordpress.

global $wpdb;

Invocamos a la variable global $wpdb (es el objeto que se va a encargar de realizar la consulta)

$prefix = $wpdb->prefix;

El atributo prefix nos devuelve el prefijo de las tablas (wp_), esto es necesario si has cambiado el prefijo de las tablas (yo lo suelo hacer).

$table = $prefix . "posts";

Prepara una variable con el nombre de la tabla que voy a realizar la consulta.

$posts = $wpdb->get_results("SELECT * FROM $table");

$wpdb->get_results realiza la consulta a la base de datos y me añade los registro a la variable $posts.

Ya podríamos recorrer la variable $posts y obtener los post.