De standaard database tabellen in WordPress voldoen meestal voor de meest complexe handelingen. Met behulp van custom post types en taxonomieën kunnen we bijna alles realiseren zonder de nood aan custom database tabellen. Toch kunnen custom database tabellen handig zijn wanneer we meer controle willen over onze data. Wij bepalen zelf de gegevens structuur. Onze data is mooi gescheiden van het platform, waardoor migraties vlotter verlopen. En het opvragen van data zal veel performanter verlopen.
Hoe beheer je custom database tabellen in WordPress
1. Hoe beheer je
“custom” database tabellen
in WordPress?
Wim Van Cauwenbergh
WordPress Meetup Antwerpen
15 mei 2017
2. Out of the box
De standaard database tabellen in WordPress voldoen meestal voor
de meest complexe handelingen. Met behulp van custom post types
en taxonomieën kunnen we bijna alles realiseren zonder de nood aan
custom database tabellen. Toch kunnen custom database tabellen handig
zijn wanneer we meer controle willen over onze data. Wij bepalen zelf
de gegevens structuur. Onze data is mooi gescheiden van het platform,
waardoor migraties vlotter verlopen. En het opvragen van data zal
veel performanter verlopen.
3. Wie heeft ervaring met
“custom” database tabellen?
Steek je hand omhoog ...
4. Communiceren met de
database
WordPress voorziet tal van
functionaliteiten om met de
database te communiceren.
Meestal voldoet de WP_Query
class en de daarbij horende
functies zoals:
• wp_insert_post(),
• update_post_meta(),
• get_posts()
6. Er zijn twee zaken waarmee men moet
rekening houden:
• de structuur
• de hoeveelheid data
7. Kortom, “custom” database tabellen
zijn enkel aan te raden wanneer de
data structuur significant verschilt
met die van het standaard Post Model
en je er veel van hebt.
9. We nemen de proef
op de som
Een praktisch voorbeeld ...
10. Hoe zij jij het doen?
Stel we ontwikkelen een plugin
dat wekelijks analytics verzameld.
Hoe zouden we deze data wegschrijven?
11. Google Analytics voor WordPress
Stel we ontwikkelen een plugin dat wekelijks analytics verzameld (een 8-tal
velden). We kunnen dit op drie verschillende manieren benaderen:
#1. Een Array
We kunnen heel eenvoudig onze data als “single option” in de “Options-tabel”
bewaren (1 rij per week).
#2. Post en Postmeta
Of we creeëren een “analytics” custom post type en bewaren onze data als
individuele post meta (1 + 8 rijen per week).
#3. Een custom database tabel
Ofwel schrijven we onze data weg naar een custom database tabel. Elke rij
bevat dan onze weekelijkse data (8 velden).
12. Wie zou er voor een Array gaan?
Steek je hand omhoog ...
13. Google Analytics voor WordPress
In ons voorbeeld zal de dataset miniem zijn, aangezien we slechts wekelijks
data verzamelen. Dus kunnen we beter gebruik maken van de post- en
postmeta tabellen.
Waarom geen Array?
Omdat dit op lange termijn geen goed idee is. Na vijf jaar zal onze Array
uitgroeien tot 260 items. Naar mate de jaren zullen we dus inboeten op
performantie bij het manipuleren van de data.
15. Google Analytics voor WordPress
In plaats van wekelijks, gaan we elke minuut data wegschrijven naar de
database. Een jaar telt méér dan 500.000 minuten.
#1. Een Array?
Het wordt dan snel duidelijk een Array geen optie meer is.
#2. Post en Postmeta?
Idem voor post en postmeta. De WordPress database is wel geoptimaliseerd,
maar bij deze aantallen kan performatie parten spelen. Elke individuele veld is
een rij in de postmeta tabel (dus 8 in totaal) en dit maal +500.000.
#3. Een custom database tabel
Dit is zo’n situatie waar een custom database tabel de betere keuze is.
16. Wat zijn de voordelen?
• Het database schema is volledig afgestemd op de data structuur.
• We moeten géén twee tabellen onderhouden (post en postmeta).
• Controle over (veld) types en limieten.
• Data is mooi gescheiden van het platform.
• Exporteren is veel makkelijker.
• De applicatie is veel schaalbaarder.
• Minder complexe queries.
• Beter overzicht van de data.
17. Wat zijn de nadelen?
• De WordPress database wordt “vervuild” met extra tabellen.
• Moeilijker om data te manipuleren.
• Er moet een eigen UI voorzien worden.
• Meer kans op SQL errors.
• Geen (of beperkt) gebruik van de WordPress functionaliteiten.
• Extra database onderhoud.
• Extra werk tijdens plugin activation, deactivation en uninstallation.
18. Een database tabel aanmaken
Een database tabel wordt het best aangemaakt tijdens de activation hook.
20. register_activation_hook( __FILE__, ‘my_plugin_create_db’ );
function my_plugin_create_db() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . ‘my_analysis’;
$sql = “CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT ‘0000-00-00 00:00:00’ NOT NULL,
views smallint(5) NOT NULL,
clicks smallint(5) NOT NULL,
UNIQUE KEY id (id)
) $charset_collate;”;
require_once( ABSPATH . ‘wp-admin/includes/upgrade.php’ );
dbDelta( $sql );
}
21. Het opmaken van SQL queries
Waarop moet je letten?
Er zijn enkele regels die we volgens de dbDelta() function moeten volgen:
1. Elk veld moet op een afzonderlijke lijn in uw SQL statement.
2. Twee spaties tussen de woorden PRIMARY KEY en de definitie ervan.
3. Gebruik KEY in plaats van INDEX en gebruik minstens 1 KEY.
4. Geen aanhalingstekens of backticks rond (veld) namen.
5. Veld types steeds in kleine letters (lowercase).
6. SQL keywords ( bijvoorbeeld CREATE TABLE ) steeds in hoofdletters.
22. Database tabellen updaten
Extra kolommen toevoegen
In de loop der tijd kan de nood aan extra kolommen ontstaan in onze custom
database tabel. Maar laat nu net daar de kracht van dbDelta() zitten. De
dbDelta() function neemt alle wijzigingen voor zijn rekening. Het enige wat wij
moeten doen, is het voorzien van een degelijk database schema.
Een kleine tip
Het is best practice om een versie nummer bij te houden van onze plugin.
Zodat we makkelijk kunnen bepalen of er database wijzigingen dienen
uitgevoerd te worden.
$version = get_option( ‘my_plugin_version’, ‘1.0’ );
23. function my_plugin_create_db() {
global $wpdb;
$version = get_option(‘my_plugin_version’, ‘1.0’);
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . ‘my_analysis’;
$sql = “CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT ‘0000-00-00 00:00:00’ NOT NULL,
views smallint(5) NOT NULL,
clicks smallint(5) NOT NULL,
UNIQUE KEY id (id)
) $charset_collate;”;
require_once( ABSPATH . ‘wp-admin/includes/upgrade.php’ );
dbDelta( $sql );
// ... (vervolg op volgende pagina)
24. // ...
if ( version_compare( $version, ‘2.0’ ) > 0 ) {
$sql = “CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
time datetime DEFAULT ‘0000-00-00 00:00:00’ NOT NULL,
views smallint(5) NOT NULL,
clicks smallint(5) NOT NULL,
blog_id smallint(5) NOT NULL,
UNIQUE KEY id (id)
) $charset_collate;”;
dbDelta( $sql );
update_option( ‘my_plugin_version’, ‘2.0’ );
}
}
25. Conclusie
“Custom” Database Tabellen
In de meeste gevallen is het gebruik van “custom” database tabellen overbodig.
Maar dankzij de dbDelta functie kunnen we makkelijk modulaire en flexibele
tabellen creëren.
Ben je van plan om met een “custom” database tabel te werken, denk dan aan
deze manier van aanpak.