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.

Sofort gelesen

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

  1. 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.

  2. 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.

  3. 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.

01 Guideline 5 — Trialware Du hast etwas gedeckelt, das auf dem Server des Nutzers läuft. 02 Name und Marke Der Name kollidiert — und der Name ist nicht alles, was sie prüfen. 03 Die Contributors-Zeile Dein eigenes Konto fehlt im Readme. 04 Kaputter Plugin URI Die URL im Header muss heute öffnen, und zwar zu diesem Plugin. 05 Externe Dienste Jeder ausgehende Aufruf muss dokumentiert sein und zum Code passen. 06 Ein Secret im ZIP Dein Lizenz-SDK hat einen Schlüssel ins öffentliche Archiv geschrieben. 07 Überfüllte Kategorie Eine Anmerkung, kein Konformitätspunkt. Antworte mit Fakten.
01

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.

02

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.

03

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
04

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
05

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.

06

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
07

„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.

  1. Die Bestätigung dessen, was sich geändert hat, in ein bis zwei Sätzen — die Position, nicht das Diff
  2. Bei einer Umbenennung eine ausdrückliche Bitte, den neuen Slug zu reservieren — von allein tun sie das nicht
  3. Deine Ausweichoption, falls Zweifel bleiben
Zur Mechanik

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.

Wenn dein Plugin gerade zurückgehalten wird

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.

Was dazugehört