PHP Tutorials, PHP lernen, PHP Forum, PHP Community and more ... MyWebsolution.de!

Sidebar

Home News Tutorials Workshops Tipps Artikel Gästebuch Sitemap Pascal Landau

Suche

Members

Forum Login Registrierung

Statistik

Statistikbereich
Jetzt2
Heute76
Gestern495
Gesamt2387268

Wordpress - Beiträge in Datenbank

Autor Flitze
Klicks 27337
Rating für Wordpress - Beiträge in Datenbank
  4.8 von 10
Bewertungen13
Stand 03.08.2010
Keywords:
Worpress, Beiträge auslesen, Wordpress Datenbank, Wordpress Beiträge außerhalb des Blogs anzeigen

Amazon: PHP 5.3 und MySQL 5.1
Breadcrumb:
Tipps » Wordpress - Beiträge in Datenbank
Seite : 1 Bewerten
Article Wizard - deutscher Article Spinner

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 :P
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 :D

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

»» Zurück zum Menu

Suchmaschinenoptimierung

Suchmaschinenoptimierung (SEO - Search Engine Optimization)

Ranking

Tutorials (13)

8.6
8.4
8

Workshops (3)

8.8
8.7
7.6

Tipps (12)

7.2
6.7
6.5

Artikel (32)

8.4
8
7.2

RSS Feeds

Full Feed Tutorials Workshops Tipps Artikel

Twitter

Follow me on Twitter

Partner & Links


Valid HTML 4.01 Transitional
Valid CSS
nach oben

Diese Seiten unterstützen MyWebsolution:
 
© MyWebsolution.de
2006-2024