wordpress base de datos

Tablas personalizadas en la Base de Datos de WordPress

En el desarrollo de proyectos en WordPress y desarrollo web en Valencia, a veces es necesario crear nuevas tablas en la base de datos de WordPress e interactuar con los datos que contienen. Esto puede ser interesante en el caso de no querer interferir con las tablas nativas de WordPress.

Antes de generar nuevas tablas hay que meditar los pros y contras que ello conlleva. Estas no deben interferir con las tablas nativas de WordPress y las que crean los plugins que instalamos en nuestro proyecto.

Lo primero para crear nuestras tablas es saber cuales existen por defecto en nuestro proyecto de WordPress (Fuente: codex WordPress):

WordPress provee de la clase wpdb para el acceso a la base de datos. Los métodos de esta clase no pueden ser llamados directamente. Para ello tenemos el objeto $wpdb, que para ser utilizado en nuestro código PHP debemos declararlo como una variable global, usando el comando

global $wpdb

Antes de hacer uso del acceso a la base de datos, hay que tener en cuenta que las tablas pueden tener un prefijo diferente a wp_, el cual lo podemos conocer con el comando:

$wpdb->prefix

Y, asimismo, la intercalación (collation) de datos con la base de datos:

$wpdb->collate

CREAR TABLA

Vamos a ver como crear una tabla: para ello definimos una variable $sql con el comando SQL de creación de una tabla

$prefix = $wpdb->prefix;
$collate = $wpdb->collate;
$nombre_tabla = $prefix.'mitabla';

$sql = "CREATE TABLE {$nombre_tabla} (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  fecha_creacion datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
  titulo varchar(30),
  descripcion varchar(255),
  estado mediumint(8),
  PRIMARY KEY  (id)
  KEY fecha_id (fecha_creacion),
) 
COLLATE {$collate}";

Para la creación y/o la modificación de la estructura de una tabla existente se puede utilizar la función dbDelta

dbDelta($queries,$execute)

Siendo necesario requerir o incluir el archivo upgrade.php, que se puede hacer con el comando:

require_once(ABSPATH.'wp-admin/includes/upgrade.php')

con lo que una función para crear una tabla podría tener el siguiente código, en la que le pasamos en nombre de la tabla:

function crear_tabla($mi_tabla) {
  global $wpdb;
  $prefix = $wpdb->prefix;
  $collate = $wpdb->collate;
  $nombre_tabla = $prefix.$mi_tabla;
  $sql = "CREATE TABLE {$nombre_tabla} (
      id bigint(20) NOT NULL AUTO_INCREMENT,
      fecha_creacion datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
      titulo varchar(30),
      descripcion varchar(255),
      estado mediumint(8),
      PRIMARY KEY  (id)
      KEY fecha_id (fecha_creacion),
    ) 
    COLLATE {$collate}";
  require_once(ABSPATH.'wp-admin/includes/upgrade.php');
  dbDelta($sql);
}

Para ejecutar esta función:

crear_tabla('ejemplo_tabla')

Hay que tener en cuenta lo siguiente en la declaración de la sentencia SQL:

  • cada campo de la tabla debe estar en una línea,
  • después de PRIMARY KEY deben haber 2 espacios en blanco,
  • hay que definir al menos una clave (KEY),
  • la clave KEY debe ir seguida de un espacio, después el nombre de la clave y el nombre del campo entre paréntesis,
  • los nombres de los campos deben estar en minúsculas y las sentencias en mayúsculas,
  • en los campos de tipo texto se debe indicar el tamaño.

Pasemos a interaccionar con la tabla.

INSERTAR DATOS

Mediante la función $wpdb->insert podemos introducir datos en nuestra tabla, en este caso una fila, pasándole el nombre de la tabla, los datos y opcionalmente el formato.

$wpdb->insert($table,$data,$format)

En el siguiente ejemplo se puede seguir como realizarlo:

global $wpdb;
$prefix=$wpdb->prefix;
$nombre_tabla=$prefix.'ejemplo_tabla';
$fila=array(
  'titulo'=>'Mi título',
  'descripcion'=>'Mi descripción'
 );
 $resultado=$wpdb->insert($nombre_tabla,$fila); 

donde $resultado nos da false si no ha podido ser insertado y 1 si se ha insertado la fila.

Para acceder a la ID generado por la columna AUTO_INCREMENT, se puede ver con la función

$wpdb->insert_id

MODIFICAR DATOS

Para modificar los datos de filas podemos utilizar la función $wpdb->update, en la que le indicamos el nombre de la tabla, los datos a poner y la condición que deben cumplir las filas. Nos devuelve false si no se han modificado filas o el número de filas modificadas.

$wpdb->update($table,$data,$where,$format,$where_format)

Veamos un ejemplo en el que se modifica la fila con el id=5:

global $wpdb;
$prefix=$wpdb->prefix;
$nombre_tabla=$prefix.'ejemplo_tabla';
$datos = array(
  'titulo'=>'Mi título',
  'descripcion'=>'Mi descripción'
);
$where=array('id'=>5);
$resultado=$wpdb->update($nombre_tabla,$datos,$where); 

ELIMINAR DATOS

Para eliminar filas de una tabla, podemos utilizar la función $wpdb->delete. En la que le pasamos el nombre de la tabla y lo que queremos eliminar.

$wpdb->delete($table,$where,$where_format)

Veamos un ejemplo en el que se elimina la fila con id=5:

global $wpdb;
$prefix=$wpdb->prefix;
$nombre_tabla=$prefix.'ejemplo_tabla';
$where=array('id'=>5);
$resultado=$wpdb->delete($nombre_tabla,$where); 

LEER DATOS

Mediante la función $wpdb->get_results podemos obtener datos de la tabla. En esta función le pasamos una sentencia SQL y el tipo de retorno que queremos (OBJECT o ARRAY).

$wpdb->get_results($query,$output)

Veamos un ejemplo, en el que nos retorna todas las filas de la tabla:

global $wpdb;
$prefix=$wpdb->prefix;
$nombre_tabla=$prefix.'ejemplo_tabla';
$query="SELECT * FROM {$nombre_tabla} WHERE 1=1";
$resultados=$wpdb->get_results($query); 

para ver cada fila de la tabla podemos utilizar el bucle

foreach ($resultados as $resultado) {
  echo $resultado->titulo.': '.$resultado->descripcion;
}

EJECUTAR SENTENCIAS SQL GENERALES

La función $wpdb->query permite ejecutar cualquier sentencia SQL sobre la base de datos de WordPress.

$wpdb->query($query)

donde $query es una cadena de caracteres (string).

Esta función devuelve un valor entero con el número de filas afectadas en el caso de comandos SQL que actúen sobre filas (SELECT, INSERT, DELETE, UPDATE, etc). Para el caso de comandos que afecten a toda la tabla (CREATE, ALTER, TRUNCATE y DROP), devuelve true en el caso de que la operación sea satisfactoria. Si se produce un error, devuelve el valor false. Es conveniente utilizar el operador === para diferenciar el valor de retorno 0 (0 filas) de false (error) para sentencias sobre filas.

Una buena práctica para ejecutar sentencias SQL es utilizar la función $wpdb->prepare, que prepara la sentencia SQL para una ejecución segura.

Ejemplo de función para eliminar una tabla:

function eliminar_tabla($tabla) {
  global $wpdb;
  $prefix=$wpdb->prefix;
  $nombre_tabla=$prefix.$tabla;
  $sql="DROP TABLE IF EXISTS {$nombre_tabla}";
  require_once(ABSPATH.'wp-admin/includes/upgrade.php');
  $wpdb->query($sql);
}

RECOMENDACIÓN FINAL

En el caso de crear tablas para uso personalizado en un proyecto es conveniente prever su mantenimiento y posible generación de datos basura, por lo que es recomendable generar opciones de limpieza y consistencia de estas tablas dentro del proyecto. A más, si estas tablas son temporales o se decide su no uso, es conveniente que estas se eliminen de la base de datos, como es el caso de desinstalación o desactivación de plugins.