Intereting Posts
Как использовать переменные из виджетов на других страницах? Получить изображение из Open Graph внешнего URL-адреса и установить его как изображение Создайте папку, если она еще не существует. Каковы теги темы в стиле.css? как создать короткие кодовые слова? Как удалить (0, 0) со страницы форума в bbpress Как выбрать содержимое в текстовом режиме textrea в wp_editor? Расширяет административный пост, вместо того чтобы переписывать его Как передать специальный CSS-класс в виджет li Как создать меню категорий? JavaScript, лучший способ использовать данные из цикла Как настроить мета-поле «Категории», чтобы разрешить только одну категорию? список всех дочерних категорий, которые применяются к текущему сообщению, даже если эти кошки пусты? Добавление пользовательской таксономии в том же меню с двумя настраиваемыми типами сообщений remove_section в плагине

Должны ли третьи стороны использовать $ wp_scripts / $ wp_styles-> add_data?

В классе WP_Dependencies существует метод с именем add_data . Эта функция добавляет данные в сценарии / стили, которые были установлены во время загрузки WordPress. Обычно для этой функции используется добавление условного выражения при добавлении таблиц стилей, предназначенных для разных версий IE. Например, чтобы настроить IE8 и ниже:

 function test_wp_print_styles() { global $wp_styles; wp_enqueue_style( 'test-style', get_template_directory_uri() . '/css/test.css', array(), 1, 'all' ); $wp_styles->add_data( 'test-style', 'conditional', 'lte ie8' ); } add_action( 'wp_print_styles', 'test_wp_print_styles' ); 

Это будет выглядеть так:

 <!--[if lte ie8]> <link rel='stylesheet' id='test-style-css' href='http://trunkosaurus.dev/wp-content/themes/twentyeleven/css/test.css?ver=1' type='text/css' media='all' /> <![endif]--> 

Когда я просматриваю Core, я вижу несколько мест, где используется этот метод:

  • WP_Styles->add_inline_style() : добавляет встроенный стиль после ссылочной таблицы стилей (выполняется через WP_Styles->print_inline_style() )

  • WP_Scripts->localize() : добавляет json-кодированный объект (обернутый более «общедоступной» wp_localize_script() )

  • wp_plupload_default_settings() : добавляет json-кодированный объект (созданный из многомерного массива) для сценария wp-plupload (обратите внимание, что это ожидается в версии 3.4)

  • При регистрации / вставка сценариев и стилей Добавление данных для сценариев по умолчанию ( wp-includes/script-loader.php )

Из чтения методов использования метода он, похоже, не имеет конкретного варианта использования. В wp_plupload_default_settings , похоже, допускается произвольная инжекция данных. В wp_register_script он используется для разграничения между сценариями верхнего колонтитула и нижнего колонтитула. В add_inline_style он используется для обозначения встроенного стиля, который должен быть добавлен после того, как указанная таблица стилей будет выставлена ​​в очередь.

Отличное использование этой функции было бы чем-то вроде следующего кода, в котором вы закладываете внешний скрипт, но вам нужно отправить ему некоторые конфиги vars, некоторые из которых поступают из БД:

 function zdt_enqueue_add_this() { global $wp_scripts; wp_enqueue_script( 'zdt-add-this', 'http://s7.addthis.com/js/250/addthis_widget.js#pubid=myidhere' ); // Contrived example of database call to get a twitter handle stored in the db $author_twitter_handle = zdt_get_twitter_handle(); $js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n"; $js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };'; $wp_scripts->add_data( 'zdt-add-this', 'data', $js ); } add_action( 'wp_enqueue_scripts', 'zdt_enqueue_add_this' ); 

Это приведет к:

 <script type='text/javascript'> /* <![CDATA[ */ var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } }; var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" }; /* ]]> */ </script> <script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script> 

Обратите внимание, что это невозможно с помощью wp_localize_script потому что объект addthis_share обладает свойствами внутри свойств (ранее я писал об этом довольно хакерским образом ).

EDIT: Я был неправ, заявив об этом. wp_localize_script обрабатывает многомерные массивы.

Этот метод работает очень хорошо по следующим причинам:

  1. Он позволяет прикрепить данные к дескриптору скрипта, чтобы он всегда был установлен в очередь скриптом. Кроме того, это будет разумно об deenqueueing сценарий, порядок скриптов и размещение сценариев.
  2. Это позволяет использовать PHP для отправки vars в JS.
  3. Кажется более организованным, чем использование wp_print_styles для распечатки какого-либо произвольного скрипта, действие которого позже будет wp_print_styles по wp_print_styles .

Есть некоторые вещи, которые не работают, как ожидалось, что беспокоит меня об этом методе. Одна из таких проблем заключается в том, что если вы используете wp_localize_script вместе с $wp_scripts->add_data , вы можете получить неожиданные результаты. Например:

 // Contrived example of database call to get a twitter handle stored in the db $author_twitter_handle = zdt_get_twitter_handle(); $js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n"; $js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };'; $wp_scripts->add_data( 'zdt-add-this', 'data', $js ); wp_localize_script( 'zdt-add-this', 'addthis_share', array( 'var' => 'val' ) ); 

Производит:

 <script type='text/javascript'> /* <![CDATA[ */ var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } }; var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" }; var addthis_share = {"var":"val"}; /* ]]> */ </script> <script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script> 

В то время как этот скрипт:

 // Contrived example of database call to get a twitter handle stored in the db $author_twitter_handle = zdt_get_twitter_handle(); $js = "var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @" . sanitize_key( $author_twitter_handle ) . "' } };\n"; $js .= 'var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" };'; wp_localize_script( 'zdt-add-this', 'addthis_share', array( 'var' => 'val' ) ); $wp_scripts->add_data( 'zdt-add-this', 'data', $js ); 

Производит:

 <script type='text/javascript'> /* <![CDATA[ */ var addthis_share = { templates : { twitter: '{{title}} {{url}} (by @tollmanz' } }; var addthis_config = { ui_header_color: "#FFFFFF", ui_header_background: "#FA9628", ui_cobrand: "My Site" }; /* ]]> */ </script> <script type='text/javascript' src='http://s7.addthis.com/js/250/addthis_widget.js?ver=3.4-beta4-20731#pubid=myidhere'></script> 

Ключ data , заданный wp_localize_script в конечном итоге перезаписывается вызовом $wp_scripts->add_data , тогда как если вы дважды вызываете wp_localize_script для одного и того же скрипта, строка будет правильно конкатенатирована.

Хотя все это очень удобный способ печати произвольного скрипта для использования с установленным сценарием, он заставляет меня думать, что он не должен широко использоваться из-за потенциальных конфликтов. Я, конечно, вижу аргумент для использования этого в личных проектах, где код не будет использоваться в плагинах / темах сообщества.

Я также посмотрел на Core Trac, чтобы узнать, есть ли какие-либо подсказки относительно цели этой функции. Я нашел один билет (http://core.trac.wordpress.org/ticket/11520) (эпический в этом), который исследовал другие способы добавления произвольной JS. Таким образом, кажется, что есть интерес к созданию лучшего способа добавить произвольное JS, но не обязательно точно, если add_data должен быть частью процесса.

Мой главный вопрос: должны ли разработчики использовать эту функцию? В некоторых случаях (например, wp_register_script ) это похоже на «частную» функцию, которую wp_register_script стороны не должны использовать; однако в других случаях (например, wp_plupload_default_settings ) представляется вполне разумным способом вставить произвольный JS до установленного сценария.

Я не думаю, что есть «правильный» ответ на этот вопрос, но хотелось бы услышать мнение других разработчиков. Я также предполагаю, что в этой головоломке есть части, которые я полностью забыл и хотел бы услышать, что другие могут сказать об этом.

Эта функция добавляет данные в сценарии / стили, которые были установлены во время загрузки WordPress.

На самом деле, нет. Он добавляет данные в скрипты / стили, которые были registered .

Ключ данных, заданный wp_localize_script в конечном итоге перезаписывается вызовом $wp_scripts->add_data , тогда как если вы дважды вызываете wp_localize_script для одного и того же скрипта, строка будет правильно конкатенатирована.

Правильно. Они оба называют базовый (не доступный, внутренний) API, поэтому он перезаписывается (как вы сказали). Это происходит, когда он вызывает $this->get_data( $handle, 'data' ); ,

Вопрос

Мой главный вопрос: должны ли разработчики использовать эту функцию?

Ответ

Просто сказал: Да, когда у вас нет другого шанса сделать то, что вам нужно.

Другой пример: проверьте, зарегистрирован ли скрипт (например, json2/jquery ) и переместите его в нижний колонтитул ( extra['group'] проверьте extra['group'] ).

 // Move scripts to the footer - in case it isn't already there if ( ! $wp_scripts->get_data( 'json2', 'group' ) ) $wp_scripts->add_data( 'json2', 'group', 1 ); if ( ! $wp_scripts->get_data( 'jquery', 'group' ) ) $wp_scripts->add_data( 'jquery', 'group', 1 ); 

Примечание: Этот ↑ работает только для данных, поданных extra !

Дополнительные замечания

Counter-Question: Вы когда-нибудь пытались добавить зависимости к скриптам, зарегистрированным ядром? Например: Попробуйте добавить JSON2 мере необходимости в папку jQuery . Это невозможно без перехвата global $wp_scripts :

 global $wp_scripts; $scripts = array( 'jquery' => array( 'json2' ) ,'jquery-form' => array( 'json2' ) ); foreach ( $scripts as $handle => $deps ) { // Ugly hack: Intercept the global to force the "natural"/needed order: JSON2 » jQuery $deps_default =& $wp_scripts->registered[ $handle ]->deps; $wp_scripts->registered[ $handle ]->deps = array_merge( $deps_default, $deps ); } 

Существует масса вещей, которые класс не может сделать. Поэтому, используя что-то вроде ->add_data() является полностью действительным. Просто используйте то, что у вас есть, так как это еще лучше, чем жить в отсутствии основных классов.

В WP 3.3 возникла большая дискуссия о том, как обрабатывать данные сценария:

http://core.trac.wordpress.org/ticket/11520

Обратите внимание, что теперь вы можете передать вложенные массивы в wp_localize_data() :

 wp_localize_script( 'jquery', 'jQueryL10n', array( 'foo' => array( 'bar' => array( 'apple', 'orange' ) ), ) ); 

Таким образом, я бы использовал add_data() если бы не было API более высокого уровня для того, что мне нужно было сделать, при том понимании, что его поведение может измениться в некоторых случаях с краем, например, когда задействована конкатенация.