wp enqueue встроенный скрипт из-за зависимостей

Есть ли способ использовать wp_enqueue_script () для встроенных скриптов?

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

Кроме того, это встроенный скрипт, потому что я передаю переменные php в javascript (например, путь к теме и т. д.)

Спасибо заранее.

35 голосов | спросил chrisjlee 4 AM00000010000002331 2011, 01:11:23

6 ответов


33

Ну, у вас есть wp_localize_script (), но это только для передачи данных.

В противном случае вы можете сделать это:

  function print_my_inline_script () {
  if (wp_script_is ('some-script-handle', 'done')) {
? & GT;
<script type = "text /javascript">
//здесь идет код js
& Lt; /сценарий & GT;
& Lt;? PHP
  }
}
add_action ('wp_footer', 'print_my_inline_script');
 

Идея заключается в том, что вы не должны полагаться на свой встроенный скрипт, который печатается точно после того, как скрипт зависит от него, но позже.

ответил scribu 4 AM00000020000003831 2011, 02:18:38
7

Просто не делайте его встроенным скриптом, а затем передавайте ему динамические параметры как переменные. Отто написал большое руководство о том, как это сделать эффективно.

WordPress 3.3 также сделает это более мощным: https://core.trac.wordpress.org/ticket/11520

ответил Viper007Bond 4 AM00000030000000831 2011, 03:02:08
7

Это решение похоже на ответ , но оно следует за формой wp_enquque_script () и поместит скрипт в заголовок, если его зависимости включены в заголовок.

  /**
 * Включить встроенный Javascript. @see wp_enqueue_script ().
 *
 * KNOWN BUG: встроенные скрипты не могут быть выставлены перед
 * любые встроенные сценарии, от которых он зависит, (если они не являются
 * помещается в заголовок и зависимый в нижнем колонтитуле).
 *
 * @param string $ handle Идентификация имени для скрипта
 * @param string $ src Код JavaScript
 * @param array $ deps (необязательно) Массив имен скриптов, от которых зависит этот скрипт
 * @param bool $ in_footer (необязательно) Вставить в очередь скрипт до </head> или до </body>
 *
 * @return null
 * /
function enqueue_inline_script ($ handle, $ js, $ deps = array (), $ in_footer = false) {
    //Обратный вызов для печати встроенного скрипта.
    $ cb = function () use ($ handle, $ js) {
        //Убедитесь, что скрипт включен только один раз.
        if (wp_script_is ($ handle, 'done'))
            вернуть;
        //Print script & amp; отметьте его как включенный.
        echo "<script type = \" text /javascript \ "id = \" js- $ handle \ "& gt; \ n $ js \ n </script> \ n";
        глобальные $ wp_scripts;
        $ wp_scripts-> done [] = $ handle;
    };
    //(`wp_print_scripts` вызывается в верхнем и нижнем колонтитуле, но $ cb имеет защиту повторного включения.)
    $ hook = $ in_footer? 'wp_print_footer_scripts': 'wp_print_scripts';

    //Если нет зависимостей, просто подключайтесь к верхнему или нижнему колонтитулу.
    if (empty ($ deps)) {
        add_action ($ hook, $ cb);
        вернуть;
    }

    //Записываем сценарий печати до тех пор, пока не будут включены все зависимости.
    $ cb_maybe = function () use ($ deps, $ in_footer, $ cb, & amp; $ cb_maybe) {
        foreach ($ deps as & amp; $ dep) {
            if (! wp_script_is ($ dep, 'done')) {
                //Зависимости, не включенные в голову, повторите попытку в нижнем колонтитуле.
                if (! $ in_footer) {
                    add_action ('wp_print_footer_scripts', $ cb_maybe, 11);
                }
                еще {
                    //Зависимости не были включены в `wp_head` или` wp_footer`.
                }
                вернуть;
            }
        }
        call_user_func ($ cb);
    };
    add_action ($ hook, $ cb_maybe, 0);
}

//Применение
enqueue_inline_script ('test', 'alert (\' enqueue inline script test \ ');', array ('jquery'));
 

Примечание: это использует использование анонимных функций, но для версий PHP до 5.3 это может быть легко преобразовано в класс.

ответил Stephen M. Harris 28 MarpmFri, 28 Mar 2014 18:02:40 +04002014-03-28T18:02:40+04:0006 2014, 18:02:40
4

Лучший способ, который я нашел, - использовать wp_localize_script () , как предложил @scribu.

Обычно я решил использовать встроенный Javascript, потому что мне нужно было предоставить некоторые PHP-переменные для моего скрипта. Это можно решить с помощью wp_localize_script () . Я приведу пример:

У вас есть массив $ aFoo с некоторыми параметрами и нужно передать его скрипту.

  $ aFoo = array ('option1' => $ option1Value, 'option2' => $ option2Value);
 

Использование встроенного скрипта:

  & л; сценарий & GT;
    var oFoo = {};
    oFoo.option1 = & lt;? php echo $ aFoo ['option1']? & gt ;;
    oFoo.option2 = & lt;? php echo $ aFoo ['option2']? & gt ;;;
    //Делаем что-то с oFoo
& Lt; /сценарий & GT;
 

Использование wp_localize_script () :

  wp_register_script ('script_name', 'pathToScript /script.js', array ('jquery')); //если jQuery не нужен, просто удалите последний аргумент.
wp_localize_script ('script_name', 'object_name', $ aFoo); //передать 'object_name' в script.js
wp_enqueue_script ('script_name');
 

Затем pathToScript /script.js будет:

  var oFoo = {};
oFoo.option1 = object_name.option1;
oFoo.option2 = object_name.option2;
//Делаем некоторые вещи с помощью oFoo (нет необходимости в PHP)
 

Таким образом, вам больше не нужны встроенные скрипты.

ответил Manolo 18 PM00000060000004531 2014, 18:29:45
4

С WordPress 4.5 вы можете использовать wp_add_inline_script () :

  add_action ('wp_enqueue_scripts', 'cyb_enqueue_scripts');
function cyb_enqueue_scripts () {
   wp_enqueue_script ('myscript', 'url /to /myscript.js', array (), '1.0');
   wp_add_inline_script ('myscript', 'Ваш встроенный код javascript gos здесь');
}
 
ответил cybmeta 15 Maypm16 2016, 18:18:08
3

scribu абсолютно корректен. Во всяком случае, я хочу добавить некоторую информацию:

Я хочу, чтобы моя функция выводила скрипт один раз, независимо от того, как часто он называется. Это функция, связанная с содержанием, поэтому я не могу дождаться каких-либо перехватов. Я использовал информацию scribus и некоторые чтения ядра WP, чтобы придумать это:

  function print_script_once () {
    if (! wp_script_is ('my-handle', 'done')) {
        echo "<script> alert ('once!'); </script>";
        глобальные $ wp_scripts;
        $ wp_scripts-> done [] Â = 'my-handle';
    }
}
add_action ('get_footer', print_script_once);
 

Используя этот метод, я могу распечатать встроенный скрипт один раз. В моем случае у меня есть функция, которая создает кнопку общего доступа и требует, чтобы один скрипт выполнялся для всех кнопок. Но только один раз.

ответил Julian F. Weinert 29 Jpm1000000pmWed, 29 Jan 2014 16:29:13 +040014 2014, 16:29:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132