kann register_post_type () sicher vor init aufgerufen werden

Wenn ich register_post_type() vor der init Aktion anrufe, explodiert mein Plugin unter bestimmten Umständen in einem Feuerball? Codex sagt :

register_post_type sollte nur über die Aktion ‘init’ aufgerufen werden. Es wird nicht funktionieren, wenn es vor ‘init’ aufgerufen wird, und Aspekte des neu erstellten oder geänderten Post-Typs werden falsch funktionieren, wenn sie später aufgerufen werden.

Codex sagt auch :

Beachten Sie, dass Sie register_post_type () vor dem admin_menu und nach der Aktion after_setup_theme aufrufen müssen. Ein guter Haken ist der Init-Hook.

Aufgrund dieses Hinweises habe ich meinen CPT immer bei der init Aktion registriert. Das hat immer gut für mich funktioniert, bis heute, als ich ein Problem fand.

Ich habe ein Plugin (noch nicht veröffentlicht), das E-Mails protokolliert. Ich benutze es ausgiebig beim Testen. Es registriert einen CPT, mit dem die E-Mail-Protokolle gespeichert werden. Alles gut bis jetzt. Als ich heute einen Easy Digital Downloads-Shop getestet habe, ist mir aufgefallen, dass ich in debug.log Fehler protokolliert habe, jedes Mal, wenn ich einen neuen E-Mail-Log-Post einfüge. Der Fehler wurde dadurch verursacht, dass get_post_type_object() meinen CPT nicht gefunden hat, da EDD E-Mails vor der init Aktion sendet.

Nachdem ich also vergewissert habe, dass die doco und stacks anderer Verweise einschließlich WPSE übereinstimmen, dass “register_post_type nur über die ‘init’ Aktion aufgerufen werden sollte”, ging ich weiter und änderte mein Plugin so, dass es sich auf plugins_loaded . Beachten Sie, dass diese Aktion der after_theme_setup Aktion vorausgeht, also verletze ich beide obigen Codex-Auszüge.

Bin ich damit einverstanden, oder werde ich unter bestimmten Umständen ein Problem haben?

Übrigens, wenn ich den Inhalt von $wp_post_types auf plugins_loaded , sind bereits alle Standard-WordPress-Post-Typen definiert …

Bearbeiten: OK, ich bin dumm, EDD sendet keine E-Mails vor init , ich musste nur die Priorität meines Hooks erhöhen, um es zu schlagen – jetzt hooking init mit Priorität 1. Aber die Frage steht immer noch …

Solutions Collecting From Web of "kann register_post_type () sicher vor init aufgerufen werden"

Die kurze Antwort ist nein. Für das kanonische Beispiel, warum nur einen Blick auf native Post-Typen. Sie werden zweimal bei jeder Seitenladung registriert:

  1. Ziemlich früh aus Gründen der Rückwärtskompatibilität und Plugins, die möglicherweise erwarten, dass sie existieren.
  2. init da jetzt die Gebietsschema-Dinge tatsächlich geladen sind und die Post-Typ-Definitionen korrekt übersetzt werden können.

So lange Antwort ist – Sie können es zum Laufen bringen, aber Sie sind in einer Welt voller Schmerzen und schlechter performance, um es richtig passieren zu lassen . Tu es einfach nicht. 🙂