Ошибка Wordpress при замене локального jQuery на внешне размещенный - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь загрузить jquery из CDN, вместо того, чтобы загружаться с WordPress.В моем файле functions.php я сделал это, как показано ниже, убедившись, что это должно происходить только на внешнем интерфейсе:

function replace_jquery() {
    if (!is_admin()) {
        wp_deregister_script('jquery');
        wp_register_script('jquery2', 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js');
        wp_enqueue_script('jquery2');
    }
}
add_action('init', 'replace_jquery');

тем не менее, когда я пытаюсь войти в административную область, я получаю кучуошибка, начинающаяся с:

Notice: wp_deregister_script was called <strong>incorrectly</strong>. 
Do not deregister the <code>jquery</code> script in the administration area. 
To target the front-end theme, use the <code>wp_enqueue_scripts</code> hook. 
Please see <a href="https://codex.wordpress.org/Debugging_in_WordPress">Debugging in WordPress</a> for more information. 
(This message was added in version 3.6.0.) in /app/public/wp-includes/functions.php on line 4204

Иногда это не выдает эту ошибку, а иногда и делает.Что я делаю не так?

1 Ответ

0 голосов
/ 26 февраля 2019

Этот вопрос неоднократно обсуждался на протяжении многих лет, и на самом деле он довольно дублирован, но в любом случае я постараюсь обобщить / обновить «Лучшая практика» подходов.

1. Не заменяйте WordPress по умолчанию jQuery , если в этом нет необходимости.Если вы действительно заботитесь о производительности , вам не нужен jquery

2. Если ваша тема или плагин не загружает jQuery, WordPress не загружает его в front-end область по умолчанию, обычно мы должны использовать wp_enqueue_script('jquery'); для ее загрузки.Поэтому, прежде всего, убедитесь, что у вас есть jQuery.Используйте этот фрагмент кода для проверки ваших сценариев в очереди:

// Show all enqueued scripts
add_action( 'wp_print_scripts', function () {
    global $wp_scripts;
    $enqueued_scripts = array();
    foreach( $wp_scripts->queue as $handle ) {
        $enqueued_scripts[] = $wp_scripts->registered[$handle]->src;
    }
    var_dump($enqueued_scripts);
} );

3. Не используйте неправильный хук действия init для добавления ваших сценариев, вы должны использовать wp_enqueue_scripts вместо.

Существуют преднамеренные меры безопасности для предотвращения незарегистрированных критических сценариев администратора, таких как ядро ​​jQuery. source

4. Большинство решений по замене jquery по умолчанию устарели.Вместо этого используйте этот код (протестировано на WP v5.1):

// Replace the default wp jquery with fallback
add_filter( 'wp_enqueue_scripts', 'replace_default_jquery_with_fallback');
function replace_default_jquery_with_fallback() {
    // Change the version if needed
    $ver = '1.12.4';
    // Dequeue first then deregister
    wp_dequeue_script( 'jquery' );
    wp_deregister_script( 'jquery' );
    // Load from Google
    // Set last parameter to 'true' if you want to load it in footer
    wp_register_script( 'jquery', "//ajax.googleapis.com/ajax/libs/jquery/$ver/jquery.min.js", '', $ver, false );
    // Fallback
    wp_add_inline_script( 'jquery', 'window.jQuery||document.write(\'<script src="'.includes_url( '/js/jquery/jquery.js' ).'"><\/script>\')' );
    wp_enqueue_script ( 'jquery' );
}

Обратите внимание, что:

  • Использование этого способа также повлияет на любой плагин, которыйзависит от jQuery
  • Правильный способ полностью удалить стиль или скрипт - это удалить из очереди сначала, затем отменить регистрацию it.
  • init Действие ловушка «Запускается после того, как WordPress завершил загрузку, но перед отправкой заголовков», используйте его с осторожностью.
  • wp_enqueue_scripts используется для обработки front-end scripts.
  • admin_enqueue_scripts используется для обработки административных сценариев .
  • login_enqueue_scripts используется для страниц входа .
  • Рассмотрите возможность использования jQuery Migrate , если ваш код / ​​плагины разработаны для более старых версий jQueryчем 1.9.
...