it-swarm.com.de

So greifen Sie sicher zu WP Funktionen innerhalb der benutzerdefinierten Klasse im Themenordner

Ich erstelle ein benutzerdefiniertes Design und möchte eine Hilfsklasse für die Erstellung von Metaboxen im Admin-Bereich erstellen. Ich habe meine Klasse so deklariert:

namespace ci\wp;

Metaboxes::init();

class Metaboxes {

    private static $instance;
    private static $post;

    private static $metaboxesPath = TEMPLATEPATH . "/config/metaboxes/";

    static function init() {
        global $post;
        self::$post = &$post;
        add_action( 'add_meta_boxes', [ __CLASS__, 'addMetabox' ], 10, 5 );
    }

    // ADD METABOX
    static function addMetabox($id, $title, $post_type, $position, $priority) {
        if (file_exists(self::$metaboxesPath.$id.'.php')) {
            require_once(self::$metaboxesPath.$id.'.php');
            add_meta_box($id, $title, 'do_'.$id, $post_type, $position, $priority);
        }
    }

[...]

Das Problem ist, dass beim Schreiben von \ci\wp\Metaboxes::addMetabox('front_page_slide_settings', 'Slide settings', 'page', 'normal', 'high'); die folgende Fehlermeldung angezeigt wird, wenn ich die Methode addMetabox verwenden möchte:

Fatal error: Uncaught Error: Call to undefined function ci\wp\add_meta_box() in [...]

Ich habe verschiedene Methoden zur Verwendung von add_action in der Klasse ausprobiert, aber egal, ob es sich um eine statische Klasse handelt, ein Singleton mit add_action, der bei der Instantiierung ausgeführt wird, oder eine normale Klasse mit add_action im Konstruktor, dies führt immer zu dem genannten Fehler.

Gibt es eine Möglichkeit, es zum Laufen zu bringen? Was mache ich falsch?

4
NoviQ

Sie rufen die Funktion add_meta_box() auf, bevor sie definiert ist, wenn Sie diese direkt ausführen:

\ci\wp\Metaboxes::addMetabox(
    'front_page_slide_settings', 
    'Slide settings', 
    'page', 
    'normal', 
    'high'
);

Sie erwähnen nicht, wo Sie es ausführen, aber es ist zu früh, oder Sie führen es im Front-End aus, wo add_meta_box() nicht definiert ist.

Die Funktion add_meta_box() ist in dieser Datei definiert:

/** WordPress Template Administration API */
require_once(ABSPATH . 'wp-admin/includes/template.php');

Stellen Sie sicher, dass Sie anschließend Ihr problematisches Snippet ausführen, z. innerhalb der add_meta_boxes-Aktion, wie Sie es im Metaboxes::init()-Aufruf tun.

Die Kernaktion init wird beispielsweise ausgelöst, bevor Template Administration API geladen wird.

4
birgire

Danke für die Hilfe. Ich finde genau heraus, was ich vermisst habe.

Ich habe einfach vergessen, alle Aufrufe der statischen Methode addMetabox in eine Funktion einzubinden, die mit admin_init verknüpft ist. Nachdem ich das getan habe, funktioniert alles wie erwartet. Ich muss mich nicht einmal mit add_meta_boxes in der Metaboxes-Klasse verbinden.


UPDATE: Nachdem ich einige Zeit damit verbracht hatte, herauszufinden, wie man andere Dinge wie das Speichern neuer Post-Metas schnell macht, stellte sich heraus, dass der Versuch, solche Dinge mit solchen Methoden zu vereinfachen, sie tatsächlich komplizierter macht. Das Hinzufügen von Metaboxen am admin_init-Hook macht es unmöglich, die bearbeitete Post-ID zu überprüfen, da die Post-Var zu diesem Zeitpunkt keine Daten enthält. Lektion gelernt.

0
NoviQ