WordPress: Termine ohne Plugins

6. Mai 2011 | Ca. 7 Minuten Lesedauer

Heute gibt es aus aktuellem Anlass wieder etwas zu meiner Lieblings-„Blogsoftware“ WordPress. Für das Theme das ich momentan entwickle, und zu dem ich bald mehr schreiben werde, wollte ich auch gerne eine Terminanzeige haben. Nun habe ich dies in einem anderen Blog über ein Plugin gelöst. Das geht natürlich, bringt allerdings die Abhängigkeit vom Plugin […]

Heute gibt es aus aktuellem Anlass wieder etwas zu meiner Lieblings-„Blogsoftware“ WordPress.

Für das Theme das ich momentan entwickle, und zu dem ich bald mehr schreiben werde, wollte ich auch gerne eine Terminanzeige haben.

Nun habe ich dies in einem anderen Blog über ein Plugin gelöst. Das geht natürlich, bringt allerdings die Abhängigkeit vom Plugin mit sich.

Da ich mein Theme eventuell zum Verkauf anbieten möchte und die Zielgruppe nicht immer zwangsweise besonders technikaffin ist, will ich die Einstiegshürden natürlich gering halten.

Mit dieser Randbedingung im Hinterkopf wollte ich also etwas möglichst einfach zu bedienendes haben, dass seinen Zweck erfüllt.

Und ich hab was gefunden, bzw. „erschaffen“. Mehr dazu nach dem Sprung.

Meine Lösung für „Termine ohne Plugins“ sieht so aus, dass Termine auch nur ganz normale Einträge im Blog sind.

Die einzige Besonderheit ist, dass sie einer spezifischen Kategorie zugeordnet sind und sich damit von allen anderen Einträgen unterscheiden.

Weiterhin wollte ich, dass Einträge, welche der Termine-Kategorie angehören nicht zwischen den normalen Einträgen auftauchen. Das ist dann aber auch eine Kleinigkeit.

Zuerst braucht man die ID der Kategorie (findet man im Backend, Abschnitt „Artikel“ und dann „Kategorien“) die man natürlich nennen kann, wie man will. Ich habe das Ganze dann in meiner header.php (da gäbe es natürlich auch andere Orte für) als Konstante definiert:

define('TERMINE_ID', 289);

Das könnte man sich natürlich auch sparen und die ID einfach immer eintragen, aber so ist es halt komfortabler anzupassen.

Und hier kommt dann auch schon „die Zauberei“. Bei mir ist das in der index.php untergebracht, aber auch das ist natürlich wieder die Frage wie und wo man sowas haben will.

// Gibt es ueberhaupt Termine? Wir gehen erstmal nicht davon aus...
$empty = true;

// Hier bauen wir einen kleinen Filter fuer das Query, weil als erstes nur Termine,
// die heute stattfinden angezeigt werden sollen
$today = getdate();
function filter_where($where = '') {
   $where .= " AND post_date = '$today'";
   return $where;
}

// add_filter() wendet ueber einen Hook unsere Filter-Funktion an
add_filter('posts_where', 'filter_where');

$the_query = new WP_Query('&cat='.TERMINE_ID);
while ($the_query->have_posts()) : $the_query->the_post();
   $empty = false;
   $termine .= '<h4><a href="'.
               get_permalink().
               '">Heute - '.
               the_title('','',false).
               '</a></h4>';
endwhile;
// Filter entfernen (wirkt auch auf nachfolgende Querys, wenn mich nicht alles taeuscht...
remove_filter('posts_where', 'filter_where');
// ... und dann noch etwas aufraeumen...
wp_reset_postdata();

// Wir bereiten die Argumente fuer das Query der Eintraege in der Zukunft vor
$args = array(
   'post_category' => TERMINE_ID,
// posts_status = future haben alle geplanten aber noch nicht veroeffentlichten Eintraege.
// (Also auch die Termine, die in der Zukunft liegen)
   'post_status' => future,
   'posts_per_page' => 10,
   'orderby' => date,
   'order' => ASC );

// Und fuehren damit ein Query durch und verarbeiten die Posts entsprechend
$result_future = new WP_Query($args);
while ($result_future->have_posts()) : $result_future->the_post();
   $empty = false;
   $termine .= '<h4><a href="'.
               get_permalink().
               '">'.
               the_date(get_the_date("j. n. Y"),'',' - ',false).
               the_title('','',false).
               '</a></h4>';
endwhile;
wp_reset_postdata();

// Gab es wirklich keine Termine? Dann gibt es diese Anzeige...
if($empty) { $termine .= '<h4>Momentan keine Termine</h4>'; }

// Hier startet die normale Ausgabe
$post_count = 0;
$anzahl = get_option('posts_per_page');
// Anpassen des Query, um Eintraege aus der Termin-Kategorie zu entfernen.
// Man beachte das Minus.
query_posts($query_string . '&cat=-'.TERMINE_ID);
if (have_posts()) : while (have_posts()) : the_post();
// Mache coole Sachen mit den Posts...

Tja, das war schon wieder die ganze Magie.

$termine enthält dann natürlich die Einträge mit den Links etc. pp. Die füge ich dann an geeigneter Stelle ein und lasse sie ausgeben.

Das sieht dann auf der fertigen Seite wie folgt aus. Sind natürlich nur Testeinträge und ich hab auch gerade keinen eingetragen, der heute stattfindet.

Ja, das ist also ein Plugin-freier Ansatz um in seinem Blog Termine zu verwalten.

Vorteil an dieser Methode ist, würde ich zumindest mal sagen, dass ich meinen Terminen massig Infos (einen  ganzen Post voll, mit allem was mein Blog sonst so hat) mitgeben kann und für den Benutzer die Oberfläche für die Dateneingaben die Gleiche bleibt.

Ich hoffe das konnte dem ein oder anderen helfen. Über Kommentare oder Anmerkungen freue ich mich natürlich.

Support your local flomei
Wenn du hier etwas gefunden hast, dass dir privat oder beruflich weitergeholfen hat und du dafür Danke sagen möchtest, dann könntest du diesen Link benutzen, um bei Amazon einzukaufen, mir etwas von meinem Amazon Wunschzettel schenken oder eine Leberkässemmel finanzieren.