Tags

#Web & Publishing

Alles rund um Websites, Publishing, CMS, Blogging und den technischen Unterbau des Webs.

Verlinkte Listen in Wordpress automatisch generieren

Verlinkte Listen in Wordpress automatisch generieren

Manchmal benötigt man in Wordpress Strukturen, die spezieller und kleinteiliger sind, als die üblichen Kategorien/Tag-Zuweisungen. Mit ein paar Umwegen und dem Plugin ACF ist es auch Wordpress möglich, contentabhängige Listen zu generieren.

Wenn ich mir kleinere und moderne Content-Management-Systeme wie beispielsweise http://de.processwire.com anschaue, bin ich schon etwas neidisch:

Bei Processwire gibt es keine vorgefertigten Feldtypen; man muss sie bei jedem Projekt neu aufbauen. Das führt dann dazu, dass http://demo.processwire.com eben durch die enorm vereinfachte Felder-Philosophie ziemlich schnell umgesetzt sind. https://www.youtube.com/watch?v=IHqnLQy9R1A&list=PLo7Qkm2fy7zDdXCHTBUZXG7C3poa3efAQ&index=2.

Eine Webseite für einen speziellen Kundenwunsch hätten wir damit wunderbar umsetzen können, wenn wir a) die Zeit gehabt hätten uns in Processwire intensiv einzuarbeiten und b) wir nicht so auf Wordpress stehen würden.
Die Voraussetzungen

Die Kunden hatten eine alte Seite mit ziemlich vielen Daten, die in Beziehung miteinander stehen. Wenn wir uns auf die Processwire-Demo-Seite von oben beziehen: eine Seite mit Hochhäusern. Jeder Stadt sind dort Hochhäuser zugeordnet. Jedem Hochhaus eine spezifische Höhe, ein Baujahr und die Architekten. Diese spezifischen Daten sind wiederum untereinander verknüpft: Es gibt Übersichtsseiten über Architekten und welche Häuser sie entworfen haben, wie auch Seiten mit Häusern gleicher Höhe.
Das Problem

Das Problem an der Sache war, dass die gesamten Daten der alten Kundenseite via PHP aus Text-Dateien ausgelesen wurden und bei Syntaxfehlern natürlich das ganze Beziehungsgeflecht kaputt gemacht werden konnte. Deshalb hatte der vorherige Entwickler gesagt: Ihr dürft das nicht ändern, ich mach das gerne für euch.

Der Kunde möchte es aber bei einer Wordpress-Seite selbst ändern.
Die Vorüberlegungen

Uns ist es enorm wichtig, wenn nicht sogar am wichtigsten, dass die Update-Fähigkeiten unserer Wordpress-Seiten gewahrt bleiben. Deshalb sind Frickeleien am Core natürlich tabu und auch Plugins werden bei uns nur entwickelt, wenn es zu diesen einen längerfristigen Service & Wartungsvertrag gibt.

Wir brauchen eine flexible Lösung, die quasi das Kategorie/Tag-System von Wordpress aufbohrt. Zusätzlich soll der Inhalt nur an speziellen Positionen im Template ausgeben werden und jederzeit selbst von dem Kunden gepflegt werden können.

Und es klappt!
Die workin media Lösung

Viele, die sich schon intensiver mit Wordpress auseinandergesetzt haben, kennen mit Sicherheit das Plugin http://www.advancedcustomfields.com von Elliot Condon. Damit kann man relativ simpel neue Inhaltsfelder generieren um nicht-statische Inhalte an fixen Positionen im Layout auszugeben.

https://workin-media.hnz.io/wp-content/uploads/2015/06/advanced-custom-fields.png Ansicht des Plugins im Backend.

Jedem Feld kann dort ein Label zugeordnet werden. Wir haben nun das Beispiel „Hochhaus“ genommen und als Checkbox angelegt: Jedes Hochhaus ist dort seiner Seite zugeordnet (siehe links).

Wenn man nun eine neue Seite erstellt, beispielsweise „New York City“, dann kann dort der Nutzer „Park Avenue“ und „Chrysler Building“ anhäkeln; denn wir wissen ja alle, dass das AT&T Corporate Center in Chicago steht.

Diese manuelle Zuordnung mussten wir so implementieren, weil bei unserem Kunden, anders als bei den Hochhäusern, sich die Elemente einer Kategorie oft verändern können und er so die Möglichkeit hat auf der Seite, auf der sie ausgegeben werden, die Inhalte zu definieren.

Die Ausgabe haben wir mit folgendem Code in der function.php des aktiven Themes gesteuert:

// Add Shortcode
function hochaus() {

$values = get_field('Hochaus');
$field = get_field_object('Hochhaus');
$label = $value[$key];

if($values) {
echo '
';
foreach($values as $value)
{
echo '- ' . '[' . $value . '](' . $value . ')' . '
';
}
echo '
';
}
}
add_shortcode( 'hochhaus', 'hochhaus' );

Was macht der Code? Er erstellt über den Shortcode eine Liste, mit allen angehäkelten Häusern an der Position des Shortcodes. Außerdem verlinkt er sie zu dem Linkziel, das im ACF definiert wurde.
Wofür eignet sich die Methode?

- Darstellung kleinerer Inventarlisten

- Zuordnung verschieder Datenpunkte

- Flexible Handhabung/Pflege der Ausgabe

Bildnachweis: https://pixabay.com/de/einstellungen-optionen-software-265131/

Wordpress: Formulardaten von Contact Form 7 via SMTP richtig versenden

Wordpress: Formulardaten von Contact Form 7 via SMTP richtig versenden

Wie können in Wordpress Formular-Komponenten wie http://wordpress.org/plugins/contact-form-7/ oder das (kostenpflichtige) http://www.gravityforms.com funktionieren, wenn der Wordpress-Server nicht die Mails verarbeitet? Weil beispielsweise ein externer Mailserver für die Zustellung eingerichtet ist? Wir haben die Lösung. Vielleicht nicht lehrbuchreif. Dafür funktioniert's – sogar mit den "richtigen" Absender-Namen und E-Mail-Adresse.

Es kommt öfter vor, als einem bewusst ist, dass der Mailserver einer Domain nicht vom selben Server gestellt wird. Wir bei der workin media nutzen beispielsweise die http://www.google.de/intx/de/enterprise/apps/business/ um effektiv und zentral unsere Mails verwalten zu lassen. Das heißt aber auch, dass Wordpress-Formulare nicht mehr funktionieren, da diese standardmäßig mit der php-Funktion http://php.net/manual/de/function.mail.php verschickt werden wollen. Ob dies klappt oder nicht, bekommt ihr dadurch zu spüren, ob ihr bei neuen Kommentaren, Updates, etc. von eurer Seite per Mail benachrichtigt werdet oder nicht (natürlich auch via http://php.net/manual/de/function.phpinfo.php).

Oder eben, weil Mails aus Formularen nicht ankommen. Und das ist tatsächlich etwas tricky, weil beispielsweise Contact Form 7 dem Nutzer gute Miene zum bösen Spiel macht und zwar auf der Seite anzeigt, dass die Nachricht versendet. Es aber nicht macht.

Die Lösung: Mailversand via SMTP. Da können wir euch eine Lösung anbieten, indem ihr im Code rumflickelt. Oder ein Plugin, was das für euch übernimmt.
Die Codelösung

Zunächst editiert ihr eure config.php im Stammverzeichnis der Wordpress Installation und fügt folgenden Code ein:

// SMTP
function smtp_wp_mail($phpmailer) {
$phpmailer->IsSMTP(); // telling the class to use SMTP
$phpmailer->Host = "smtp.example.com"; // set the SMTP server host
$phpmailer->Port = 465; // set the SMTP server port
$phpmailer->SMTPSecure = "ssl"; // enable SMTP via SSL
$phpmailer->SMTPAuth = true; // enable SMTP authentication
$phpmailer->Username = "wordpress@example.com"; // set the SMTP account username
$phpmailer->Password = "PASSWORD"; // set the SMTP account password
}

Die entsprechenden Felder müsst ihr mit den Daten eures externen Mailproviders befüllen.

Als nächstes müsst ihr in der wp-includes/pluggable.php Wordpress noch klar machen, dass ihr Mails nun via SMTP verschicken wollt.  Sucht bitte $phpmailer->IsMail(); und ersetzt die Zeilen mit der folgenden Version:

// Set to use PHP's mail()
// $phpmailer->IsMail();

//SMTP
smtp_wp_mail($phpmailer);

Bei jeder Wordpress-Aktualisierung können diese Änderungen verloren gehen.
Die Plugin-Lösung

https://workin-media.hnz.io/wp-content/uploads/2014/06/smtp-mail11.png WP SMTP Mail im Dashboard

Für einige ist die Plugin-Lösung der einfachere Weg, wobei das Plugin nichts anderes macht, als wir weiter oben beschrieben. Nur eben im Wordpress-Backend in einer netten Formular-Ansicht. Wir nutzen hier http://wordpress.org/plugins/wp-mail-smtp/.

Das Problem, was es beim SMTP-Versand geben kann, ist ärgerlich: Viele Server verbieten es (zu Recht!) Mails unter falschen Namen zu versenden.

Wenn allerdings ein Nutzer ein Kontaktformular auf eurer Seite verwendet, wollt ihr auch, dass das Kontaktformular von eben jener Person kommt. Martina Musterfrau (martina@musterfrau.de) benutzt dann zwar das Formular – die Mail von Wordpress kommt aber über den SMTP-Account, den wir vorher definiert hatten. Und wenn ich dann Frau Musterfrau schnell antworten möchte und nicht daran denke, schreibe ich leider dem SMTP-Account eine Mail.

Es gibt allerdings noch andere Probleme: Beispielsweise kann man so Kontaktformulardaten nicht an Ticketsysteme wie http://osticket.com.de, http://www.otrs.com/?lang=de oder https://www.zendesk.de übergeben, da durch die falsche Zuweisung die Systeme ad absurdum geführt werden und immer eine händische Korrektur des Absenders nötig wäre. Dafür, dass solche Systeme Arbeit abnehmen sollen und eben nicht zusätzliche verursachen, war das für uns nicht tragbar.
Die Lösung bei Contact Form 7

https://workin-media.hnz.io/wp-content/uploads/2014/06/contact-form-711.png Zusätzliche Kopfzeilen

Bei  Contact Form 7 gibt es das von mir sträflich übersehene Zusatzfeld "Zusätzliche Kopfzeilen", was beispielsweise dazu gedacht ist, Antwortadressen hinzuzufügen. Dann bekommt ihr zwar immer noch eine Mail von eurem Account. Wenn ihr Antwortet, wird aber dem richtigen Absender geantwortet. Außerdem funktioniert die Weiterleitung zu beispielsweise Zendesk perfekt.

Gebt einfach (mit den Standardformular-Tags) folgenden Code in das Feld ein:

Reply-To: <>

Denkt an das Leerzeichen zwischen den beiden Tags. Und alle sind glücklich.