SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
Hoe beheer je
“custom” database tabellen
in ­WordPress?
Wim Van Cauwenbergh
WordPress Meetup Antwerpen
15 mei 2017
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.
Wie heeft ervaring met
“custom” database tabellen?
Steek je hand omhoog ...
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()
Wanneer maken we
onze handen vuil?
... en kiezen we voor
“custom” database tabellen.
Er zijn twee zaken waarmee men moet
­rekening houden:
•	 de structuur
•	 de hoeveelheid data
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.
... elk project is anders!
We nemen de proef
op de som
Een praktisch voorbeeld ...
Hoe zij jij het doen?
Stel we ontwikkelen een plugin
dat wekelijks analytics verzameld.
Hoe zouden we deze data wegschrijven?
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).
Wie zou er voor een Array gaan?
Steek je hand omhoog ...
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.
Laten we 1 parameter
aanpassen.
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.
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.
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.
Een database tabel aanmaken
Een database tabel wordt het best aangemaakt tijdens de activation hook.
register_activation_hook( __FILE__, ‘my_plugin_create_db’ );
function my_plugin_create_db() {
	 // Create Database Table Here
}
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 );
}
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.
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’ );
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)
// ...
	
	 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’ );
	}
}
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.
Vragen? Shoot!

wim@comodocreative.com
Dank u!

Más contenido relacionado

Similar a Hoe beheer je custom database tabellen in WordPress

Data Virtualisatie... kan het datawarehouse nu weg?
Data Virtualisatie... kan het datawarehouse nu weg?Data Virtualisatie... kan het datawarehouse nu weg?
Data Virtualisatie... kan het datawarehouse nu weg?Dave den Hartog
 
Metadata oplossingen
Metadata oplossingenMetadata oplossingen
Metadata oplossingengrus001
 
Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010Remkus de Vries
 
Lucius Drupal Development Cursus
Lucius Drupal Development CursusLucius Drupal Development Cursus
Lucius Drupal Development CursusLuciuswebsystems
 
Presentatie Azure bij SLBdiensten
Presentatie Azure bij SLBdiensten Presentatie Azure bij SLBdiensten
Presentatie Azure bij SLBdiensten SLBdiensten
 
Drupal is Traag: handvatten voor een snelle site.
Drupal is Traag: handvatten voor een snelle site.Drupal is Traag: handvatten voor een snelle site.
Drupal is Traag: handvatten voor een snelle site.LimoenGroen
 
Final Opdracht Sql Server2008
Final Opdracht Sql Server2008Final Opdracht Sql Server2008
Final Opdracht Sql Server2008guest5ad398a
 
20130308 GB les 6
20130308 GB les 620130308 GB les 6
20130308 GB les 6mleeuwen
 
Online usability - les 3 introductie WordPress - thema's, widgets en plugins
Online usability - les 3 introductie WordPress - thema's, widgets en pluginsOnline usability - les 3 introductie WordPress - thema's, widgets en plugins
Online usability - les 3 introductie WordPress - thema's, widgets en pluginsPeter Luit
 
Magento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beherenMagento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beherenMichel Doens
 
Presentatie drupal sass
Presentatie drupal sassPresentatie drupal sass
Presentatie drupal sassKees
 
DSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS Performance
DSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS PerformanceDSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS Performance
DSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS PerformanceDeltares
 
Large assy's in Autodesk Inventor
Large assy's in Autodesk InventorLarge assy's in Autodesk Inventor
Large assy's in Autodesk Inventorinventorwizard
 
Gegevensbanken En Gebruikers
Gegevensbanken En GebruikersGegevensbanken En Gebruikers
Gegevensbanken En GebruikersErik Duval
 

Similar a Hoe beheer je custom database tabellen in WordPress (20)

Data Virtualisatie... kan het datawarehouse nu weg?
Data Virtualisatie... kan het datawarehouse nu weg?Data Virtualisatie... kan het datawarehouse nu weg?
Data Virtualisatie... kan het datawarehouse nu weg?
 
embedded SQL en JDBC
embedded SQL en JDBCembedded SQL en JDBC
embedded SQL en JDBC
 
[Idm b] tools databases 3
[Idm b] tools databases 3[Idm b] tools databases 3
[Idm b] tools databases 3
 
Metadata oplossingen
Metadata oplossingenMetadata oplossingen
Metadata oplossingen
 
Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010Presentatie WordPress Theme Frameworks WordCamp NL 2010
Presentatie WordPress Theme Frameworks WordCamp NL 2010
 
Lucius Drupal Development Cursus
Lucius Drupal Development CursusLucius Drupal Development Cursus
Lucius Drupal Development Cursus
 
Presentatie Azure bij SLBdiensten
Presentatie Azure bij SLBdiensten Presentatie Azure bij SLBdiensten
Presentatie Azure bij SLBdiensten
 
Drupal is Traag: handvatten voor een snelle site.
Drupal is Traag: handvatten voor een snelle site.Drupal is Traag: handvatten voor een snelle site.
Drupal is Traag: handvatten voor een snelle site.
 
WordPress 3.5
WordPress 3.5WordPress 3.5
WordPress 3.5
 
Drupal 7 intro
Drupal 7 introDrupal 7 intro
Drupal 7 intro
 
Final Opdracht Sql Server2008
Final Opdracht Sql Server2008Final Opdracht Sql Server2008
Final Opdracht Sql Server2008
 
20130308 GB les 6
20130308 GB les 620130308 GB les 6
20130308 GB les 6
 
Ldap
LdapLdap
Ldap
 
Online usability - les 3 introductie WordPress - thema's, widgets en plugins
Online usability - les 3 introductie WordPress - thema's, widgets en pluginsOnline usability - les 3 introductie WordPress - thema's, widgets en plugins
Online usability - les 3 introductie WordPress - thema's, widgets en plugins
 
Magento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beherenMagento cursus: theme opzetten & beheren
Magento cursus: theme opzetten & beheren
 
Presentatie drupal sass
Presentatie drupal sassPresentatie drupal sass
Presentatie drupal sass
 
DSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS Performance
DSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS PerformanceDSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS Performance
DSD-NL 2015, Delft-FEWS Gebruikersdag, 8 FEWS Performance
 
H5 Databaseontwerp
H5 DatabaseontwerpH5 Databaseontwerp
H5 Databaseontwerp
 
Large assy's in Autodesk Inventor
Large assy's in Autodesk InventorLarge assy's in Autodesk Inventor
Large assy's in Autodesk Inventor
 
Gegevensbanken En Gebruikers
Gegevensbanken En GebruikersGegevensbanken En Gebruikers
Gegevensbanken En Gebruikers
 

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()
  • 5. Wanneer maken we onze handen vuil? ... en kiezen we voor “custom” database tabellen.
  • 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.
  • 8. ... elk project is anders!
  • 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.
  • 14. Laten we 1 parameter aanpassen.
  • 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.
  • 19. register_activation_hook( __FILE__, ‘my_plugin_create_db’ ); function my_plugin_create_db() { // Create Database Table Here }
  • 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.