Como acessar certas funções do WP dentro da classe customizada, na pasta do tema

4

Estou criando um tema personalizado e quero criar uma classe auxiliar para lidar com a criação de metaboxes no painel de administração. Eu tenho minha turma declarada assim:

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

[...]

O problema é que, quando quero usar o método addMetabox, escrevendo \ci\wp\Metaboxes::addMetabox('front_page_slide_settings', 'Slide settings', 'page', 'normal', 'high'); , recebo o seguinte erro:

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

Eu tentei vários métodos diferentes de usar add_action dentro da classe, mas não importa se é uma classe estática, singleton com add_action executado na instanciação ou uma classe normal com add_action no construtor, sempre resulta no dito erro.

Existe uma maneira de fazer isso funcionar? O que estou fazendo errado?

    
por NoviQ 13.04.2017 / 01:16

2 respostas

4

Você está realmente chamando a função add_meta_box() antes de ser definida, quando você executa isso diretamente:

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

Você não menciona onde você o executa, mas é muito cedo ou você o executa no front-end, onde add_meta_box() não está definido.

A função add_meta_box() é definida dentro deste arquivo:

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

Certifique-se de executar seu snippet problemático depois, por exemplo dentro da ação add_meta_boxes , como você faz na chamada Metaboxes::init() .

A ação init do núcleo, como um exemplo, é acionada antes que a API de administração de modelos seja carregada.

    
por birgire 13.04.2017 / 12:23
0

Obrigado pela ajuda. Eu descubro exatamente o que senti falta.

Eu simplesmente esqueci de agrupar todas as chamadas para o método addMetabox static dentro de uma função que é conectada a admin_init . Depois que fiz isso, tudo funciona como esperado. Eu nem preciso ligar para add_meta_boxes dentro da classe Metaboxes.

ATUALIZAÇÃO: depois de passar algum tempo descobrindo como fazer rapidamente outras coisas, como salvar novas postagens, descobriu-se que tentar simplificar coisas desse tipo usando métodos como esses, na verdade, os torna mais complicados. Adicionar metaboxes no gancho admin_init torna impossível verificar o ID do post editado, pois nesse momento o post var não possui dados. Lição aprendida.

    
por NoviQ 14.04.2017 / 01:32