WordPress + ActivityPub wird gerade auf FediDB gefeatured!
Thanks a lot @dansup ❤️

WordPress + ActivityPub wird gerade auf FediDB gefeatured!
Thanks a lot @dansup ❤️

WordPress wurde 20 Jahre alt! 20 Jahre!
Vor etwas mehr als 20 Jahren bin ich über Brett Taylors wunderbar nerdiges Blog gestolpert: webfroot.co.nz
Am 04. April 2002 schreibt Brett: „News script is powered by b2, allowing for an RSS XML, better archive system, and improved comments system too.“
Das war Inspiration genug um einen Monat später mit meinem eigenen kleinen b2 Blog an den Start zu gehen.
Mittlerweile begleitet mich das kleine stückchen PHP-Code fast mein halbes Leben und ich hätte nie daran gedacht, dass ich mit meinem Hobby-Projekt irgendwann mein Geld verdienen würde!
Happy Birthday WordPress!
Zum 15. Jubiläum habe ich angefangen meine „WordPress Origin Story“ zu dokumentieren. Der Vollständigkeit halber hier also die folgenden 5 Jahre 😉
2019 stand im Zeichen des ActivityPub Plugins. Hätte ich damals gewusst… 😉
Während meinen 7++ Jahren bei IONOS hatte ich nebenher immer mal wieder mit WordPress zu tun. 2020 bekam ich aber die Möglichkeit, mit einem kleinen Team zusammen, das WordPress Hosting neu/mit zu gestalten. Aus diesem kleinen dreiköpfigen WordPress-Team wurde in den folgenden drei Jahren ein großartiges Haufen von 15+ Personen (inklusive Support, PO, PM, …).

Neben dem daily business haben wir IONOS in dieser Zeit ein kleines bisschen näher an die Community „geschubst“ (zumindest rede ich mir das ein 😉 ). Wir haben einen GitHub Account gestartet, den Entwicklern Zeit für die Five for the Future Initiative frei geräumt und IONOS wurde Teil der (Make) Hosting Community.
In diesem Zuge habe ich mich auch persönlich engagiert und dafür im Juni das Hosting Team Badge „verliehen“ bekommen.
Mein aktivstes Jahr beim Pluginkollektiv. Ich mag die Idee und schätze die Plugins sehr! Ich hoffe ich finde in Zukunft wieder etwas mehr Zeit für das Kollektiv, immerhin arbeite ich ja jetzt hauptberuflich an ActivityPub & Co. und brauche deshalb wieder ein neues Hobbie/Freizeitprojekt 😉
Im März fand der CloudFest Hackathon im Europa-Park statt und ich hatte die Chance, ein Thema zu betreuen. Drei Tage WordPress, IndieWeb und Webmentions <3
…und meine große Klappe auf Twitter, hat dafür gesorgt, dass ich seit diesem Jahr einen neuen Job habe.

Seit April darf ich mich from 9 to 5 mit dem „Open Web“ beschäftigen und bekomme dafür auch noch Geld!
Vielen Dank Matt und vielen Dank Automattic!
…dazu aber später nochmal mehr 🙂
Ich bin gespannt was dieses Jahr noch mit sich bringt und wie die Zukunft von WordPress aussieht.
Wenn es nach mir ginge, dann würde daraus ein „open, portable, interoperable, small, social, synaptic, semantic, structured, distributed, (re-)decentralized, independent, microformatted and federated social“ WordPress 😉

Gestern vor 15 Jahren hat Evan seinen ersten Post ins Fediverse gesendet:
Fifteen years ago tomorrow I published the first post on the fediverse.
https://web.archive.org/web/20080618164355/http://identi.ca/notice/1
It’s still visible on Identi.ca today, although the URL format changed a few years ago, and the redirect plugin stopped working a few years after that.
https://identi.ca/evan/note/Y0QwGyc1QYilqqawkDrQlg
Thanks to everyone who made identi.ca a great place to be, and thanks to everyone who’s expanded the fediverse since then.
Someday soon-ish I’d like to have identi.ca working with ActivityPub. When I get the time for it!
https://cosocial.ca/@evan/110385636249899888
Vor 15 Jahren!!!
Erst laconi.ca/identi.ca dann status.net und jetzt gnu.social.
Von OpenMicroBlogging über OStatus zu ActivityPub.
Es ist faszinierend wie lange sich die Idee gehalten hat und das unabhängig von der Platform und dem Protocol!
Laut dem Screenshot von meinem Profil, bin ich auch schon seit Juli 2008 dabei.
Happy Birthday und mal schauen wie das Fediverse in 15 Jahren aussieht 😉 !


Vor zwei Jahren wollte Twitter in das „Dezentrale Netzwerke“-Business einsteigen und gründete eigens dafür das Projekt Bluesky. In den folgenden zwei Jahren wurde viel evaluiert und diskutiert, was wohl die beste Lösung für Twitter sei und wir alle fieberten mit ob es nun ActivityPub oder doch Matrix werden würde…
Aber das Warten hat ein Ende! Bluesky hat verkündet wie es weiter geht!
Sie entwickeln ein neues Protokoll!
Das AT Protocol, kurz für Authenticated Transfer Protocol!
Ich hab mir die FAQ mal angeschaut und dort steht warum Bluesky sich gegen ActivityPub entschieden hat:
Account portability is the major reason why we chose to build a separate protocol. We consider portability to be crucial because it protects users from sudden bans, server shutdowns, and policy disagreements. Our solution for portability requires both signed data repositories and DIDs, neither of which are easy to retrofit into ActivityPub. The migration tools for ActivityPub are comparatively limited; they require the original server to provide a redirect and cannot migrate the user’s previous data.
Das erinnert mich ein bisschen an die Subline von meinem OpenWeb-Icons Font:
Why OpenWeb Icons? Because Font Awesome had no RSS-icon […]
Weil ActivityPub keine perfekte Lösung für „Account portability“ hat, bauen sie ein komplett neues Protokoll?
ActivityPub ist sicherlich nicht „feature complete“, aber ein guter erster Wurf, was das Fediverse erfolgreich bewiesen hat! Warum arbeitet Twitter also lieber an einem eigen Format anstatt mit dem W3C zusammen an ActivityPub v2?
Warum macht sich das W3C überhaupt noch die Mühe „Standards“ zu definieren?
Wegen der Interoperabilität!
Würde Twitter mit HTTP(S), HTML oder CSS ähnlich umgehen, würde der Browser einfach leer bleiben, weil das &$%§& Internet nur mit einheitlichen Standards funktioniert!
Und das gleiche gilt auch für dezentralte Netze, zumindest wenn sie erfolgreich sein wollen! Darüber hab ich tragischerweise schon vor 10 Jahren geschrieben!
Diaspora* wurde kaum für „tot“ erklärt und schon steht das nächste Projekt in den Startlöchern! Tent.io soll ein protocol for distributed social networking and personal data storage werden. Alles neu, alles anders, alles besser als OStatus, DiSo oder Diaspora*. Aber mal ganz ehrlich… was haben die Diasporas & Co. bisher geschaffen? Ziel war es Facebooks „Walled Gardens“ aufzubrechen und was kam wirklich dabei rum? Eine ganze Reihe an dezentralen „Walled Gardens“. Na danke!
Dezentrale „Walled Gardens“
Das fediverse hat (wie schon erwähnt) bisher einen großartigen Job gemacht und verschiedenste Netzwerke mit den verschiedensten Ausprägungen vernetzt! Ich glaube bin der festen Überzeugung, dass sich diesmal wirklich das offene Format (ActivityPub) durchsetzen wird und Blueskys Authenticated Transfer Protocol auch in ein paar Monaten oder Jahren keine Rolle spielen wird!
Ben Werdmuller hat eine gesunde Einstellung zu dem Thema:
I’m so burned out by open source social, but I’m glad to see people throw energy at the problem, even if it’s not how I would have gone about it.
Twitter
Mehr hab ich dazu eigentlich nicht zu sagen, außer dass wir in der aktuellen Folge des neunetzcasts sehr ausgiebig über genau dieses Problem gesprochen haben!

Heute vor 20 Jahren habe ich mit dem Bloggen angefangen! Das heißt ich schreibe jetzt fast mein halbes Leben lang Dinge in’s Internet!
Von 2002 bis 2005 ging es viel um persönliches und privates. Ich hatte ein Blog mit Freunden, das oft auch einfach als Ersatz zu einem Messenger benutzt wurde.
2005 hab ich dann angefangen hier zu bloggen. Von 2005 bis 2007 waren mein Studium, Web-Technologien und das Web 2.0 die großen Themen auf notiz.Blog. Ich war fasziniert von der Blogosphäre und den sozialen Netzwerken die (damals noch als die Guten) so nach und nach entstanden.
Ab 2007 entwickelten sich die großen „Communities“ immer mehr zu „Walled Gardens“ und ich schrieb und beschäftigte mich bis 2010 viel mit den Themen „Dezentrale Netzwerke“ und „Data Portability„.
Seit 2007 hab ich auch angefangen mich intensiver mit meiner Blogging-Plattform WordPress zu beschäftigen. Dadurch ist wesentlich mehr Code als Text entstanden und wenn ich zum schreiben kam, ging es meistens um die Entwicklung von Plugins und (dem einen) Theme(s).
Die Themen ab 2007 sind im Prinzip auch die Themen um die es bis heute geht. Wenig bis nichts persönliches, viel Technik, WordPress und noch mehr Open Web. Das ist OK für den Moment, muss aber nicht so bleiben 🙂
Auf die nächsten 20 Jahre! 🎉
Auf dem CloudFest Hackathon im März, hab‘ ich mich ein wenig mit Alain Schlesser über WordPress und Plugin-Entwicklung unterhalten. Alain meinte, dass er, wenn es das Plugin hergibt und es zeitlich möglich ist, immer zuerst eine generische Library bauen und diese dann über ein WordPress-Plugin implementieren würde.
Vor ein paar Tagen hab ich mich an unser Gespräch erinnert, weil ich mich (aus Gründen) wieder intensiver mit dem ActivityPub-Plugin beschäftigt habe. Wir hatten schon vor einem Jahr den Plan, eine ActivityPub-Bibliothek zu verwenden, um uns nicht mit dem Protokoll beschäftigen zu müssen, und uns so voll und ganz auf die WordPress Integration konzentrieren könn(t)en. Wir haben die Idee aber erstmal nicht weiter verfolgt, da die Bibliothek eine Reihe von schwergewichtigen Third-Party-Libs wie Guzzle (HTTP-Client), Monolog (Logger) oder Symfony Cache (Caching) mit sich bringt. Für all diese Funktionen hat WordPress eigene Lösungen und wegen der Interoperabilität mit anderen Plugins, sollte man diese auch nutzen.
Bei der erneuten Evaluierung der ActivityPub-Bibliothek ist mir aufgefallen, dass sich Monolog, durch einen beliebigen PSR-3 kompatiblen Logger ersetzen lässt.
Kurze Erklärung zu PSR:
Eine PHP Standard Recommendation (PSR) ist eine PHP-Spezifikation, welche durch die PHP Framework Interop Group veröffentlicht wird. Ähnlich einem Java Specification Request in Java dient sie der Standardisierung von Programmierkonzepten. Ziel ist es die Interoperabilität von Komponenten zu ermöglichen und eine gemeinsame technische Basis zu schaffen oder bewährte Konzepte für einen guten Programmierstil sowie eine gute Testbarkeit von Komponenten umzusetzen. Verschiedene Frameworks wie z. B. die der TYPO3-Community, Symfony oder Zend implementieren hierbei PSR-Spezifikationen in einem selbst gewählten Umfang.
https://de.wikipedia.org/wiki/PHP_Standard_Recommendation
PSR-3 definiert ein standardisiertes Logger-Interface, welches (in unserem Beispiel) durch Monolog implementiert wird. Beim initialisieren des ActivityPub-Servers, lässt sich Monolog, durch einen alternativen Logger ersetzen, solange dieser auch PSR-3 konform ist.
use ActivityPhp\Server;
// Create a server instance with no log output
$server = new Server([
'logger' => [
'driver' => '\Psr\Log\NullLogger'
],
]);Code-Sprache: PHP (php)
Also hab ich mir überlegt, wie so ein Logger für WordPress aussehen könnte und einen PSR-3 kompatiblen Wrapper gebaut:
namespace WPPSR\Log;
use Psr\Log\AbstractLogger;
class ErrorLogLogger extends AbstractLogger {
public function log( $level, $message, $context = array() ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
error_log(
sprintf(
'%s: %s. Details: %s',
$level,
trim( $message, '.' ),
json_encode( $context )
)
);
}
}
}
}Code-Sprache: PHP (php)
PSR definiert passenderweise auch Interfaces für HTTP-Clients, Request-/Response-Objekte und Caching. Für die Request-Library die in WordPress benutzt wird, gibt es sogar schon ein passendes Issue: https://github.com/WordPress/Requests/issues/320
Leider sind Caching und der HTTP-Client in der ActivityPub-Implementierung noch nicht austauschbar, obwohl beide benutzten Libraries PSR kompatibel sind. Das heißt ich muss zuerst evaluieren, wie viel Arbeit es ist, die ActivityPub-Lib anzupassen, um dann diverse Wrapper für das WordPress Caching und die Request-/Response-Classes zu schreiben…
Bzw. muss ich das wahrscheinlich nicht einmal selbst implementieren, da ich bei weitem nicht der Erste war, der diese Idee hatte:
WordPress tut sich immernoch schwer mit modernem PHP-Dependency-/Plugin-Management. Ersteres ist praktisch nicht vorhanden (wird aber zumindest nicht verhindert) und letzteres basiert immer noch auf einem Prozess in dem SVN eine tragende Rolle spielt. Aber mit PSR(-Wrappern) kann man das Problem schon ganz gut kompensieren 🙂

Eine Leseempfehlung vorweg: „Yes, Comments Are Still Relevant, But We Need a Better System“ von Justin Tadlock auf WPTavern!
Soziale Netzwerke haben die Art wie wir kommunizieren drastisch verändert. Wir reagieren selten mit Text, statt dessen liken, re-tweeten, sharen und faven wir was das Zeug hält. Und wenn wir mit Text reagieren, hat dieser spätestens seit Twitter, einen anderen Stellenwert. Ein Kommentar ist nicht länger ein Stück Text unter einem Artikel, ein Kommentar steht für sich alleine und wird durch die Plattform in den richtigen Kontext gesetzt, abhängig vom Einstiegspunkt des lesenden.


Die IndieWeb Community nennt das einen Reply-Context.
Diese Art der Darstellung und Handhabung von Reaktionen ist auch in dezentralen Netzwerken sehr populär. Mastodon ähnelt sehr, dem von Twitter gekauften Tweetdeck und imitiert auch dessen Darstellung. Die IndieWeb Bewegung geht sogar noch einen Schritt weiter und schafft mit Webmentions eine Möglichkeit über Blog-Posts dezentral zu kommentieren.
Die Kommentar-Funktion von WordPress ist dagegen bald 20 Jahre alt und dementsprechend antiquiert.
Zeit das zu ändern!?!
Ich arbeite seit knapp 15 Jahren daran, WordPress im IndieWeb und Fediverse zu verankern. Das große Problem ist dabei immer wieder die Persistenz und die Darstellung von Reaktionen. Ich habe mir viele Gedanken gemacht, wie man das Problem beheben und WordPress‘ Kommentar System modernisieren könnte, und ende immer an dem Punkt, wo ich versuche die Custom Post Type – Funktionalität für Kommentare nachzubauen.
Aber warum? Wenn ich eh alles nachbauen müsste, wäre es doch viel sinnvoller direkt Post-Types zu benutzen.
register_post_type( 'comment' );Code-Sprache: JavaScript (javascript)
Aktuell bildet WordPress Posts, Pages, Attachments, Revisions, Navigation Menus, Custom CSS und Changesets über Custom Post Types ab… Warum also nicht auch Kommentare und andere Reaktionen?
Durch die Gleichsetzung der Datenstruktur von Posts und Comments, lassen sich diese einheitlich und dadurch einfacher verarbeiten und über z.B. APIs ausgeben. Gerade ActivityPub macht, wie Twitter, keinen Unterschied zwischen Kommentar, Antwort, Like, Boost oder initialem Text.
Die (Custom-)Post Tabelle bietet über post_parent schon jetzt die Möglichkeit komplexe Zusammenhänge wie z.B. auch Threaded-Comments abzubilden. Über den post_status ließen sich außerdem Kommentar-Status sowie eine Spam-Behandlung realisieren und commentmeta kann komplett in postmeta aufgehen.
Neben den klassichen Kommentaren lassen sich aber auch andere Reaktionen umsetzen.
Mit Post-Formats hat WordPress ein interessantes Konstrukt um Posts (über eine Taxonomy) weiter zu klassifizieren. Was für Posts das aside, gallery, link oder video Format ist, könnte für Comments das Like, Share oder Bookmark Format sein.
Themes könnten ihren Support wie folgt definieren:
add_theme_support( 'comment-formats', array( 'like', 'share', 'bookmark' ) );Code-Sprache: PHP (php)
Und Plugins, wie Webmention oder ActicityPub, könnten neue Formate wie folgt registrieren:
register_comment_format( string $comment_format, array|string $args = array() )Code-Sprache: PHP (php)
Technisch spricht also nichts dagegen, Custom Post Types auch für Kommentare zu benutzen, man muss eigentlich nur noch alle Kommentar-Funktionen und -Klassen anpassen und fertig!
…und direkt über wpdb wird sicherlich eh niemand auf die Kommentar-Tabelle zugreifen! 😉
Spaß beiseite… Ich mag die Idee wirklich, hab aber bisher noch keinen ähnlichen Vorschlag im Trac gefunden… Ob das ein Zeichen ist?
Im modernen Sprachgebrauch wird der Begriff [Posse] in übertragenem Sinn […] genutzt, um als grotesk empfundene Vorgänge in Gesellschaft und Politik zu beschreiben.
https://de.wikipedia.org/wiki/Posse
Wer sich (aus gegebenem Anlass) sorgen um Twitter macht, sollte sich mal mit der etwas anderen POSSE befassen.
POSSE is an abbreviation for Publish (on your) Own Site, Syndicate Elsewhere, the practice of posting content on your own site first, then publishing copies or sharing links to third parties (like social media silos) with original post links to provide viewers a path to directly interacting with your content.
https://indieweb.org/POSSE
Installiert euch WordPress! Veröffentlicht Texte, Bilder, Videos und Ideen nicht auf Twitter sondern auf eurer eigenen Seite! Teilt eure Inhalte über Twitter!
Und sollte Twitter „verschwinden“, teilt es über Mastodon! usw, usw…
Schaut euch dazu gerne auch mal Brid.gy an!