web-dev-qa-db-fra.com

Chargement de scripts et de styles à partir d'une fonction de rappel d'une méta-boîte

Cas:

J'ai eu un ensemble de classes qui construisent des champs de formulaire basés sur les données d'un tableau d'entrée. La classe peut créer les types de champs de formulaire suivants:

  • entrée (basique, caché, mot de passe)
  • textarea
  • radio
  • case à cocher
  • sélectionner
  • pipette à couleurs
  • sélecteur de date
  • téléchargement de fichiers

EDIT: La classe utilise wp_register_script/_style & wp_enqueue_script/_style pour charger les scripts et les styles. Les fonctions contenant les actions sont accrochées dans la classe comme suit: add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue' ) );.

Exemple:

(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' );

Problème:

De cette façon, mon appel pour wp_enqueue_script & wp_enqueue_style ne fonctionne pas. Les champs de formulaire sont rendus, mais pas de scripts ni de styles.

Situation et rétrospective du problème:

Jusqu'à présent, je pouvais retracer le problème jusqu'à l'architecture centrale de wordpress:

  • WP ne demande pas ce qui se passe dans la fonction de rappel jusqu'à ce que do_action('add_meta_boxes', $post_type, $post) soit appelé (dans edit-form-advanced.php ).
  • Cet appel a lieu longtemps après que admin-header.php a été appelé (qui contient do_action('admin_enqueue_scripts', $hook_suffix);).
  • Par conséquent, le script et le style ne peuvent pas être chargés (si je ne me trompe pas).

Question:

  1. Comment pourrais-je charger des styles avant que les champs de formulaire de méta-boîte soient appelés?
  2. Comment pourrais-je éviter de répéter sans cesse la même feuille de style - je veux utiliser wp_enqueue_style & wp_register_style?

Je suis ouvert à toutes les réponses, y compris celles qui me forcent à réécrire l'architecture de ma classe.

Remarque: / Je dois utiliser cette classe dans un grand nombre de szenarios différents. Par conséquent, la regrouper pour la fermer avec la fonction add_meta_box n’est pas bonne. Je suis sur le point de créer une couche d'abstraction qui divise l'appel de la méta-boîte et de la partie style/script, mais pourquoi voudrais-je ajouter une autre couche au-dessus d'une fonction principale?

2
kaiser

Votre problème consiste à ajouter les scripts, stylesinsidela classe et, comme l'instance de la classe est créée lorsque le hook add_meta_box est activé, les wp_enqueue_script/style sont déjà terminés.

Une solution pour vous consiste à ajouter les scripts, stylesoutsidela fonction et la classe. Et comme les méta-boîtes sont utilisées uniquement dans les pages de modification, vous pouvez procéder comme suit:

// 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 fait, j’ai écrit une classe meta box pour WP , qui utilise une autre approche. Au lieu d'écrire classe de formulaire pour les champs de formulaire comme vous l'avez fait, ma classe est un wrapper pour les boîtes méta. Si cela vous intéresse, cela vaut la peine de jeter un coup d'œil.

4
Anh Tran

Vous devriez vraiment associer vos scripts à l'action wp_enqueue_scripts et vos styles à l'action wp_print_styles. Dans vos fonctions, vérifiez que vous êtes bien sur la page utilisant vos méta-boîtes avant d’utiliser réellement wp_enqueue_script() ou wp_enqueue_style().

Par exemple, dans l'un de mes plugins, j'ai:

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

Et j'attache ça à init (qui se déclenche juste avant que tous les autres scripts et styles soient mis en file d'attente).

2
EAMann

Dans sa forme actuelle, votre code insère un objet en un genre d’appel de fonction (créer, faire quelque chose, mourir). Un tel usage ne suffira pas si vous voulez que l'objet fasse quelque chose bien avant que cet objet soit créé et détruit.

Au lieu de créer un objet dans le contenu de metabox, je procéderais comme suit:

  1. Crée un objet tôt.
  2. Utilisez la méthode de l'objet pour traiter les scripts.
  3. Utilisez la méthode d'un autre objet comme rappel de la boîte à méta.
1
Rarst