Seit langem habe ich mich damit herumgequält, dass mir das Plugin „Ninja Forms“ erheblichen Ärger bereitete. Nun habe ich umgestellt: Mein neuer Favorit für von Benutzern generierte Beiträge ist „WPForms“.
Es war immer dasselbe: Jedes Mal, wenn ich auf der Admin-Oberfläche von Ninja Forms arbeiten, ein neues Formular anlegen oder ein bestehendes ändern wollte, kam es zu extrem langen Ladezeiten, mitunter hängte sich die Seite komplett auf. Auch im Frontend dauerte es mitunter sehr lange, bis eine mit dem Plugin verbundene Seite geladen war.
Bis ich es dann leid war. Das am häufigsten verwendete Formular ist dasjenige, über welches die User:innen des von mir betreuten Presseportals fair-NEWS.de neue Pressemitteilungen erfassen und sofort im Frontend veröffentlichen können. Die Krux dabei: Die einzelnen Beiträge werden zumeist mit einem Artikelbild „geschmückt“.
Eigentlich kein Problem: Ein Feld zum Upload eines Artikelbildes (in WordPress „Featured Image“ genannt) haben eigentlich alle Plugins, die zur Frontend-Erfassung von neuen Artikeln am Markt sind. Ich habe etliche ausprobiert, manche Lizenz dann auch gekauft. Viele funktionieren einwandfrei, andere ließen aber auch schon mal meinen Server komplett abstürzen. Einige sind extrem umständlich in der Handhabung oder verlangen, dass man sich intensiv mit den dort verwendeten Shortcodes vertraut macht und anschließend den Code in PHP und HTML selbst schreibt.
Ich hatte so manches Plugin für kurze Zeit im Einsatz, aber immer gab es irgend etwas zu beanstanden. Vor allem aber: Es fehlt regelmäßig die Möglichkeit zur Erfassung einer Bildunterschrift zum Artikelbild.
Dazu ist vorauszuschicken, dass in Deutschland (und, soweit ich weiß, in der gesamten EU) die Urheberrechte an Bildmaterial derart geschützt sind, dass ein Hinweis auf den Rechteinhaber bei jeder Veröffentlichung mit dem Bild zusammen angezeigt werden muss. In weiten Teilen der Welt, auch in den USA, scheint das nicht so zu sein. Hierzulande jedoch müssen selbst Bilder, die einer kostenlos nutzbaren Bild-Bibliothek entnommen sind, in vielen Fällen noch mit dem Hinweis auf das überlassende Portal gekennzeichnet werden.
Und genau das wurde zu meinem Problem. Denn egal, welches Plugin ich auch ausprobierte, ob User Submitted Posts, WP User Frontend, Frontend Post WordPress Plugin oder was auch immer: Nirgendwo gibt es die Möglichkeit, dem Artikelbild eine Textunterschrift mitzugeben. Ich habe oftmals den Plugin-Support gebeten, mir eine Möglichkeit aufzuzeigen – nix. Im Gegenteil: Auf manche Antwort warte ich heute noch. Hinzu kommt, dass etliche Plugin-Lösungen entweder Ajax-Probleme verursachten oder nur in einzelnen Browsern liefen; mache reagierten nur im Edge, andere nur in Chrome und/oder Firefox. Chrome war wohl der robusteste Browser, aber was nützt das, wenn etliche User:innen mit Edge auf die Seite kommen?
Also machte ich auf der Suche nach einer Lösung letztendlich WPForms startklar. Dazu veranlasste mich die Erfahrung, dass das Plugin zwar ähnlich mächtig (nix mit heavy light) ist, aber zackig startete und im Chrome-Browser auch beim Öffnen der Musterformulare und folgenden Aktionen zügig arbeitete. Und das in allen drei von mir getesteten Browsern. Allerdings: Ich musste schon in den Einstellungen Ajax abschalten, damit nicht auch hier Fehlermeldungen in der Konsole erschienen. Damit kann ich aber leben, weil alles andere zufriedenstellend läuft.
Bis auf -natürlich – die Bildunterschrift. Nun wollte ich aber unbedingt bei WPForms bleiben, weil alles andere – siehe oben. Und so schrieb ich dem Support meine Frage zu dem Thema. Jetzt, eine Woche später, habe ich noch keine Antwort. Ganz gut, dass ich nicht darauf gewartet habe und das Problem selbst lösen konnte. Zumindest funktioniert es bei meinem Portal einwandfrei.
Und das gelang mir so: In dem Formular, das zur Erfassung neuer Pressemitteilungen für die Endbenutzer:innen verwendet wird, fügte ich ein Feld mit der Drop-Down-Auswahl „Ja“ und „Nein“ und dem Label „Beitragsbild hinzufügen?“ ein. Klar, das Formularfeld für den Bildupload brauchte ich auch. Und jetzt habe ich zusätzlich ein Meta-Feld mit dem Namen „featured_image_caption“ angelegt. Für die Benutzer:innen sichtbares Label: Bildunterschrift, das Ganze als Textfeld mit einer Zeile. Beide Felder, Also das für den Upload und das für das Metafeld, bekamen über die „Bedingte Logik“, die in WPForms-Feldern aktiviert werden kann, die Option mit auf den Weg, sich nur zu zeigen, wenn bei der vorherigen Auswahl „Ja“ gewählt wurde. Das macht das Ganze etwas eleganter 😉
Wer also einen neuen Beitrag erstellt und ein Artikelbild zeigen will, bekommt in der Tabelle _wp_postmeta (bei Verwendung des Präfix _wp_) ein neues Feld, in dem die von Benutzer:innen erfasste Bildunterschrift gespeichert wird. Das alles ist dem Umstand geschuldet, dass ja keine Eingaben in der Tabelle unter der ID des Artikelbildes möglich sind.
Und nun der kleine Kniff: Ich hatte ja bei erfolgreichem Versand durch die Benutzer:innen einen neuen Beitrag mit Artikelbild, wobei die Bildbeschreibung bzw. -unterschrift im „falschen“ Datenbanksatz gespeichert war, nämlich in dem des Beitrags und nicht dem des Bildes. Mein Ziel war, dass beim ersten Aufruf des neuen Posts der Beschreibungstext aus dem Datensatz des Artikels hinüber zum Datensatz des Artikelbildes verschoben, dort unter ‚post_excerpt‚ gespeichert und danach, weil ja am Ursprungsort nicht mehr benötigt, einfach gelöscht wird. Der folgende Codeschnipsel lässt sich in die function.php des Themes einbauen oder auch als Code-Schnipsel, wie ich das mit dem Plugin ‚Snipptes‚ mache:
function bildunterschrift_action( $post_object ) {
global $post;
$id = $post->ID;
$bildunterschrift = '';
$imgmeta = get_post_meta($id);
$thumbid = $imgmeta['_thumbnail_id'][0];
$bildunterschrift = $imgmeta['featured_image_caption'][0];
if(!empty($bildunterschrift)) {
$my_post = array(
'ID' => $thumbid,
'post_excerpt' => $bildunterschrift,
);
wp_update_post( $my_post );
delete_post_meta( $id, 'featured_image_caption' );
}
}
add_action( 'the_post', 'bildunterschrift_action' );
Ehrlich gesagt habe ich keine Ahnung, ob dieses zusammengeklaute und selbst erweiterte Stückchen Code nun den höchsten Coder-Ansprüchen genügt, aber es funktioniert: Die von den Benutzern erfassten Pressemitteilungen erhalten nun ab dem ersten Aufruf Artikelbilder, die mit einer Bildbeschreibung versehen werden können, die, je nach verwendetem Theme, unter dem Text oder innerhalb des Images erscheinen. Genau das was ich wollte.