Cómo acceder a ciertas funciones WP dentro de la clase personalizada, en la carpeta de temas

4

Estoy creando un tema personalizado y quiero crear una clase auxiliar para manejar la creación de metaboxes en el panel de administración. He declarado mi clase así:

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

[...]

El problema es que cuando quiero usar el método addMetabox, al escribir \ci\wp\Metaboxes::addMetabox('front_page_slide_settings', 'Slide settings', 'page', 'normal', 'high'); , aparece el siguiente error:

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

Probé varios métodos diferentes de usar add_action dentro de la clase, pero no importa si es una clase estática, singleton con add_action se ejecuta en la instanciación o una clase normal con add_action en el constructor, siempre da como resultado dicho error.

¿Hay alguna manera de hacerlo funcionar? ¿Qué estoy haciendo mal?

    
pregunta NoviQ 13.04.2017 - 01:16

2 respuestas

4

En realidad estás llamando a la función add_meta_box() antes de que esté definida, cuando ejecutas esto directamente:

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

No mencionas dónde lo ejecutas, pero es demasiado temprano o lo ejecutas en el front-end, donde add_meta_box() no está definido.

La función add_meta_box() se define dentro de este archivo:

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

Asegúrate de ejecutar tu fragmento de código problemático después, por ejemplo. dentro de la acción add_meta_boxes , como lo hace dentro de la llamada Metaboxes::init() .

La acción core init , como ejemplo, se dispara antes de que se cargue Template Administration API .

    
respondido por el birgire 13.04.2017 - 12:23
0

Gracias por la ayuda. Entiendo exactamente lo que me perdí.

Simplemente olvidé envolver todas las llamadas al método addMetabox static dentro de una función que está conectada a admin_init . Después de que hice eso, todo funcionó como se esperaba. Ni siquiera necesito enlazar a add_meta_boxes dentro de la clase Metaboxes.

ACTUALIZACIÓN: después de pasar un tiempo descubriendo cómo hacer rápidamente otras cosas como guardar el nuevo meta de publicación, resultó que tratar de simplificar cosas como esa utilizando métodos como esos en realidad los hace más complicados. Agregar metaboxes en el enlace admin_init hace que sea imposible verificar la ID de la publicación editada, ya que en ese momento la variable var no tiene datos. Lección aprendida.

    
respondido por el NoviQ 14.04.2017 - 01:32

Lea otras preguntas en las etiquetas