Я получил набор классов, которые создают поля формы на основе данных из входного массива. Класс может создавать следующие типы полей формы:
EDIT: класс использует wp_register_script/_style
& wp_enqueue_script/_style
для загрузки скриптов и стилей. Функции, содержащие действия, подключаются внутри класса следующим образом: 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' );
Таким образом, мой вызов для wp_enqueue_script
& wp_enqueue_style
не работает. Я получаю отображаемые поля формы, но не скрипты или стили.
До сих пор я мог отследить проблему до основной архитектуры wordpress:
do_action('add_meta_boxes', $post_type, $post)
пор, пока do_action('add_meta_boxes', $post_type, $post)
получит вызов (внутри edit-form-advanced.php ). do_action('admin_enqueue_scripts', $hook_suffix);
). wp_enqueue_style
& wp_register_style
? Я открыт для любых ответов, включая тех, которые заставляют меня переписывать мою классную архитектуру.
Примечание. Мне нужно использовать этот класс во множестве разных szenarios, поэтому связывать его, чтобы закрыть вместе с функцией add_meta_box
не очень хорошо. Я близок к созданию слоя абстракции, который делит вызов мета-поля и части стиля / скрипта, но почему я хочу добавить еще один слой выше основной функции?
Ваша проблема заключается в добавлении скриптов, стилей внутри класса и потому, что экземпляр класса создается, когда add_meta_box
hook add_meta_box
, в то время wp_enqueue_script/style
уже завершены.
Решение для вас – это добавление скриптов, стилей вне функции и класса. И поскольку мета-поля используются только на страницах редактирования, вы можете сделать следующее:
// 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); }
Фактически, я написал класс мета-поля для WP , который использует другой подход. Вместо того, чтобы писать класс формы для полей формы, как и вы, мой класс является оберткой для мета-ящиков. Если вас это интересует, стоит взглянуть.
Вы действительно должны подключить скрипты к действию wp_enqueue_scripts
и вашим стилям в действие wp_print_styles
. Внутри своих функций выполните проверку, чтобы убедиться, что вы находитесь на странице, используя мета-поля, прежде чем использовать wp_enqueue_script()
или wp_enqueue_style()
.
Например, в одном из моих плагинов у меня есть:
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' ); } }
И я перехватываю это для init
(который запускается перед тем, как все остальные скрипты и стили находятся в очереди).
В текущей форме ваш код заглушает объект в виде вызова функции (создайте, сделайте что-нибудь, умрите). Такое использование не будет выполнено, если вы хотите, чтобы объект делал что-то задолго до того, как этот объект будет создан и уничтожен.
Вместо создания объекта внутри содержимого метабокса я бы сделал следующее: