web-dev-qa-db-fra.com

Comment accéder à certaines WP fonctions dans une classe personnalisée, dans un dossier de thèmes

Je construis un thème personnalisé et je veux créer une classe d'assistance pour gérer la création de métaboxes dans le panneau d'administration. J'ai ma classe déclarée comme ceci:

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);
        }
    }

[...]

Le problème est que lorsque je veux utiliser la méthode addMetabox, en écrivant \ci\wp\Metaboxes::addMetabox('front_page_slide_settings', 'Slide settings', 'page', 'normal', 'high');, l'erreur suivante apparaît:

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

J'ai essayé plusieurs méthodes différentes pour utiliser add_action dans la classe, mais qu'il s'agisse d'une classe statique, d'un singleton avec add_action exécuté à l'instanciation ou d'une classe normale avec add_action dans le constructeur, l'erreur en question est toujours générée.

Y a-t-il un moyen de le faire fonctionner? Qu'est-ce que je fais mal?

4
NoviQ

En fait, vous appelez la fonction add_meta_box() avant sa définition, lorsque vous l'exécutez directement:

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

Vous ne mentionnez pas où vous l'exécutez, mais c'est trop tôt ou vous l'exécutez en mode frontal, où add_meta_box() n'est pas défini.

La fonction add_meta_box() est définie dans ce fichier:

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

Veillez à exécuter votre extrait de code par la suite, par exemple. dans l'action add_meta_boxes, comme vous le faites dans l'appel Metaboxes::init().

L'action core init, à titre d'exemple, se déclenche avant que API d'administration de modèles ne soit chargé.

4
birgire

Merci pour l'aide. Je découvre exactement ce que j'ai manqué.

J'ai simplement oublié d'encapsuler tous les appels de la méthode statique addMetabox dans une fonction liée à admin_init. Après cela, tout fonctionne comme prévu. Je n'ai même pas besoin de raccrocher à add_meta_boxes dans la classe Metaboxes.


MISE À JOUR: après avoir passé du temps à chercher comment créer rapidement des choses telles que la sauvegarde de nouvelles méta-publications, il s’est avéré que tenter de simplifier des choses comme celle-là en utilisant des méthodes comme celles-ci les rend plus compliquées encore. L'ajout de métaboxes sur le crochet admin_init rend impossible la vérification de l'ID de publication modifié car, à ce moment, la variable de publication ne contient aucune donnée. Leçon apprise.

0
NoviQ