Cargando scripts y estilos desde una función de devolución de llamada de meta box

2

Caso:

Obtuve un conjunto de clases que construyen campos de formulario basados en datos de una matriz de entrada. La clase puede construir los siguientes tipos de campos de formulario:

  • entrada (básica, oculta, contraseña)
  • textarea
  • radio
  • casilla de verificación
  • seleccionar
  • selector de colores
  • selector de fecha
  • carga de archivos

EDIT: La clase usa wp_register_script/_style & wp_enqueue_script/_style para cargar los scripts & estilos Las funciones que contienen las acciones están enlazadas dentro de la clase como esta: add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue' ) ); .

Ejemplo:

(Inside functions.php )

// meta box callback function
function test_meta_box_cb()
{   
    $input_args = array(
         'type'         => 'color'
        ,'id'           => 'color-id'
        ,'label'        => 'Input Colorpicker Label'
        ,'opt_name'     => 'abc_xyz'
        ,'value'        => '009ee0'
     );
    new FormClass( $input_args, true );
}
// add the meta box
function add_test_meta_box()
{
    add_meta_box( 'test_box', __('TestBox'), 'test_meta_box_cb', 'post', 'advanced', 'high' );
}
add_action( 'add_meta_boxes', 'add_test_meta_box' );

Problema:

De esta manera, mi llamada para wp_enqueue_script & wp_enqueue_style no funciona. Obtengo los campos de formulario representados, pero no hay scripts ni estilos.

Situación & Retroceder el problema:

Hasta ahora, he podido localizar el problema en la arquitectura del núcleo de wordpress:

  • WP no cuestiona qué sucede dentro de la función de devolución de llamada hasta que se llama a do_action('add_meta_boxes', $post_type, $post) get (dentro de edit-form-advanced.php ).
  • Esa llamada ocurre mucho después de que se haya llamado a admin-header.php (que contiene do_action('admin_enqueue_scripts', $hook_suffix); ).
  • Por lo tanto, el script & el estilo no se puede cargar (si no me equivoco).

Pregunta:

  1. ¿Cómo podría cargar estilos antes de que se llamen los campos de formulario de meta box?
  2. ¿Cómo podría evitar repetir la misma hoja de estilo una y otra vez? Quiero usar wp_enqueue_style & wp_register_style ?

Estoy abierto a cualquier respuesta, incluidas las que me obligan a volver a escribir la arquitectura de mi clase.

Nota: Necesito usar esta clase en muchos szenarios diferentes, por lo que agruparla para cerrarla con la función add_meta_box no es buena. Estoy cerca de hacer una capa de abstracción que divide la llamada para el meta box y la parte de estilo / script, pero ¿por qué querría agregar otra capa por encima de una función principal?

    
pregunta kaiser 09.06.2011 - 18:50

3 respuestas

4

Su problema es agregar los scripts, los estilos dentro de la clase, y como la instancia de la clase se crea cuando se activa el gancho add_meta_box , en ese momento ya se han completado wp_enqueue_script/style .

Una solución para usted es agregar los scripts, los estilos fuera de la función y la clase. Y como los cuadros de meta se usan solo en las páginas de edición, puede hacer lo siguiente:

// the editing pages are actually post.php and post-new.php
add_action('admin_print_styles-post.php', 'custom_js_css');
add_action('admin_print_styles-post-new.php', 'custom_js_css');

function custom_js_css() {
    wp_enqueue_style('your-meta-box', $base_url . '/meta-box.css');
    wp_enqueue_script('your-meta-box', $base_url . '/meta-box.js', array('jquery'), null, true);
}

En realidad, escribí una clase de meta box para WP , que utiliza otro enfoque. En lugar de escribir la clase de formulario para los campos de formulario como lo hizo, mi clase es una envoltura para las meta cajas. Si te interesa, vale la pena echarle un vistazo.

    
respondido por el Anh Tran 10.06.2011 - 15:55
2

Realmente deberías conectar tus scripts a la acción wp_enqueue_scripts y tus estilos a la acción wp_print_styles . Dentro de sus funciones, haga una comprobación para asegurarse de que está en la página usando sus meta box antes de usar realmente wp_enqueue_script() o wp_enqueue_style() .

Por ejemplo, en uno de mis complementos tengo:

public static function enqueue_scripts_and_styles() {
    if( is_admin() ) {
        wp_enqueue_script( 'media-upload' );
        wp_enqueue_script( 'thickbox' );
        wp_enqueue_style( 'thickbox' );
    } else {
        wp_enqueue_style( 'wp-publication-archive-frontend', WP_PUB_ARCH_INC_URL . '/front-end.css', '', '2.0', 'all' );
    }
}

Y engancho eso a init (que se activa justo antes de que todos los demás scripts y estilos se pongan en cola).

    
respondido por el EAMann 09.06.2011 - 19:25
1

En la forma actual, su código reduce el objeto al tipo de llamada de función (ser creado, hacer algo, morir). Dicho uso no servirá si desea que el objeto haga algo mucho antes de que ese objeto se cree y se destruya.

En lugar de crear un objeto dentro del contenido de metabox, haría lo siguiente:

  1. Crea el objeto un poco antes.
  2. Utilice el método de objeto para tratar con scripts.
  3. Use el método de otro objeto como devolución de llamada de meta caja.
respondido por el Rarst 12.06.2011 - 20:38

Lea otras preguntas en las etiquetas