wordpress base de datos

Taules personalitzades en la base de dades de WordPress

En el desenvolupament de projectes en WordPress, a vegades és necessari crear noves taules en la base de dades de WordPress i interactuar amb les dades que contenen. Això pot ser interessant en el cas de no voler interferir amb les taules natives de WordPress.

Abans de generar noves taules cal meditar els pros i contres que això comporta. Aquestes no han d’interferir amb les taules natives de WordPress i les que creguen els plugins que instal·lem en el nostre projecte.

El primer per a crear les nostres taules és saber quines existeixen per defecte en el nostre projecte de WordPress (Font: codex WordPress):

WordPress proveeix de la classe wpdb per a l’accés a la base de dades. Els mètodes d’aquesta classe no poden ser anomenats directament. Per a això tenim l’objecte $wpdb, que per a ser utilitzat en el nostre codi PHP hem de declarar-ho com una variable global, usant el comando:

global $wpdb

Abans de fer ús de l’accés a la base de dades, cal tindre en compte que les taules poden tindre un prefix diferent de wp_, el qual el podem conéixer amb el comando:

$wpdb->prefix

I, així mateix, la intercalació (collation) de dades amb la base de dades:

$wpdb->collate

CREAR TAULA

Veurem com crear una taula: per a això definim una variable $sql amb el comando SQL de creació d’una taula

$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}";

Per a la creació i/o la modificació de l’estructura d’una taula existent es pot utilitzar la funció dbDelta

dbDelta($queries,$execute)

Sent necessari requerir o incloure l’arxiu upgrade.php, que es pot fer amb el comando:

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

amb el que una funció per a crear una taula podria tindre el següent codi, en la qual li passem en nom de la taula:

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);
}

Per a executar aquesta funció:

crear_tabla('ejemplo_tabla')

Cal tindre en compte el següent en la declaració de la sentència SQL:

  • cada camp de la taula ha d’estar en una línia,
  • després de PRIMARY KEY han d’haver-hi 2 espais en blanc,
  • cal definir almenys una clau (KEY),
  • la clau KEY ha d’anar seguida d’un espai, després el nom de la clau i el nom del camp entre parèntesi,
  • els noms dels camps han d’estar en minúscules i les sentències en majúscules,
  • en els camps de tipus text s’ha d’indicar la grandària.

Passem a interaccionar amb la taula.

INTRODUIR DADES

Mitjançant la funció $wpdb->insert podem introduir dades en la nostra taula, en aquest cas una fila, passant-li el nom de la taula, les dades i opcionalment el format.

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

En el següent exemple es pot seguir com realitzar-lo::

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); 

on $resultado ens dona false si no ha pogut ser introduïda i 1 si s’ha introduït la fila.

Per a accedir a l’ID generat per la columna AUTO_INCREMENT, es pot veure amb la funció

$wpdb->insert_id

MODIFICAR DADES

Per a modificar les dades de files podem utilitzar la funció $wpdb->update, en la qual li indiquem el nom de la taula, les dades a posar i la condició que han de complir les files. Ens retorna false si no s’han modificat files o el nombre de files modificades.

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

Vegem un exemple en el qual es modifica la fila amb l’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 DADES

Per a eliminar files d’una taula, podem utilitzar la funció $wpdb->delete. En la qual li passem el nom de la taula i el que volem eliminar.

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

Vegem un exemple en el qual s’elimina la fila amb id=5:

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

LLEGIR DADES

Mitjançant la funció $wpdb->get_results podem obtenir dades de la taula. En aquesta funció li passem una sentència SQL i el tipus de retorn que volem (OBJECT o ARRAY).

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

Vegem un exemple, en el qual ens retorna totes les files de la taula:

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

per a veure cada fila de la taula podem utilitzar el bucle

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

EXECUTE GENERAL SQL STATEMENTS

La funció $wpdb->query permet executar qualsevol sentència SQL sobre la base de dades de WordPress.

$wpdb->query($query)

on $query és una cadena de caràcters (string).

Esta funció retorna un valor sencer amb el nombre de files afectades en el cas de comandos SQL que actuen sobre files (SELECT, INSERT, DELETE, UPDATE, etc). Per al cas de comandos que afecten a tota la taula (CREATE, ALTER, TRUNCATE i DROP), retorna true en el cas que l’operació siga satisfactòria. Si es produeix un error, retorna el valor false. És convenient utilitzar l’operador === per a diferenciar el valor de retorn 0 (0 files) de false (error) per a sentències sobre files.

Una bona pràctica per a executar sentències SQL és utilitzar la funció $wpdb->prepare, que prepara la sentència SQL per a una execució segura.

Exemple de funció per a eliminar una taula:

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);
}

RECOMANACIÓ FINAL

En el cas de crear taules per a ús personalitzat en un projecte és convenient preveure el seu manteniment i possible generació de dades fem, per la qual cosa és recomanable generar opcions de neteja i consistència d’aquestes taules dins del projecte. A més, si aquestes taules són temporals o es decideix el seu no ús, és convenient que aquestes s’eliminen de la base de dades, com és el cas de desinstal·lació o desactivació de plugins.