Comment accéder à certaines fonctions de WP dans une classe personnalisée, dans le dossier du thème

4

Je construis un thème personnalisé et je souhaite créer une classe d'assistance pour gérer la création de métaboxes dans le panneau d'administration. Je fais déclarer ma classe 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'); , j'obtiens le message d'erreur suivant:

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

J’ai essayé différentes méthodes d’utilisation de add_action dans la classe, mais qu’il s’agisse d’une classe statique, singleton avec add_action exécuté lors de l’instanciation ou d’une classe normale avec add_action dans le constructeur, le résultat est toujours la même erreur.

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

    
posée NoviQ 13.04.2017 - 01:16

2 réponses

4

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 précisez pas où vous l'exécutez, mais il 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 principale init , par exemple, se déclenche avant que l'API d'administration de modèles ne soit chargée.

    
réponse donnée birgire 13.04.2017 - 12:23
0

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

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

MISE À JOUR: après avoir passé un certain temps à trouver comment créer rapidement des éléments tels que la sauvegarde de nouvelles méta-publications, il s’est avéré qu’essayer de simplifier des éléments tels que celui-ci en les rendant plus compliqués encore. L'ajout de métaboxes sur le hook 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.

    
réponse donnée NoviQ 14.04.2017 - 01:32

Lire d'autres questions sur les étiquettes