Wordpress - Beiträge in Datenbank
Autor
Flitze
Klicks 27335
Keywords:
Worpress, Beiträge auslesen, Wordpress Datenbank, Wordpress Beiträge außerhalb des Blogs anzeigen
Klicks 27335
Rating für Wordpress - Beiträge in Datenbank
4.8 von 10
Bewertungen13
Stand
03.08.2010
4.8 von 10
Bewertungen13
Keywords:
Worpress, Beiträge auslesen, Wordpress Datenbank, Wordpress Beiträge außerhalb des Blogs anzeigen
Breadcrumb:
Tipps » Wordpress - Beiträge in Datenbank
Einleitung
[ADSENSE_LINE]Wordpress - die genutzte Version ist Wordpress 2.6 - ist ein geniales Blogsystem (eingesetzt zum Beispiel auf Servervoice der Technik Blog), hat aber leider den Nachteil, dass alle Funktionen nur innerhalb des Blogs genutzt werden können. Da ich aber auf meiner Main-Page, die nicht über Wordpress läuft, auch die neusten Beiträge anzeigen lassen wollte, musste ich mir selbst eine Funktion zur Datenbankabfrage zusammenbasteln.
An sich ist das nicht schwer, weil ich schlichtweg einen MySQL-Query ausführen muss, der die Daten aus der entsprechenden Datenbank ausließt. Tatsächlich problematisch war es eigentlich nur deshalb, weil ich nirgends genaue Erläuterungen zur Datenbank gefunden hab - speziell zu den Datenbankbeziehungen untereinander. Lediglich eine kurze Beschreibung der Datenbanktabellen sowie deren Spalten findet man unter http://codex.wordpress.org/Database_Description . Ihr solltet den Link in einem neuen Fenster öffnen, das macht die Codebeispiele weiter unten leichter nachvollziehbar, weil ihr die Namen der Spalten vorliegen habt
Ich wollte außerdem nicht nur die neusten Beiträge von Wordpress anzeigen, sondern diese auch nach Kategorien sortiert ausgeben lassen. Sprich, wenn ich einem Beitrag die Kategorie "X" zuweise, dann soll dieser Beitrag auch nur auf Unterseite "X" der Main-Page ausgegeben werden. Irgendwie ungünstig umschrieben Aber sollte klar sein, wenn man die Funktion betrachtet
Also, ich habe demzufolge zwei Lösungen entwickelt:
Alle Beiträge/Posts auslesen
Die Datenbank, in der die Beiträge gespeichert werden, nenn sich wp_posts. Die Spalten, die man benötigt sind post_name (URL), post_date_gmt (Datum MEZ), post_title (Titel des Beitrags), post_content (Inhalt) oder post_excerpt (Zusammenfassung).
Nun kann man den folgenden Querie benutzen um z.b. die letzten 5 Beiträge auszulesen:
PHP:
<?php
$sql = "SELECT
post_name,
DATE_FORMAT(post_date_gmt, '%d. %m %Y') as post_date_gmt,
post_title,
post_content,
post_excerpt
FROM
wp_posts
WHERE
post_type = 'post' AND
post_status = 'publish'
ORDER BY
post_date_gmt DESC
LIMIT
5
";
?>
Was SELECT-iert wird ist klar, habe ich ja oben schon erwähnt, ebenso wie die Datenbanktabelle wp_posts. Das Datum wird noch nach deutschem Standard mittels DATE_FORMAT formatiert. Die WHERE-Bedingung muss deshalb eingefügt werden, weil Wordpress auch statische Seiten sowie Sicherheitskopien und unveröffentlichte Artikel in dieser Datenbanktabelle speichert. Der post_type eines normalen Beitrags ist 'post'. Der post_status ist 'publish'.
Sortiert werden soll nach Datem absteigend - schließlich sind die 5 neusten Beiträge gefragt - und es sollen 5 an der Zahl sein.
Das Ganze ließe sich dann z.B. folgendermaßen ausgeben
PHP:
<?php
$result = mysql_query($sql);
$blogpath = "/blog/";
$excerpt = "";
if(mysql_num_rows($result)){
echo "<h2>Neues aus dem <a href=\"".$blogpath."\">Blog</a></h2>";
echo "<ul>\n";
while($row = mysql_fetch_assoc($result)){
// Falls Auszuge vorhanden wird dieser genommen,
// ansonsten eine Kurzversion des Inhalts
if(trim($row['post_excerpt']) == "")
$excerpt = substr(strip_tags($row['post_content']),0,160)."...";
else
$excerpt = strip_tags($row['post_excerpt']);
echo "<li>".
"<a href=\"".$blogpath.$row['post_name']."/\" ".
"title=\"".$excerpt."\">".
$row['post_title'].
"</a> ".
$row['post_date_gmt'].
"</li>";
}
echo "</ul>";
}
?>
Das war's auch schon
Der Teil mit dem Auszug ($excerpt) ist kommentiert, der Rest dürfte klar sein.
Beispielsweise kann man das auf der Hauptseite von http://www.geld-im-internet.de/ betrachten.
Beiträge/Posts nach Kategorien sortiert auslesen
wie bereits erwähnt liegt die Schwierigkeit bei bei diesem Vorhaben darin, dass die Beziehungen der Datenbanktabellen von Wordpress etwas verworren sind.
Logisch wären, aus meiner Sicht, 3 Tabellen:
- Posts (enthält die Daten der Beiträge)
- Categories (enthält Daten der Kategorien)
- Categories_of_Posts (ordnet den Posts die verschiedenen Kategorien zu)
Categories_of_Posts wäre deshalb vorhanden, weil ein Beitrag in mehreren Kategorien gespeichert sein kann.
Leider sieht Worpress das etwas anders und stellt folgende Datenbanktabellen zur Verfügung:
- wp_posts
- wp_terms
- wp_term_taxonomy
- wp_term_relationships
Es hat mich doch einiges an Zeit gekostet, herauszufinden, welche Datenbanktabelle denn nun welche Werte enthält und inwieweit mit einer anderen Tabelle verknüpft ist. Die Ergebnisse dieser Nachforschungen fasse ich kurz zusammen:
wp_posts
Enthält die Posts (siehe oben). Jeder Post wird durch 'ID' eindeutig identifiziert.
wp_terms
Enthält Link-Kategorien, Kategorien und Tags, jedoch wird nur Name und Slug (Abkürzung zum Aufrufen durch eine URL) gespeichert. Es ist nicht ersichtlich, ober es sich um einen Tag oder eine Kategorie handelt. Jede Zeile wird durch 'term_id' eindeutig identifiziert.
wp_term_taxonomy
Enthält weiterführende Informationen zu wp_terms und ist durch 'term_id' mit wp_terms verknüpft. Diese beiden Tabellen zusammengenommen geben Auskunft darüber, ob es sich um Kategorie oder Tag handelt und ob die Kategorie verschachtelt ist.
wp_term_relationships
Ordnet jedem Beitrag die enstprechenden Terms (Tags, Kategorien) zu und ist über 'object_id' mit wp_posts und über 'term_taxonomy_id' mit wp_term_taxonomy verknüpft. Verwirrend dabei war für mich vor allem die Bezeichnung 'object_id'. OK, vielleicht muss man es nicht unbedingt 'ID' nennen, aber zumindest 'post_id' wäre schon hilfreich gewesen um zu wissen, welche Tabellen hier verknüpft werden -_-
So, diese Tabellen müssen nun alle so verknüpft werden, dass nur die Beiträge einer bestimmten Kategorie angezeigt werden. Dieser Query sieht so aus:
PHP:
<?php
$category = "Name der Kategorie"
$sql = "SELECT
p.post_name,
DATE_FORMAT(p.post_date_gmt, '%d. %m %Y') as post_date_gmt,
p.post_title,
p.post_content,
p.post_excerpt
FROM
wp_posts p,
wp_terms t,
wp_term_taxonomy tt,
wp_term_relationships tr
WHERE
t.name = '".$category."' AND
tt.taxonomy = 'category' AND
t.term_id = tt.term_id AND
tt.term_taxonomy_id = tr.term_taxonomy_id AND
tr.object_id = p.ID AND
post_type = 'post' AND
post_status = 'publish'
ORDER BY
p.post_date_gmt DESC
LIMIT
5
";
?>
Dazu erkläre ich besser etwas
Zunächst einmal vergebe ich Aliases für alle Datenbanktabellen im FROM-Teil:
PHP:
<?php
"...
FROM
wp_posts p,
wp_terms t,
wp_term_taxonomy tt,
wp_term_relationships tr
";
?>
Danach folgt der WHERE-Teil, den ich in den Kommentaren des folgenden Codestücks erläutere:
PHP:
<?php
"...
WHERE
// Suche nach dem Namen der Kategorie
t.name = '".$category."' AND
// Stelle sicher, dass sich auch um eine Kategorie und
// nicht etwa um einen gleichnamige Tag handelt
tt.taxonomy = 'category' AND
// Verknüpfe diese beiden Tabellen über die term_id
t.term_id = tt.term_id AND
// Nimm wp_term_taxonomy und
// wp_term_relationships in die Verknüpfung mit auf...
tt.term_taxonomy_id = tr.term_taxonomy_id AND
// weil nur durch die taxonomy_id eine Verknüpfung
// mit dem jeweiligen Beitrag hergestellt werden kann
tr.object_id = p.ID AND
// das was jetzt folgt ist uns bekannt ;)
post_type = 'post' AND
post_status = 'publish'
";
?>
Denke, damit ist alles gesagt
Die Anzeige kann von oben übernommen werden, da sich die benutzten Variablen nicht ändern, sondern lediglich eine spezifischere Auswahl (kategorieabhängig) der Beiträge getroffen wird.
Beispielsweise kann man das auf der Unterseite 'Links mieten' betrachten.
Bewerten