Créer une page WordPress avec une requête SQL sur une table personnalisée
Alors vous voulez créer votre propre page, qui va interroger votre base de donnée ?
Voici l’exemple d’une page WordPress qui va ressortir le contenu d’une table nommée « goods », qui contient des produits.
Etape 1:
Dans cet exemple, Créons dans la base de données utilisée par WordPress une table nommée « goods » comme ceci:
MariaDB [mabase]> create table goods (reference varchar(30), description varchar(500), fabricant varchar(50), prix_vente float (8,2)); Query OK, 0 rows affected (0.15 sec) MariaDB [mabase]>
Ajoutons quelques articles dans la table…
MariaDB [activpart]> insert into goods (reference, description, fabricant, prix_vente) VALUES ('1111','Guidon','Peugeot',20.50); Query OK, 1 row affected (0.04 sec) MariaDB [activpart]> insert into goods (reference, description, fabricant, prix_vente) VALUES ('1234','Garde boue','Motobécane',15.30); Query OK, 1 row affected (0.04 sec) MariaDB [activpart]> select * from goods; +-----------+-------------+-------------+------------+ | reference | description | fabricant | prix_vente | +-----------+-------------+-------------+------------+ | 1111 | Guidon | Peugeot | 20.50 | | 1234 | Garde boue | Motobécane | 15.30 | +-----------+-------------+-------------+------------+ 2 rows in set (0.00 sec) MariaDB [activpart]>
Etape 2:
Créez dans votre dossier wp-content/themes/<votre_theme> , un fichier « produits.php » qui contient:
<?php /* Template Name: produits */ // Version 2016-09-29 get_header(); // On affiche l'en-tête du thème WordPress global $wpdb; // On se connecte à la base de données du site $produits = $wpdb->get_results(" SELECT reference, description, prix_vente FROM goods; "); // print_r($produits); echo "<table>"; echo "<tr>"; echo "<th>Référence</th>"; echo "<th>Description</th>"; echo "<th>Fabricant</th>"; echo "<th>Prix H.T</th>"; echo "</tr>"; foreach($produits as $produit) { echo '<tr>'; echo "<td>".$produit->reference."</td>"; echo "<td>".$produit->description."</td>"; echo "<td>".$produit->fabricant."</td>"; echo "<td style=text-align:right>".$produit->prix_vente."</td>"; echo '</tr>'; } echo '</table>'; php get_footer(); // On affiche de pied de page du thème ?>
Etape 3:
Dans l’interface de WordPress, créez une page vide, nommée par exemple « Les produits », en indiquant simplement le modèle correspondant au « Template Name » indiqué dans le script PHP, à savoir dans cet exemple : « produits ».
N’oubliez pas de sauvegarder la page…
Puis il ne vous reste qu’à tester le permalien:
Voir l’exemple ici : http://www.activpart.com/les-produits
Si votre base de données de produits est différente de celle de WordPress
Dans l’exemple ci-dessus, la table « goods » a été créée est dans la même base de données que le site WordPress. C’est ce que je conseille pour simplifier.
Mais si vos données sont dans une base de données à part, alors le code serait le suivant. Par exemple votre base s’appelle « dupontsarl », avec un utilisateur « toto » et le mot de passe »abracadabra » :
<?php /* Template Name: produits */ // Version 2022-11-23 get_header(); // On affiche l'en-tête du thème WordPress // Connexion à la base de données externe à WordPress $dbh = new PDO("mysql:host=localhost;dbname=dupontsarl", 'toto', 'abracadabra'); $requete="SELECT reference, description, prix_vente FROM goods"; $produits = $dbh->query($requete); // Exécution de la requête $nb_produits = $produits->rowCount(); // Compte du nombre de lignes trouvées echo "<p>$nb_produits produits trouvés</p>"; echo '<table>'; echo '<tr>'; echo "<th>Référence</th>"; echo "<th>Description</th>"; echo "<th>Fabricant</th>"; echo "<th>Prix H.T</th>"; echo "</tr>"; foreach($produits as $produit) { // On boucle sur chaque ligne trouvée echo "<tr>"; echo "<td>".$produit['reference']."</td>"; echo "<td>".$produit['description']."</td>"; echo "<td>".$produit['fabricant']."</td>"; echo "<td style=text-align:right>".$produit['prix_vente']."</td>"; echo "</tr>"; } echo '</table>'; get_footer(); // On affiche de pied de page du thème WordPress ?>
Jean-Jacques Gioan
Bonjour,
J’ai tenté d’exploiter votre exemple mais seuls les intitulés de colonnes s’affichent.
Ne sachant pas si je peux mettre mon code ici, 2 points m’ont laissés perplexe :
– je me réfère à une table et non une base
– je n’ai pas su quoi mettre à la place de « goods » (FROM goods;)
Je profite de cette demande pour vous demander confirmation de vos prix de formation.
Mon projet :
– un générateur de requêtes SQL avec sélection sur plusieurs tables et la faculté de saisir dans les requêtes des valeurs Maxi/Mini sur certains champs.
Précisions :
– il sagit d’un projet personnel en local
– je réside à Marignane et étant à la retraite je peux me déplacer… avec plaisirs jusqu’à La Ciotat
A vous lire
Cordiales saltations
admin
Bonsoir Jean-Jacques,
Merci pour ce commentaire.
En effet pour être complet j’ai ajouté à cette article une étape: celle qui consiste à créer la table « goods » donnée en exemple, et à y ajouter quelques articles.
Concernant votre projet, je vous adresse un Email privé demain…
Bonne soirée,
JF Rullier, ACTIVPART.
maxichou
Mon infinie reconnaissance. J’ai passé ma journée à chercher ça. Cependant, il n’y a pas plus « moderne » pour faire afficher sa base de données maintenant? Même si j’avoue qu’à l’ancienne ça me plait bien
Karine
Bonjour
Pour ma part, je souhaite afficher non pas la table complète mais les informations liées à une ligne spécifique, différente pour chaque page. J’ai donc SELECT champs FROM table WHERE id=253 par exemple. Je peux indiquer les champs à séléctionner et la table sur le fichier php personnalisé, mais comment faire pour le WHERE ? Il faudrait qu’il apparaisse sur chaque page avec un id différent. Est-ce possible ?
Merci de votre aide.
admin
Bonjour Karine,
Oui c’est possible sans problème.
Il faut passer l’ID dans l’URL comme ça. Exemple :
https://www.activpart.com/les-produits/?id=12
Et au début du script PHP on récupère cette valeur:
$id=$_REQUEST[id];
Et plus bas on définit la requête comme ça:
$requete="
SELECT reference,
description,
prix_vente
FROM goods";
Et on peut alors ajouter :
if ( $id <> '' ){ $requete.=" WHERE goods.good_id = '$id'"; }
Et on éxecute la requête ainsi composée:
$produits = $wpdb->get_results($requete):
JF
Philippe Phil
Bonjour,
Je suis un retraité qui essaye de se former pour créer un site internet. J’ai fait un petit logiciel avec Access qui fonctionne très bien mais juste sur mon PC. J’ai une base de données d’environ mille articles. Je travaille avec WordPress 5.8.2 et comme thème OcéanWP (en gratuit juste pour tester) et transferer ma base dans phpMyAdmin . J’ai trouvé votre article et j’ai réussi a afficher ma base de 957 articles dans une page WordPress et mettre des bordures autour des cellules. Très content je continuais à chercher pour mettre des photos. Mais il y a eu une maj d’OcéanWP qui m’a tout effacé et malheureusement je n’avais pas fait de sauvegarde. Aujourd’hui impossible de remettre votre requête en fonction. Je n’ai que la ligne d’entête avec les intitulés des colonnes qui s’affichent.
Merci de me dire si c’est à cause de la maj ou d’autres choses.
Cordialement.
Philippe
admin
Bonjour Philippe,
Je vous conseille d’ajouter ces 2 lignes à votre script PHP, pour faire ressortir à l’écran d’éventuelles erreurs sur la requête SQL:
$wpdb->show_errors();
$wpdb->print_error();
C’est à insérer avant ou après après cette ligne dans l’exemple.
// print_r($produits);
Cordialement,
JFR
admin
Rebonjour Philippe,
Après avoir relu plus attentivement votre question, en effet c’est la mise à jour du thème qui a écrasé votre script PHP spécifique.
Deux précautions à prendre (la première vitale, la seconde conseillée):
1. Effectuer des sauvegardes, par exemple avec le plugin https://fr.wordpress.org/plugins/backwpup/ ou bien en copiant sur un autre PC les scripts PHP spécifiques que vous avez créés.
2. Créer un thème enfant. Ainsi lors des mises à jour du thème, vos scripts PHP spécifiques seront préservés. Un bon tutoriel (parmi d’autres) sur ce sujet : https://wpformation.com/theme-enfant-wordpress/
Philippe Phil
Rebonjour JFR,
Merci pour le conseils des 2 lignes. J’ai trouvé l’erreur. Une virgule en trop avant FROM.
Et pour le deuxième message vous avez tout à fait raison. Les sauvegardes permettent d’éviter beaucoup de soucis et voir des problèmes.
Un homme averti …etc.
Encore merci.
Philippe
admin
Content d’avoir pu vous être utile, Philippe.
Jean-François Rullier
Olivier
Mon premier PHP, grâce à vous.
Merci.
Paul Carneiro
Bonjour
J’ai lu votre blog et il m’a donné de l’espoir.
En effet, j’ai une base de donnée mysql que j’ai des données texte et images, j’aimerais pourvoir
l’interroger comme vous avez fait pour maria (goods). C’est que je comprends pas c’est comment vous avez fait pour attacher votre base maria sur WordPress? Pour la connexion vous avez codé global $wpdb et vous êtes connecté. PHPmyadm gère mes deux base côte- à-côte. Merci d’avance de votre réponse.
admin
Bonjour Paul,
En effet dans l’exemple donné, la table « goods » est dans la même base d données que WordPress. C’est ce que je conseillerai pour simplifier.
Mais j’ai ajouté un exemple de code à la fin de l’article avec le cas ou la base de données MariaDB (MySQL) contenant la table est différente de celle de WordPress.
Philippe
Bonjour,
personnellement je ne sais pas si cela vient de ma version de wordpress mais je n’ai pas le menu déroulant « modèle »….
Donc je peux pas utiliser votre méthode.
Philippe
Bonsoir,
pouvez vous me dire pourquoi je ne dispose pas du petit menu déroulant modèle quand je créai une nouvelle page ?
Cordialement,
admin
Bonjour Philippe,
Dans WordPress on peut créer soit des « Articles », soit des « Pages ». Le menu déroulant « Modèle » n’est proposé que si on créée une « Page ».