2. Datenbank / Singlesite Installation
• 11 Tabellen
• Benennung: Prefix (Bei der Installation angegeben,
default: wp_ ) + Name. Die Tabelle Posts heisst in einer
default Installation wp_posts
Mittwoch, 25. September 13
3. Datenbank / Multisite aktiviert
• 17 Tabellen, 6 Tabellen sind durch die Multisite
hinzugekommen.
Mittwoch, 25. September 13
4. Datenbank / Multisite mit 2 Sites
• 9 Tabellen pro Site, Schema: Prefix.BlogID_Name. Z.B:
wp_2_posts für Posts Tabelle der Site mit der ID 2.
Mittwoch, 25. September 13
5. Tabellen
wp_commentmeta
wp_comments
wp_links
wp_options
wp_postmeta
wp_posts
wp_terms
wp_term_relationships
wp_term_taxonomy
wp_usermeta
wp_users
Metadaten zu einem Kommentar
Die Kommentare die abgegeben wurden.
Links (z.b. Blogroll) mit Wordpress 3.5 in ein Plugin gewandert. ( http://
wordpress.org/plugins/link-manager/ )
Enthält "globale" Einstellungen. Z.B. die Daten aus Verwaltung/Einstellungen.
Metadaten zu Seiten, Beiträgen und CPTs.
Der Inhalt von Seiten, Beiträgen und CPTs.
Kategorien für Beitrage und Links und Tags für Beiträge.
Verknüpfung der Beiträge (Posts) mit Kategorien/Tags (Terms)
Taxonomie (Kategorie, Link, Tag) der Einträge in wp_terms
Metadaten von Benutzern
Benutzer des Systems
Mittwoch, 25. September 13
7. Multisite Betrieb
Im Multisite Betrieb sind folgende Tabellen Sitespezifisch und werden mit jeder
neuen Site ein weiteres mal angelegt. Das Namensschema ist
Prefix.BlogID_Name. Also z.B. wp_3_post, wp_4_posts usw.
• wp_2_commentmeta
• wp_2_comments
• wp_2_links
• wp_2_options
• wp_2_postmeta
• wp_2_posts
• wp_2_terms
• wp_2_term_relationships
• wp_2_term_taxonomy
Mittwoch, 25. September 13
8. Das WPDB Objekt
Wordpress stellt eine recht umfangreiche Datenbank Klasse zur Verfügung,
die man auch in seinen eigenen Themes / Plugins nutzen sollte (auch in
snippets in der functions.php wenn mehr als nur einmal verwendet werden
soll).
Natürlich kann man es von Hand coden, via mysql_connect/mysql_query.
ABER
- Zugangsdaten auslesen oder doppelt haben
- Prefix berücksichtigen
- Bei Multisite, BlogID berücksichtigen
- escapen, Prepared Statements - alles selbst machen
Mittwoch, 25. September 13
9. Das WPDB Objekt
Nach der Initialisierung des Wordpress Kerns steht ein globales Objekt $wpdb
zur Verfügung. Um es in eigenen Funktionen/Methoden zu nutzen muss es via
global bekannt gemacht werden.
<?php
global $wpdb;
?>
Die Klasse findet sich in /wp-includes/wp-db.php und die Dokumentation im
Codex unter http://codex.wordpress.org/Class_Reference/wpdb
Mittwoch, 25. September 13
10. Einen Wert auslesen
Mit der get_var() Methode kann man einen einzelnen Wert auslesen.
<?php
global $wpdb;
$variable = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->users" );
?>
Gibt die Anzahl der Benutzer zurück, der korrekte Tabellenname wird ebenfalls
von dem WPDB Objekt geholt.
Mittwoch, 25. September 13
11. Eine Zeile auslesen
Mit der get_row() Methode kann man einen einzelnen Wert auslesen.
<?php
global $wpdb;
$variable = $wpdb->get_row( "SELECT * FROM $wpdb->posts WHERE
ID=1" );
echo $variable->post_title; // Gibt den Titel aus.
?>
Gibt ein Objekt zurück mit den Elementen als Properties. Optional kann es
auch als numerisches oder assoziazives Array zurückgegeben werden.
Mittwoch, 25. September 13
12. Ergebnis auslesen
Mit der get_results() Methode kann man das Ergebnis der Query auslesen.
<?php
global $wpdb;
$variable = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE
ID=1" );
echo $variable->post_title; // Gibt den Titel aus.
?>
Gibt ein Objekt zurück mit den Elementen als Properties. Optional kann es
auch als numerisches oder assoziazives Array zurückgegeben werden.
Mittwoch, 25. September 13
13. Reinschreiben
Mit der insert() Methode kann man Daten in die Datenbank schreibe.
<?php
global $wpdb;
$wpdb->insert( $wpdb->usermeta, array("user_id" => 1, "meta_key" =>
"coolness_factor", "meta_value" => 10), array("%d", %s", "%d"));
?>
Mittwoch, 25. September 13
14. Überschreiben
Mit der update() Methode kann man Daten in der Datenbank ersetzen.
$wpdb->update( $table, $data, $where, $format = null, $where_format = null );
<?php
global $wpdb;
$wpdb->update( $wpdb->posts, array("post_title" => "Neuer Beitragstitel"),
array("ID" => 5), array("%s"), array("%d") );
?>
Mit der replace Methode werden Daten ersetzt oder (wenn nicht vorhanden)
eingefügt. Die update Methode hingegen liefert einen Fehler wenn der
Datensatz nicht vorhanden ist.
Mittwoch, 25. September 13
15. Löschen
Mit der delete() Methode kann man Daten in der Datenbank löschen.
$wpdb->delete( $table, $where, $where_format = null );
<?php
global $wpdb;
$wpdb->delete( $wpdb->posts, array( 'ID' => 1 ), array( '%d' ) );
?>
Mittwoch, 25. September 13
16. Abfragen schützen
Mit der prepare() Methode kann man seine Abfrage mit Prepared Statements
erstellen und so die Sicherheit vor SQL Injections erhöhen.
<?php
global $wpdb;
$wpdb->query(
$wpdb->prepare ( "INSERT INTO $wpdb->postmeta ( post_id, meta_key,
meta_value ) VALUES ( %d, %s, %s ) ", 5, $meta_key, $meta_value)
);
?>
Mittwoch, 25. September 13
17. Aber ich hab doch WP_Query
Ich habe doch WP_Query, wozu soll ich mich mit WPDB beschäftigen?
Die WP_Query Klasse wird sehr häufig in Themes verwendet um den "Loop" zu
erzeugen, also die Liste der n Beiträge auf einer Seite. WP_Query ist eine
weitere, oberhalb von WPDB liegende Abstraktion, welche auf der Posts
Tabelle agiert und (unter Berücksichtigung von Tags und Kategorien) Inhalte
der Posts Tabelle zurückliefert (also Beitröge, Seiten und Custom Post Types),
aber damit hat man keinen Zugriff auf die restlichen Tabellen.
Mittwoch, 25. September 13
18. Links
WPDB Class Reference
http://codex.wordpress.org/Class_Reference/wpdb
Data Validation in Wordpress
http://codex.wordpress.org/Data_Validation
Database Description Wordpress
http://codex.wordpress.org/Database_Description
SQL Injection
http://de.wikipedia.org/wiki/SQL-Injection
Prepared Statement
http://de.wikipedia.org/wiki/Prepared_Statement
WP_Query Codex
http://codex.wordpress.org/Class_Reference/WP_Query
Mittwoch, 25. September 13