Comment personnaliser la classe wpdb et ajouter de nouvelles méthodes
Publié: 2018-07-10La couche d'abstraction de la base de données WordPress, plus communément appelée wpdb est une classe basée sur ezSQL chargée d'interagir avec la base de données. La classe wpdb est également un drop-in - un morceau de code WP de base qui peut facilement être remplacé par un autre morceau de code avec des fonctionnalités similaires (une liste à jour des drop-ins est disponible dans WP Code Reference).
Modifier la classe #wpdb par défaut n'est pas compliqué. Vous pouvez facilement ajouter, supprimer ou modifier seulement quelques méthodes. Pas besoin de remplacer toute la classe. #wordpress
CLIQUEZ POUR TWEETERC'est là qu'une grande idée fausse entre en jeu. Les gens perçoivent « remplacé » comme dans « écrire ma propre classe de base de données complète ». Heureusement, vous n'avez pas à écrire toute la classe de base de données. Vous pouvez prendre la classe existante et ajouter, supprimer ou modifier uniquement les fonctions dont vous avez besoin. Et c'est ce que nous allons faire.
Pourquoi modifier la classe wpdb ?
Wpdb a sûrement tout ce dont vous avez besoin ! ? L'ensemble du WP est construit dessus. Techniquement c'est correct. En utilisant la méthode $wpdb->query()
vous pouvez exécuter n'importe quelle commande SQL. Mais avec cette logique appliquée, nous n'aurions jamais ou n'aurions jamais besoin de méthodes comme $wpdb->insert()
ou $wpdb->get_var()
. Mais nous le faisons, car ils permettent de gagner du temps, de réduire les bogues et d'éloigner les mauvaises requêtes. Alors, quelles fonctions manquent? Cela dépend du projet sur lequel vous travaillez. Nous avions besoin d'assistance pour ces deux requêtes :
INSERT IGNORE INTO tbl_name ...
INSERT INTO tbl_name ... ON DUPLICATE KEY UPDATE ...
Étape #1 - Créer le drop-in
Le processus de création d'un drop-in DB est simple et le résultat final se fond parfaitement dans WP.
Créez un fichier nommé db.php
et placez-le dans le dossier /wp-content/
. Donnez au fichier un en-tête de plugin standard et créez une classe qui étend wpdb. Quelque chose comme ça:
<?php /* Plugin Name: Extended wpdb Description: A few extra functions for wpdb Version: 1.0 Author: WebFactory Ltd */ class wpdb_extended extends wpdb { public function __construct(){ parent::__construct( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); } public function test() { echo 'Extended wpdb is running.'; } } global $wpdb; $wpdb = new wpdb_extended();
L'en-tête est assez explicite. La méthode de construction s'assure que nous créons une nouvelle connexion à la base de données une fois qu'un objet est construit et qu'elle utilise le constructeur wpdb d'origine pour cela. Ces constantes DB sont définies dans wp-config.php
. Comme nous l'avons dit au début, nous ajoutons simplement quelques fonctions et réutilisons tout le reste. La deuxième méthode test()
sert uniquement à voir si tout fonctionne correctement.
Les deux dernières lignes sont cruciales. Comme il s'agit d'une classe personnalisée, WP ne créera pas automatiquement l'objet $wpdb
pour nous. Nous devons le faire nous-mêmes. N'oubliez pas d'utiliser le mot-clé global
car sinon, vous créerez une variable locale.
Étape #2 - Testez avant de creuser plus profondément
Ouvrez votre tableau de bord WP et rendez-vous sur Plugins. Outre les onglets habituels Tout, Actif et Inactif (plugins), vous verrez un onglet Drop-ins et, par magie, notre classe de base de données personnalisée.
Puisque l'administration fonctionne correctement, nous savons que nous avons fait du bon travail. Notre nouvelle classe étendue personnalisée est disponible et rien n'a changé. Génial! Mais, juste pour faire bonne mesure, mettez ces trois lignes de code dans le fichier functions.php
du thème (ou quelque part dans un plugin où il sera exécuté immédiatement):
global $wpdb; $wpdb->test(); die;
Exécutez n'importe quelle page d'administration ou frontale et que voyez-vous ? “ wpdb étendu est en cours d'exécution. " Parfait. Passons maintenant à nos fonctions du monde réel.
Étape #3 – Créer, modifier ou remplacer des fonctions
La requête INSERT IGNORE
semble assez facile à faire. Nous avons déjà $wpdb->insert() donc il nous manque juste un seul mot. Malheureusement, en raison du manque de filtres aux bons endroits, il ne s'agira pas de deux lignes de code.
Si vous ouvrez wp-db.php et que vous vous dirigez vers la méthode insert()
à la ligne #2100, vous verrez qu'elle utilise la méthode _insert_replace_helper()
à partir de la ligne #2151. Et cette fonction n'a pas un seul filtre ou une seule action. Nous ne pouvons pas non plus envelopper la fonction car elle renvoie immédiatement le résultat de la requête et non la requête elle-même que nous pourrions modifier. Dommage. Nous devrons remplacer les méthodes insert()
et _insert_replace_helper()
. Nous allons ajouter un paramètre supplémentaire - $ignore
. Un booléen avec la valeur par défaut de false
.
public function insert( $table, $data, $format = null, $ignore = false ) { return $this->_insert_replace_helper( $table, $data, $format, 'INSERT', $ignore = false ); }
Dans toute autre circonstance, une fonction qui a cinq paramètres serait un bon candidat pour les transformer en un tableau associatif. Mais nous voulons une rétrocompatibilité, donc nous ne le faisons pas. Les modifications apportées à l'autre fonction sont également mineures :
function _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT', $ignore = false ) { $this->insert_id = 0; if ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) { return false; } $data = $this->process_fields( $table, $data, $format ); if ( false === $data ) { return false; } $formats = $values = array(); foreach ( $data as $value ) { if ( is_null( $value['value'] ) ) { $formats[] = 'NULL'; continue; } $formats[] = $value['format']; $values[] = $value['value']; } $fields = '`' . implode( '`, `', array_keys( $data ) ) . '`'; $formats = implode( ', ', $formats ); // modification for IGNORE keyword if (true == $ignore && 'INSERT' == $type) { $type = 'INSERT IGNORE'; } $sql = "$type INTO `$table` ($fields) VALUES ($formats)"; $this->check_current_query = false; return $this->query( $this->prepare( $sql, $values ) ); }
Pourquoi les développeurs ne le font-ils pas plus souvent ?
Si vous n'avez besoin d'une requête personnalisée que quelques fois, vous pouvez facilement utiliser $wpdb->query()
. Il n'est pas nécessaire de remplacer la classe par défaut. Vous pouvez également écrire une classe personnalisée qui étend celle par défaut mais ne remplace pas l'objet wpdb. Dans ce cas, vous utiliseriez $mycustomclass->method()
mais ce n'est pas la fin du monde.
Outre le facteur de fraîcheur évident, l'extension de la classe wpdb par défaut est quelque chose qui est censé être fait dans WP et n'est pas hackish, alors n'hésitez pas à jouer avec. Gardez deux choses à l'esprit :
- lorsque vous envoyez votre projet à quelqu'un, n'oubliez pas d'inclure le fichier
db.php
; il ne sera dans aucun dossier de thème ou de plug-in - gardez un œil sur les changements dans
wp-db.php
car ils pourraient affecter votre classe personnalisée (bien que cela soit hautement improbable)