geschrieben von Micha am 20. Oktober 2008 | 11 Kommentare
WordPress 2.7 wird in Kürze veröffentlicht werden. Viele Themeentwickler werden (oder sind schon dabei) ihre Themes der neuen Version anpassen. Ein ganz normaler Vorgang. Wenn da nicht die comments.php wäre.
Neu ab Version 2.7 sind folgende Funktionen/Template Tags in der comments.php:
- post_password_required() – Check, ob ein Password erforderlich ist
- have_comments() – Comment-Loop Beginn
- wp_list_comments() – gibt die Kommentare aus
- previous_comments_link() – Kommentarpagination
- next_comments_link() – Kommentarpagination
- comment_form_title() – Überschrift des Kommentarfeldes
- wp_logout_url() – Url zum Ausloggen angemeldeter Nutzer
- comment_id_fields() – fügt 2 hidden Inputfelder hinzu
Zusätzlich wird in der header.php ein Javascript benötigt, wp_enqueue_script(‘comment_reply’).
Das heißt, all diese Funktionen kennt WordPress kleiner 2.7 nicht. Jetzt gibt es 3 Möglichkeiten:
- Ich biete in meinem Theme die neuen Features nicht an.
- Ich binde die neue comments.php ein, die Nutzer von WordPress 2.6.2 oder kleiner haben Pech gehabt.
- Ich mache mir eine Menge Arbeit und baue die comments.php für beide Versionen um.
Die 2. Variante ist eigentlich der schlechteste Kandidat, da für nicht WP 2.7 Nutzer die Kommentarfunktionalität nicht mehr gegeben ist und sogar zu Fehlermeldungen etc. führen kann, es sei denn, ich biete das Theme ausschließlich für WP 2.7 an.
Bei Variante 1 geht nichts kaputt, lediglich die neuen Funktionen wie Erwiderung auf ein Kommentar und die Kommentarpagination gehen nicht.
Die 3. Variante ist natürlich nicht schön, aber man ist auf der sicheren Seite. Ich würde folgendes machen (es sei denn, einer meiner Leser weiss etwas Besseres):
Da die neuen Funktionen von oben bis unten über die comments.php verstreut sind, macht es für mich keinen Sinn, nach zig Funktionen abzufragen und ein Chaos in der Datei anzurichten. Hier meine Lösung:
if(function_exists('wp_list_comments')) :
...kompletter Code der comments.php von WordPress 2.7
else:
...kompletter Code der comments.php von WordPress kleiner 2.7
endif;
In der header.php natürlich auch die Abfrage bei der Einbindung des Javascripts:
if(function_exists('wp_list_comments')) :
if(is_singular()) wp_enqueue_script('comment-reply');
endif;
Wie gesagt, wer eine bessere Lösung hat, bitte das Kommentarformular strapazieren.
Ich denke, ich werde die comments.php erst mal lassen, wie sie ist. Denn eine Reply-Funktion biete ich bei mir im Blog via Plugin an, und Threading zerreißt am Ende das Design. Aber ich will mein Theme ja auch nicht anbieten.
Ich würde einfach den jetzigen Versionsstand einfrieren und den für alle WP Versionen kleiner 2.7 anbieten und dann eine Version deines Themes für Version größer gleich 2.7 bauen. Änderungen dementsprechend nur noch am neuen Theme…
Keine schlechte Idee.
Mein Hauptproblem bei den neuen Funktionen ist irgendwie, dass einem die ganze Kontrolle bei Verwendung der neuen Funktionen aus der Hand genommen wird.
Mein Ansatz dabei könnte so weit gehen, dass ich mir womöglich eine eigene Library anlege, wo ich manche WP-Klassen überlade und durch meine Eigenen ersetze. Ist zwar nicht schön, aber auch ein Weg, sofern ihn die WordPress Devs nicht auch noch verbauen
Tatsächlich wird mit der neuen Version einiges leichter. Wer 100% die Kontrolle über den Code der Kommentarseiten haben möchte kann sich einen “Callback” schreiben.
Justin Tadlock hat dies in seinem Theme Hybrid schon getan:
hybrid
@Toei Rei,
du hast schon Recht, aber das mit der eigenen Library würde ich nicht tuen. Das ist kaum noch wartbar. Kommt ein Bugfix oder Securitypatch, mußt du jedes mal ändern.
Ich versuche, irgendwie damit zu leben und das beste daraus zu machen.
@kretschmar, der link geht auf die Themeseite, von einer Erklärung oder Beispiel ist da nix zu sehen.
Otto zeigt hier: http://ottodestruct.com/blog/2008/09/29/wordpress-27-comments-enhancements/
wie man einfach den alten Kommentar-code in eine extra Datei auslagert.
Hi Micha,
da hat sich einer Fehler im Code eingeschlichen
Es heißt nicht (‘comment-reply’;) sondern (‘comment-reply’); ….
Ansonsten eine echt coole Idee mit function_exists die Kompatibilität abzufragen.
Danke Jared, habs korrigiert.