Intereting Posts
Содержимое страницы WordPress вне WordPress Добавить место под признанным изображением в отдельной записи Скрипт Enqueue в заголовке Страницы с сообщениями, отфильтрованными по категориям Почему перезаписывает $ GLOBALS, убивая the_content ()? Разная разметка HTML для аналогичных меню Исключить комментарий слова от ссылки Создание настраиваемого типа публикации галереи? Поле ввода текстового поля пользовательского поля ввода не будет сохраняться при пустом поле анализировать содержание из статьи в Википедии, заменяя поисковый термин заголовком статьи Как проверить, сохранен ли образ в базе данных почты сайта? (сеть) Как перенаправить постоянную ссылку на черновик сообщения на пользовательскую страницу 404? Путь URL-адреса файла Word неверен Статьи являются текстовыми только в любой категории, а не в HTML Нет свойства first_name или user_firstname в объекте WP_User

Загрузка сценариев и стилей из функции обратного вызова мета-окна

Случай:

Я получил набор классов, которые создают поля формы на основе данных из входного массива. Класс может создавать следующие типы полей формы:

  • вход (основной, скрытый, пароль)
  • TextArea
  • радио
  • флажок
  • Выбрать
  • ColorPicker
  • DatePicker
  • файл загружен

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:

  • WP не ставит под сомнение то, что происходит внутри функции обратного вызова, до do_action('add_meta_boxes', $post_type, $post) пор, пока do_action('add_meta_boxes', $post_type, $post) получит вызов (внутри edit-form-advanced.php ).
  • Этот вызов происходит долго после вызова admin-header.php (который содержит do_action('admin_enqueue_scripts', $hook_suffix); ).
  • Поэтому скрипт и стиль не могут загружаться (если я не ошибаюсь).

Вопрос:

  1. Как я могу загружать стили перед тем, как поля формы мета-окна будут вызваны?
  2. Как я мог избежать повторения одной и той же таблицы стилей снова и снова – я хочу использовать 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 (который запускается перед тем, как все остальные скрипты и стили находятся в очереди).

В текущей форме ваш код заглушает объект в виде вызова функции (создайте, сделайте что-нибудь, умрите). Такое использование не будет выполнено, если вы хотите, чтобы объект делал что-то задолго до того, как этот объект будет создан и уничтожен.

Вместо создания объекта внутри содержимого метабокса я бы сделал следующее:

  1. Создайте объект некоторое время раньше.
  2. Используйте метод объекта для работы со скриптами.
  3. Используйте метод другого объекта в качестве обратного вызова мета-окна.