Zurückgehalten
Dein WordPress-Plugin wird zurückgehalten: was jeder Ablehnungsgrund wirklich bedeutet
Die E-Mail des Review-Teams ist absichtlich kurz und vage. Hier steht, was jeder Grund tatsächlich bedeutet, was ihn auslöst und was wirklich wieder freigibt.
Du hast ein Plugin bei wordpress.org eingereicht. Zwei Wochen später kommt eine E-Mail von plugins@wordpress.org: dein Plugin wurde aus den folgenden Gründen zurückgehalten, gefolgt von drei oder vier kurzen Absätzen, die klingen, als erklärten sie sich von selbst — und das tun sie nicht.
Ich habe diese E-Mail bekommen. Zweimal, zum selben Plugin, aus zwei verschiedenen Gründen. Was folgt, ist die tatsächliche Bedeutung jedes Grundes — einschließlich der zwei Dinge, die ich falsch gemacht und mit Wochen Wartezeit bezahlt habe.
Hake nicht nach
Ihre E-Mail sagt es, und es stimmt: Statusanfragen bremsen die Warteschlange. Ein Review dauert eine bis sechs Wochen. Es gibt keine Beschleunigung.
Diskutiere nicht
Das Review-Team ist kein Support, mit dem man verhandelt. Jede Minute, in der du erklärst, warum dein Fall anders ist, fehlt beim Korrigieren.
Füge die erhaltene E-Mail ein.
Das Review-Team schreibt auf Englisch, egal welche Sprache du sprichst. Füge ihre Nachricht ein: diese Seite sagt dir, welcher der sieben Gründe dich wirklich betrifft — und was jeder von dir verlangt.
Läuft vollständig in deinem Browser. Nichts wird irgendwohin gesendet, nichts gespeichert, dahinter steht kein Server.
Zuerst: wie das Review wirklich abläuft
- 01
Sie prüfen jedes Mal alles neu
Sie vergleichen deine erneute Einreichung nicht mit der vorigen. Ein beim ersten Mal nicht genanntes Problem kann im zweiten Durchgang auftauchen — und ein ausführliches Changelog in deiner Antwort ist verlorene Mühe.
- 02
Sie lesen den Quellcode
Nicht nur das Readme, nicht nur die Header. Eine Prüfung an eine unauffälligere Stelle zu schieben oder eine Funktion umzubenennen funktioniert nicht und macht aus einem technischen Einwand ein Vertrauensproblem.
- 03
Ihre E-Mail ist absichtlich knapp
Sie bearbeiten eine riesige Warteschlange mit Freiwilligen. Jeder Nebensatz zählt — lies ihre E-Mail deshalb als eigenen Durchgang, Satz für Satz, wenn du glaubst, fertig zu sein.
Die sieben Gründe
Wähle den, der zu deiner E-Mail passt. Jede Karte führt zu dem, was ihn auslöst, und zu dem, was durchkommt.
Guideline 5, die „Trialware“
Plugins dürfen keine Funktionen begrenzen, die vollständig auf der Installation des Nutzers laufen.
Was ihn auslöst
- Eine Funktion, die vollständig auf dem Server des Nutzers läuft, künstlich gedeckelt, mit einer Bezahlstufe zum Freischalten
- Der Lehrbuchfall: ein Modus „eigener API-Schlüssel“, begrenzt auf N Aufrufe pro Monat — der Nutzer stellt den Schlüssel, der Nutzer zahlt den Anbieter, die Berechnung kostet dich nichts
- Was nicht das Problem ist: Geld zu verlangen ist erlaubt, eine Pro-Version zu haben ist erlaubt
Was durchkommt
- Die Begrenzung von allem entfernen, was lokal läuft
- Die Funktion auf eigene Kosten serverseitig verlagern — dann spiegelt die Grenze echte Ausgaben, und Guideline 6 erlaubt das ausdrücklich
- Support, Updates oder einen gehosteten Dienst verkaufen — alles außer dem Freischalten von Code, der bereits beim Nutzer läuft
Was tatsächlich funktioniert hat, und mich überraschte
Meine erste Korrektur behielt den lokalen Modus und entfernte nur dessen Deckel, neben einem neuen verwalteten Dienst. Das war konform. Es war auch schwer zu erklären, weil ein Reviewer zwei Codepfade bewerten und mir glauben musste, für welchen die Preise galten.
Die Version, die durchkam, entfernte den lokalen Modus vollständig. Wenn es keinen lokalen Code gibt, greift Guideline 5 gar nicht. Eine einfache Konformitätslage schlägt eine verteidigungsfähige.
Größenordnung: das ist kein Patch. Für mich hieß es, einen ganzen Modus zu löschen, einen Cloudflare Worker mit meinem eigenen API-Schlüssel aufzusetzen, Lizenz-Webhooks mit Signaturprüfung anzubinden, Kontingente pro Installation zu ergänzen und den gesamten Generierungspfad neu zu schreiben. Die Antwort zu kennen dauerte eine Stunde. Sie auszuliefern Tage.
Namens- und Markenkollision
nicht nur im Namen — dazu gehören … die URLs dieses Plugins
Was ihn auslöst
- Der angezeigte Name, der Slug, die Text Domain, der Plugin URI, jeder Link in deiner Admin-Oberfläche, das Readme, der Contributor-Benutzername und die Domain selbst
- Ein Konflikt außerhalb von WordPress: fachfremde Technologieprojekte, GitHub, npm, SaaS-Produkte, Markenregister
- Ein Ersatzname, der nachweislich nicht deiner ist — die Erlaubnis des anderen Inhabers löst nichts
Was durchkommt
- Ein rein beschreibender Name kann mit niemandes Marke kollidieren
- Am sichersten: die beschreibende Hälfte ihres eigenen Vorschlags nehmen und das Kürzel weglassen — sie haben ihn geschrieben, schwerlich nennen sie ihn irreführend
- Schreib deinen Ausweichnamen in dieselbe E-Mail, sonst kaufst du dir eine weitere Runde von einer bis sechs Wochen
- Prüfen, ob ein Slug frei ist: api.wordpress.org/plugins/info/1.2/?action=plugin_information&request[slug]=DEIN-SLUG liefert „Plugin not found.“, wenn er verfügbar ist
Drei Umbenennungen, die ein für sauber erklärtes grep überlebt haben
Der Name, von einem HTML-Tag zerteilt. Mein Website-Logo stand als Plug<span class="dot">Forge</span>. Keine Suche nach dem vollen Namen findet das — und es war das sichtbarste Element auf jeder Seite.
Ein noch älterer Slug. Dutzende Links zeigten weiter auf den ersten Namen des Plugins, zwei Umbenennungen zuvor aufgegeben, darunter der Haupt-Button. Suche nach jedem toten Namen, nicht nur nach dem letzten.
Was über das Netz hinausgeht. Ein Hintergrund-Worker sendete den alten Namen im User-Agent an jede Drittseite, die er ansprach. Auf dem Bildschirm unsichtbar, für die empfangenden Server völlig real.
Die Contributors-Zeile
Was ihn auslöst
- Der Inhaber des einreichenden wordpress.org-Kontos steht nicht in der Contributors:-Zeile des Readme
- Wird oft gerade deshalb übersehen, weil die Zeile bereits andere Namen enthält — einen Framework-Autor, ein Abrechnungs-SDK — und daher nicht leer wirkt
Was durchkommt
- Trage das Kürzel des einreichenden Kontos in Contributors: ein
- Wenn du zugleich eine Markenfrage löst, prüfe diese Zeile: ein Contributor-Kürzel auf Basis des abgelehnten Namens widerspricht der ganzen Umbenennung
Kaputter Plugin URI
Was ihn auslöst
- Die URL liefert einen 404 — technische Korrektur
- Die URL enthält weiterhin den kollidierenden Namen — das ist ein Markenproblem, siehe Grund 02
- Die URL zeigt auf die Startseite deiner Agentur statt auf genau dieses Plugin
Was durchkommt
- Prüfe sie live, nicht in der Datei: eine im Quellcode korrigierte, aber nie veröffentlichte URL bleibt ein Ablehnungsgrund
- Öffne vor deiner Antwort tatsächlich jede URL, die deine Einreichung enthält
Nicht dokumentierte externe Dienste
Was ihn auslöst
- Ein ausgehender Aufruf, der nicht in einem External-Services-Abschnitt des Readme steht: was gesendet wird, wann und an welchen Anbieter
- Eine Beschreibung, die nicht mehr zum eingereichten Code passt — schlimmer als gar keine, weil sie wie Verschleierung wirkt und nicht wie ein Versehen
Was durchkommt
- Schreibe diesen Abschnitt zuletzt, wenn deine Architektur sich nicht mehr bewegt
- Prüfe, dass die von dort verlinkte Datenschutzerklärung dasselbe sagt
- Benenne jeden Endpunkt, den das Plugin wirklich aufruft, auf der Domain, die es wirklich aufruft
Die, die mir fast durchgerutscht wäre
Meine Datenschutzerklärung sagte noch, das Plugin sende die URL eines Bildes, lange nachdem der Code auf den Versand des Bildes selbst umgestellt war. Zwei offizielle Dokumente, die sich darüber widersprechen, was den Server des Nutzers verlässt, sind genau die Art Abweichung, für die es diesen Abschnitt gibt. Ich fand es eine Stunde vor der erneuten Einreichung, in einem letzten Durchgang, als alles andere schon für sauber erklärt war.
Ein Secret im öffentlichen ZIP ausgeliefert
Was ihn auslöst
- Manche Lizenz-SDKs schreiben ein Secret im Klartext in deine Hauptdatei — der erzeugte Code sagt das manchmal selbst, in einem Kommentar
- Ein von Hand gepacktes ZIP statt eines mit dem Build-Werkzeug des SDK, das das Secret automatisch entfernt
Was durchkommt
- Wenn du dein Archiv selbst baust: entpacken und greppen, bevor du hochlädst
- Zehn Sekunden Prüfung gegen einen Fehler, der nach der Veröffentlichung endgültig ist
„Diese Kategorie ist überfüllt“
Was ihn auslöst
- Eine Anmerkung, deine Kategorie sei gesättigt — das ist kein Konformitätspunkt und blockiert die Freigabe für sich genommen nicht
Was durchkommt
- Antworte mit einem überprüfbaren technischen Unterschied, nicht mit einer Marketingaussage
- Widerstehe dem „besser als X“: es ist nicht überprüfbar, und ein Review-Team, das es liest, traut dem Rest deiner Einreichung weniger
Wie du antwortest
Ihre Anweisung lohnt sich wörtlich zu befolgen: fasse dich kurz und liste deine Änderungen nicht auf. Sie prüfen alles von vorn, ein Changelog ist also nur Rauschen.
- Die Bestätigung dessen, was sich geändert hat, in ein bis zwei Sätzen — die Position, nicht das Diff
- Bei einer Umbenennung eine ausdrückliche Bitte, den neuen Slug zu reservieren — von allein tun sie das nicht
- Deine Ausweichoption, falls Zweifel bleiben
Lade die korrigierte Fassung über die Seite „Add your plugin“ hoch, angemeldet mit dem einreichenden Konto — nicht als E-Mail-Anhang. Eine Seite auf make.wordpress.org von 2015 sagt etwas anderes; sie ist veraltet. Die „Text Domain“-Warnung beim Hochladen ist normal, bis dein Slug reserviert ist.
Die Liste, die ich vor jeder erneuten Einreichung durchgehe
Jede Zeile stammt daher, dass ich eine davon falsch gemacht habe. Hake sie ab — dein Browser merkt es sich.
Die letzte Zeile zählte am meisten: dreizehn Lesedurchgänge über meinen eigenen Code übersahen drei blockierende Fehler, und jeder zeigte sich in den ersten fünf Minuten echter Ausführung. Man liest Code, um zu finden, was falsch ist. Man führt ihn aus, um zu finden, was fehlt.
Was das wirklich kostet
Für eine reine Konformitätskorrektur — Dokumentation, Header, Contributors, URLs — sind ein paar Stunden realistisch.
Bei Guideline 5 sei ehrlich zu dir selbst: du änderst das Geschäftsmodell deines Produkts und baust vermutlich Server-Infrastruktur, die du vorher nicht hattest. Zwischen meiner ersten Ablehnung und der letzten erneuten Einreichung lagen neun Tage, zwei abgelehnte Namen, ein Cloudflare Worker, eine Webhook-Anbindung und drei Fehler, die erst auftauchten, als ich aufhörte zu lesen und anfing auszuführen.
Die Richtlinien sind nicht willkürlich, und wenn man das Muster dahinter sieht, sind sie konsistent: das Verzeichnis beherbergt freie Software, die funktioniert, und alles wird daran gemessen.
Ich mache das für andere Plugin-Autoren: jeder Punkt der Ablehnungs-E-Mail bearbeitet, die noch nicht genannten Richtlinien mitgeprüft, und die Antwort geschrieben, die du nur noch absendest.