WordPress vergibt für jeden Beitrag, Seite und Kommentar eine eindeutige ID in der Datenbank. Diese macht es einfach und schnell möglich, einen expliziten Inhalt aus der Datenbank zu laden.
Wozu? – Dafür gibt es eine ganze Reihe Anwendungsmöglichkeiten.
In einem konkreten Projekt wird Inhalt in den Header und Footer geladen, Text, der den Leser des Blog informiert.
Ein konkretes Beispiel ist das Blog von Shirtinator, dort wird im Header- und Footer-Bereich Inhalt aus dem Backend, aus statischen Seiten, gezogen.
In der Regel werden solche Texte direkt im Markup des Theme hinterlassen, was die Pflege für den Laien erschwert. Aber auch für solche Zwecke nutzt man ja ein CMS, warum also nicht einen Artikel aus der Datenbank dazu nutzen. Insbesondere eignet sich dazu eine statische Seite, die ist schnell wieder auffindbar und nicht im täglichen Artikelzoom eines Weblogs.
Laden eines beliebigen Beitrags
Hat man spezielle Anforderungen und kann mit dem Loop arbeiten, dann empfiehlt sich die erste Lösung im folgenden Code. Eine genaue Doku zu query_posts
findet sich im Codex, denn dieser Template Tag kann wesentlich mehr und macht die Anwendung für besondere CMS-Gestaltung möglich.
<?php
$post_id = 3;
query_posts('p=' . $post_id); // post-ID
while (have_posts()) : the_post(); // starte the_loop
_e('<h3>') . the_title() . _e('</h3>') . "\n";
the_content();
endwhile;
?>
Der zweite Codeschnipsel greift direkt in die Datenbank ein und holt den Beitrag, ohne Formatierung durch die WordPress-Filter und kann so beliebig via Template ausgegeben werden. Dabei spielt es keine Rolle, ob es sich um einen Beitrag oder eine statische Seite handelt, denn WordPress vergibt die ID ohne Unterscheidung. Für den Unterschied Seite/ Beitrag steht ein weiteres Tabellenfeld bereit, was aber in dem Fall nicht nötig ist und so genügen die beiden Felder post_title, post_content
für Titel und Inhalt.
<?php
$results = $wpdb->get_results("
SELECT post_title, post_content
FROM $wpdb->posts
WHERE ID = '9'
");
foreach ($results as $pagepost) {
echo '<h3>' . $pagepost->post_title . '</h3>' . "\n";
echo '<p>' . $pagepost->post_content . '</p>';
}
?>
Laden einer beliebigen Seite im Loop
Im Grunde muss man nur die Adresse ändern. Während man mit p=
einen Beitrag anspricht, bekommt man mit ?page_id=
eine statische Seite.
<?php
query_posts('?page_id=3'); // post-ID
while (have_posts()) : the_post(); // starte the_loop
_e('<h3>') . the_title() . _e('</h3>') . "\n";
the_content();
endwhile;
?>
Laden, außer einer bestimmten Kategorie
Parameter des Tag ist cat=-
. Will man mehrere Kategorien ausschließen, dann werden die IDs der jeweiligen Kategorie getrennt cat=-1,-3,-9
.
<?php
query_posts('cat=-123); // category-ID
while (have_posts()) : the_post(); // starte the_loop
_e('<h3>') . the_title() . _e('</h3>') . "\n";
the_content();
endwhile;
?>
Laden, einer bestimmten Kategorie
Auch hier kann man explizit Kategorien nutzen, einfach die entsprechenden IDs mit Kommata trennen cat=1,3,9
. Entscheidend, ohne Minus -
vor der Kategorie-ID.
<?php
query_posts('cat=123); // category-ID
while (have_posts()) : the_post(); // starte the_loop
_e('<h3>') . the_title() . _e('</h3>') . "\n";
the_content();
endwhile;
?>
more
-Funktionalität erhalten
Soll die more
-Funktionalität (<--more-->
) von WordPress erhalten bleiben, dann muss die Variable dafür gesetzt werden.
<?php
query_posts('cat=123); // category-ID
global $more;
$more = 0;
while (have_posts()) : the_post(); // starte the_loop
_e('<h3>') . the_title() . _e('</h3>') . "\n";
the_content();
endwhile;
?>
Jap sauber. Hab so meine Firmenseite mit WordPress realisiert. Ist schon cool was man damit alles anstellen kann und trotzdem via Backend auf einfache Art und Weise weiterpflegen kann 🙂
manuel merz, klase gemachte firmen seite 😉
für meinen geschmack die referenzen etwas zu schnell im wechseln macht die seite unruhig
Habe bei meinem Relaunch auf ein Theme im Magazin Style auch viel mit query_posts gearbeitet, vor allem die Anzeige der Beiträge einer oder mehrere Kategorien ist damit einfach zu lösen.
Hätte dabei gleich eine Frage zu einem Datenbank-Feld in „wp_posts“, und zwar zum Feld „guid“. Dort wird scheinbar direkt beim Erstellen eines Beitrags die aktuelle URL eingetragen und zwar mit der zu diesem Zeitpunkt eingetragen Blog-URL und den Permalink-Einstellungen. Wenn man nun Veränderungen an der Permalink-Struktur vornimmt, dann stimmt zwar die Anzeige im Blog, aber das Feld „guid“ hat weiterhin die alten Inhalte.
Aufgefallen ist mir das Feld, nachdem ich das Plugin „crawlink“ ausprobiert habe. Dieses greift auf eben dieses Feld „guid“ zu. Weiß jemand wo dieses Feld noch Verwendung findet bzw. für was dieses Feld da ist?
Großartig, genau danach habe ich gesucht. Vielen Dank.
hallo, ich bin auf der suche nach einen code, welcher es ermöglicht auf einer statischen WP-seite, den inhalt einer fertig auf meinem server liegenden *.html datei zu laden.
gibts dafür eine ähnliche möglichkeit?
das ist desshalb nötig, weil diese *.html datei tgl mit einem desktop-programm neu generiert wird und nach dem upload in eine stat. seite geladen werden soll.
vielleicht fällt ihnen ja was ein, was mir hilft.
herzlichen dank
hans
@Hans: prinzipiell kannst du jeden Inhalt mit PHP laden, allerdings wird das nicht sauber sein.
Hallo Frank,
Vielen dank für deine schnelle Antwort, ich habs ausprobiert und wie du schon gesagt hast es entstehen Fehler. Was hat es mit iFrame auf sich, wie ist die Herangehensweise?
Kannst du auch da helfen?
@Hans: siehe Doku, da findest du alles relevanten Infos
hallo nochmal.
1000 Dank Frank 😉
Das klappt gut. Einziges pRoblem welches ich noch habe ist, das obwohl charset UTF-8 eingestellt ist, sowohl in der *.html datei als auch im verlinkten iFrame code.
Hast du noch ne Idee?
Hans
@Hans: immer schwierig ohne Links, erraten kann ich nur, dass die html ein anderen Zeichensatz nutzt.