04.08.12
Virtuelle Seiten mit WordPress erstellen

Bei WordPress ist es üblich, dass Plugins in bestehende Seiten über einen Content-Filter, der auf einen Tag wie [Plugin-Name] reagiert, eingebunden werden. Benötigt ein Plugin jedoch viele Seite wäre es unnötig aufwändig bis unmöglich alle nötigen Seiten manuell zu erstellen. Eine einfache Alternative sind virtuelle Seiten, die ausschließlich vom Plugin erzeugt werden.
Rewriting einrichten
Zunächst muss man die URLs registrieren, über die die virtuellen Seiten erreichbar sein werden:
add_action('generate_rewrite_rules', 'virtualPages_RegisterRewrite');
function virtualPages_RegisterRewrite() {
global $wp_rewrite;
$newRules = array();
$newRules['static-url/?$'] = 'index.php?virtualPages=static';
$newRules['dynamic-url/(\d+)-(\d+)/?$'] = 'index.php?virtualPages=dynamic&vPyear=' . $wp_rewrite->preg_index(1) . '&vPmonth=' . $wp_rewrite->preg_index(2);
$wp_rewrite->rules = $newRules + $wp_rewrite->rules;
}
Die Action generate_rewrite_rules wird aufgerufen, wenn die Permalinkstruktur gespeichert und die Rewrite-Regeln damit neu generiert werden. Man muss seine eigenen Regeln dem Regel-Array der Klasse $wp_rewrite hinzufügen. Dazu stellt man ein assoziatives Array, dessen Schlüssel die eigentlichen Regeln enthält und dessen Werte die umgeschriebenen URLs enthält. Die Parameter in den umgeschriebenen URLs werden mit $wp_rewrite->preg_index() eingesetzt. Hier muss man darauf achten, dass preg_index() bei 1 zu zählen beginnt und nicht bei 0 (da auch mod_rewrite die Parameter ab 1 durchzählt). Das Array mit den neuen Regeln muss nun noch den Regeln von $wp_rewrite hinzugefügt werden und die neuen Regeln sind aktiv.
Im nächsten Schritt müssen die URL-Parameter, die in den umgeschriebenen URLs verwendet werden, registriert werden:
add_filter('query_vars', 'virtualPages_RegisterQueryVars');
function virtualPages_RegisterQueryVars( $vars )
{
array_push($vars, 'virtualPages');
array_push($vars, 'vPyear');
array_push($vars, 'vPmonth');
return $vars;
}
Die neuen Parameter können über den Filter query_vars hinzugefügt werden. Der Callback-Funktion wird ein Array mit den Query-Parametern übergeben. Diesem fügt man einfach die neuen Parameter hinzu und gibt es zurück.
Virtuelle Seiten erstellen
Nachdem die URLs für die neuen Seiten registriert sind, können nun die eigentlichen Seiten erstellt werden. Dazu muss man eingehende Requests zunächst darauf prüfen, ob eine der virtuellen Seiten angefordert wird:
add_action('wp', 'virtualPages_Dispatcher', 1,0);
function virtualPages_Dispatcher() {
if(get_query_var('virtualPages') == 'static') {
virtualPages_RenderStatic();
} elseif(get_query_var('virtualPages') == 'dynamic') {
virtualPages_RenderDynamic(get_query_var('vPyear'), get_query_var('vPmonth'));
}
}
Am Anfang des Requests prüft man, ob eine der virtuellen Seiten aufgerufen wird. Wenn nicht braucht man nichts weiter zu tun. Wenn ja muss man sich darum kümmern die virtuelle Seite auszuliefern:
function virtualPages_RenderStatic() {
add_action('template_redirect', 'virtualPages_TemplateRedirect', 1, 0);
$virtualPage = new stdClass;
$virtualPage->ID = -99;
$virtualPage->post_author = 1;
$virtualPage->post_date = '2012-03-14 12:15:10';
$virtualPage->post_date_gmt = '2012-03-14 10:15:10';
$virtualPage->post_modified = '2012-08-04 12:15:10';
$virtualPage->post_modified_gmt = '2012-08-04 10:15:10';
$virtualPage->post_status = 'publish';
$virtualPage->comment_status = 'closed';
$virtualPage->ping_status = 'closed';
$virtualPage->comment_count = 0;
$virtualPage->to_ping = '';
$virtualPage->pinged = '';
$virtualPage->post_password = '';
$virtualPage->post_parent = 0;
$virtualPage->menu_order = 0;
$virtualPage->post_type = 'page';
$virtualPage->post_mime_type = '';
$virtualPage->filter = 'raw';
$virtualPage->post_category = array('uncategorized');
$virtualPage->guid = 'http://www.domain.tld/a-unique-guid';
//Die GUID muss kein funktionierender Link sein, jedoch eindeutig.
$virtualPage->post_name = '/static-url/'; //Die URL zur Seite.
$virtualPage->post_content = 'Hier ist der Content unserer neuen Seite.';
$virtualPage->post_title = 'Virtuelle Seite';
$virtualPage->post_excerpt = 'Der Auszug der virtuellen Seite.';
global $wp_query;
$wp_query->post = $virtualPage;
$wp_query->posts = array($virtualPage);
$wp_query->queried_object = $virtualPage;
$wp_query->queried_object_id = $virtualPage->ID;
$wp_query->found_posts = 1;
$wp_query->post_count = 1;
$wp_query->is_single = true;
$wp_query->is_page = true;
$wp_query->max_num_pages = 1;
$wp_query->is_404 = false;
$wp_query->is_posts_page = 1;
$wp_query->is_home = false;
$wp_query->is_frontpage = false;
}
function virtualPages_TemplateRedirect() {
require(get_theme_root() . '/' . get_template() . '/page.php');
exit();
}
function virtualPages_RenderDynamic($year, $month) {
if(!is_numeric($year) || !is_numeric($month) {
//Send a 404 Message.
return;
}
//Do something useful.
}
In diesem Code-Stück wird die virtuelle Seite erzeugt und ausgeliefert. Dazu muss man zunächst dafür sorgen, dass das richtige Template verwendet wird. Über die Action template_redirect kann das passende Template ausgewählt werden (hier z. B. das Page-Template für statische Seiten). Man muss aber daran denken, dass nicht jedes Template zwingend in allen Themes vorhanden sein muss. Um das Template zu ändern, wird es einfach per include oder require geladen. Wichtig ist, danach die Ausführung zu beenden, da die Seite sonst zwei Mal gerendert wird.
Als Nächstes erzeugt man seine virtuelle Seite als Post-Objekt. Hier sollte man darauf achten alle Eigenschaften zu füllen, die auch ein “echtes” Post-Objekt hat, da sich zum Beispiel andere Plugins oder Themes darauf verlassen. Im Feld post_content wird dann der eigentliche Inhalt der Seite eingefügt. In post_title wird der Titel der Seite eingefügt.
Zuletzt muss noch das $wp_query-Objekt so geändert werden, dass es die virtuelle Seite auch anzeigt.
Wie man sieht, ist man dabei nicht auf Seiten im Sinne von WordPress beschränkt. Man kann damit eigentlich jede Art von Post die WordPress kennt nachbilden und zum Beispiel mit der Loop Übersichtsseiten zu virtuellen Artikeln erstellen.
Zum Abschluss hier noch einmal der gesamte Code des Beispiels:
add_action('generate_rewrite_rules', 'virtualPages_RegisterRewrite');
function virtualPages_RegisterRewrite() {
global $wp_rewrite;
$newRules = array();
$newRules['static-url/?$'] = 'index.php?virtualPages=static';
$newRules['dynamic-url/(\d+)-(\d+)/?$'] = 'index.php?virtualPages=dynamic&vPyear=' . $wp_rewrite->preg_index(1) . '&vPmonth=' . $wp_rewrite->preg_index(2);
$wp_rewrite->rules = $newRules + $wp_rewrite->rules;
}
add_filter('query_vars', 'virtualPages_RegisterQueryVars');
function virtualPages_RegisterQueryVars( $vars )
{
array_push($vars, 'virtualPages');
array_push($vars, 'vPyear');
array_push($vars, 'vPmonth');
return $vars;
}
add_action('wp', 'virtualPages_Dispatcher', 1,0);
function virtualPages_Dispatcher() {
if(get_query_var('virtualPages') == 'static') {
virtualPages_RenderStatic();
} elseif(get_query_var('virtualPages') == 'dynamic') {
virtualPages_RenderDynamic(get_query_var('vPyear'), get_query_var('vPmonth'));
}
}
function virtualPages_RenderStatic() {
add_action('template_redirect', 'virtualPages_TemplateRedirect', 1, 0);
$virtualPage = new stdClass;
$virtualPage->ID = -99;
$virtualPage->post_author = 1;
$virtualPage->post_date = '2012-03-14 12:15:10';
$virtualPage->post_date_gmt = '2012-03-14 10:15:10';
$virtualPage->post_modified = '2012-08-04 12:15:10';
$virtualPage->post_modified_gmt = '2012-08-04 10:15:10';
$virtualPage->post_status = 'publish';
$virtualPage->comment_status = 'closed';
$virtualPage->ping_status = 'closed';
$virtualPage->comment_count = 0;
$virtualPage->to_ping = '';
$virtualPage->pinged = '';
$virtualPage->post_password = '';
$virtualPage->post_parent = 0;
$virtualPage->menu_order = 0;
$virtualPage->post_type = 'page';
$virtualPage->post_mime_type = '';
$virtualPage->filter = 'raw';
$virtualPage->post_category = array('uncategorized');
$virtualPage->guid = 'http://www.domain.tld/a-unique-guid';
//Die GUID muss kein funktionierender Link sein, jedoch eindeutig.
$virtualPage->post_name = '/static-url/'; //Die URL zur Seite.
$virtualPage->post_content = 'Hier ist der Content unserer neuen Seite.';
$virtualPage->post_title = 'Virtuelle Seite';
$virtualPage->post_excerpt = 'Der Auszug der virtuellen Seite.';
global $wp_query;
$wp_query->post = $virtualPage;
$wp_query->posts = array($virtualPage);
$wp_query->queried_object = $virtualPage;
$wp_query->queried_object_id = $virtualPage->ID;
$wp_query->found_posts = 1;
$wp_query->post_count = 1;
$wp_query->is_single = true;
$wp_query->is_page = true;
$wp_query->max_num_pages = 1;
$wp_query->is_404 = false;
$wp_query->is_posts_page = 1;
$wp_query->is_home = false;
$wp_query->is_frontpage = false;
}
function virtualPages_TemplateRedirect() {
require(get_theme_root() . '/' . get_template() . '/page.php');
exit();
}
function virtualPages_RenderDynamic($year, $month) {
if(!is_numeric($year) || !is_numeric($month) {
//Send a 404 Message.
return;
}
//Do something useful.
}
Das könnte Sie auch interessieren:
- PHP Memcache Server einrichten
- PHP und seine Konstruktoren
- PHP: RSS Feed Reader in 10 Minuten
- Browserkompatibilität auf mobilen Geräten
- PHP Incomplete Class – Kleine Ursache große Wirkung
Von: admin Tags: tipp, Web, WordPress
Sag deine Meinung
Die E-Mail Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.
Suche
Spannende Themen
Bleibe auf dem Laufenden