
Post mit zwei Autoren
Wer einen aufwendigeren Blog mit mehreren Autoren betreibt hat vielleicht schon mal die Anforderung gehabt: An einem Post arbeiten zwei Autoren und beide sollen angeführt werden. Oder ein Autor schreibt den Beitrag in WordPress und ein anderer überarbeitet diesen Post und dann sollen auch beide Namen angezeigt werden.
Die einfachste Lösung ist natürlich ein benutzerdefiniertes Feld und einfach den eigenen Namen reinschreiben. Aber wie ist das so mit den Anwendern: Erstens ist so was fehleranfällig, zweitens wird es gern vergessen und drittens klappen diese vielen Klicks so gut wie nie. Es muss als eine komfortable Lösung her.
Meta-Box zum Erweitern des Dashboards

Meta-Box für einen zweiten Autor im DashBoard von WordPress
Und da wäre am Besten eine zweite Meta-Box beim Modul Beitrag bearbeiten, welche die Liste der vorhandenen Benutzer (möglichen Autoren) anzeigt. Genau das werden wir jetzt erstellen, denn da klicken die Anwender auch hin und wir können im Theme eine saubere Lösung für das FrontEnd erstellen, denn die Autorennamen sind immer gleich geschrieben. Wie das mit den Meta-Boxen und benutzerdefinierten Feldern geht, habe ich ja schon vor kurzem beschrieben. Aber dieses Mal ist es halt kein einfaches Eingabefeld, sondern eine Auswahlliste.
Ach ja und das mit dem direkten Ändern von Themes hätten wir auch schon besprochen. Der Guru 2.0 hat schon mal beschrieben wie man ein Child-Theme in WordPress anlegt und dort alle Erweiterungen für ein bestehendes Theme ergänzt.
Die Meta-Box erstellen und die Autorenliste anzeigen
Dann legen wir jetzt los. Zu Beginn brauchen wir wie so oft die Datei functions.php
, um das WordPress-Theme mit unseren Ideen zu erweitern. Den gesamten Quellcode können wir elegant am Ende der Datei anhängen. Am Anfang steht die Funktion add_meta_box()
um eine leeres Element in das Dashboard einzufügen.
1 2 3 4 5 6 | // Meta-Box fuer 2. Autor function guru20_meta_author2_add() { add_meta_box('guru20-meta-author2', '2. Autor (Bearbeitung)', 'guru20_meta_author2_cb', 'post', 'side', 'default'); } add_action('add_meta_boxes', 'guru20_meta_author2_add'); |
Danach kommt auch schon die CallBack-Funktion um die Meta-Box mit der Auswahlliste der Autoren zu befüllen. Zuerst laden wir alle benutzerdefinierten Felder mit der Funktion get_post_custom()
. Dann prüfen wir ob das Custom Field mit dem Namen author2
schon einen Wert enthält. ist dies der Fall speichern wir diesen in der Variablen $text
. Falls nicht legen wir die ID des aktiven Benutzers in der Variablen ab.
Ein wenig Sicherheit muss sein. Darum erzeugen wir mit wp_nonce_field()
ein verstecktes Feld mit einem von WordPress erzeugten, zufälligen Inhalt. Dieses können wir beim Speichern dann abfragen und überprüfen ob jemand unser Skript missbraucht.
Nun müssen wir die aktiven Autoren des Blogs ermitteln. Dazu erzeugen wir eine neue Klasse mit WP_User_Search()
der wir als Parameter die Einschränkung auf author
mitgeben. Danach können wir mit alle Autoren mit Komma getrennt in der Variablen $authors
ablegen. Nachdem wir den aktiven Autor festgelegt haben, können wir mit der Funktion wp_dropdown_users()
eine Auswahlliste der Benutzer erzeugen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function guru20_meta_author2_cb($post) { //den aktiven Post und den aktiven Benutzer in der Funktion verwenden global $post, $user_ID; //alle benutzerdefinierten Felder des aktiven Posts laden $values = get_post_custom($post->ID); //wenn das Feld 'author2' vorhanden speichern $text = isset($values['author2']) ? esc_attr($values['author2'][0]) : $user_ID; //Sicherheitsfeld erzeugen wp_nonce_field('guru20_meta_author2_nonce', 'meta_box_nonce_author2'); //die Autoren mit einer neuen Abfrage ermitteln $wp_user_search = new WP_User_Search($usersearch = '', $userspage = '', 'author'); $authors = join(', ', $wp_user_search->get_results()); //Falls es ein neuer Post ist, denn aktiven Benutzer zum Autor machen, //sonst den im Feld gespeicherten if (empty($post>ID)) {$aID = $user_ID;} else {$aID = $text;} //Eine Auswahlliste erzeugen und ausgeben wp_dropdown_users(array('include' => $authors, 'who' => 'authors', 'name' => 'guru20_author2', 'selected' => $aID, 'include_selected' => true)); } |
Den 2. Autor des Posts speichern
Nun müssen wir noch die Auswahl unseres Anwenders speichern. Am Anfang prüfen wir ein paar Dinge um zu erfahren, ob überhaupt gespeichert werden kann und darf. Ganz am Ende der Funktion prüfen wir, ob ein Wert für das Custom Field eingegeben wurde und speichern den zweiten Autor mit der Funktion update_post_meta()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function guru20_meta_author2_save($post_id) { //Falls automatisch gespeichert wird abbrechen if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } //Falls das nocne-Feld nicht OK ist wird abgebrochen if(!isset($_POST['meta_box_nonce_author2']) || !wp_verify_nonce($_POST['meta_box_nonce_author2'], 'guru20_meta_author2_nonce')) { return; } //Wenn der aktive Benutzer gar kein Autor ist, wird abgebrochen if(!current_user_can('edit_post', $post_id)) { return; } //Wenn das benutzerdefinierte Feld einen Wert hat, diesen speichern. if(isset($_POST['guru20_author2'])) { update_post_meta($post_id, 'author2', esc_attr($_POST['guru20_author2'])); } } add_action('save_post', 'guru20_meta_author2_save'); |
einen zweiten Post-Autor im FrontEnd ausgeben
Eigentlich wäre der Beitrag jetzt zu Ende. Aber was hilft die ganze Programmiererei mit Meta-Boxen, Feldern und Usern, wenn wir diese dann nicht verwenden. Darum zeige ich dir hier noch einen Code-Schnippsel, den du an passender Stelle in dein Theme einfügen kannst. Wo genau hängt von deinem Theme ab, aber es ist sicher im Loop. Wahrscheinlich ist es die Datei content.php
.
Zuerst stellen wir die Daten des Hauptautors zusammen. Wir speichern die ID des Autors und stellen mit get_the_author_meta()
den echten Namen (nicht den Nice-Name oder Nickname) zusammen.
Nun hohlen wir uns mit get_post_meta($actID, 'author2', true).'';
die ID eines zweiten Autors aus den benutzerdefinierten Feldern des aktiven Posts. Nun prüfen wir ob ein zweiter Autor gespeichert wurde. Wenn dies wirklich der Fall ist, ermitteln wir dessen Daten und speichern diese in der Variablen $author2
. Am Ende haben wir dann zwei Werte $author
mit dem ersten oder einzigen Autor und $author2
welche entweder einen schließenden p
-Tag oder einen zweiten Autorennamen enthält.
Am Ende können wir diesen beiden Variablen mit einem einfachen echo
ausgeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | // ... hier kommt weiterer Code ... //Autoren-ID des aktiven Posts $userID = $post->post_author; //Name des Autors $author = trim(get_the_author_meta('first_name', $userID) .' '.get_the_author_meta('last_name', $userID)); //WebSeite des Autors $authorURL = get_the_author_meta('user_url', $userID); if ($authorURL != '') { $author = '<a href="'.$authorURL.'" title="Webseite von '.$author.'"">'.$author.'</a>'; } //Wenn ein Autorenname vorhanden ist if ($author != '') {$author = '<p class="goto-author">Ein Beitrag von '.$author;} //die ID des 2. Autors $userID2 = get_post_meta($actID, 'author2', true).''; if ($userID2 == '') { //Es wurde kein zweiter Autor gefunden $author2 = ""; if ($author != '') {$author .= '.</p>';} } else { //ein zweiter Autor ist vorhanden if ($userID == $userID2) { //die ID des zweiten Autors ist gleich wie die des Hauptautors //dann geben wir nichts zusaetzlich aus $author2 = ""; } else { //Denn echten Namen des zweiten Autors ermitteln $author2 = trim(get_the_author_meta('first_name', $userID2) .' '.get_the_author_meta('last_name', $userID2)); //Webseite des zweiten Autors $authorURL2 = get_the_author_meta('user_url', $userID2); if ($authorURL2 != '') { $author2 = '<a href="'.$authorURL2.'" title="Webseite von '.$author2.'"">'.$author2.'</a>'; } if ($author2 != '') { //Falls ein zweiter Autorenname vorhanden ist, diesen ausgeben if ($author != '') {$author .= '<br />';} else {$author = '<p>';} $author2 = 'und von '.$author2.' überarbeitet.</p>'; } } } // ... hier kommt weiterer Code ... //die Autoren ausgeben echo $author.$author2; |
Damit ist der Guru 2.0 wieder am Ende eines Posts angelangt. Ich hoffe ich konnte dir wieder einen Schritt weiterhelfen. Falls du Fragen hast, du weißt, da unterhalb ist ein Formular. Fülle die paar Felder aus und ich werde dir gerne helfen. Aber auch Kritik, Anregung und auch manchmal ein kleines Lob freuen mich.