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:
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' ) );
.
(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' );
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.
Jusqu'à présent, je pouvais retracer le problème jusqu'à l'architecture centrale de wordpress:
do_action('add_meta_boxes', $post_type, $post)
soit appelé (dans edit-form-advanced.php ).do_action('admin_enqueue_scripts', $hook_suffix);
).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?
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.
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).
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: