Ошибка Wordpress при замене локального jQuery на внешне размещенный

Я пытаюсь загрузить 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 ответ

Решение

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

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

2. Если ваша тема или плагин не загружает jQuery, WordPress по умолчанию не загружает его в интерфейсную область, обычно мы должны использовать 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. Не используйте неправильную инициализацию ловушки действий для добавления ваших скриптов, вместо этого вы должны использовать wp_enqueue_scripts.

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

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
  • Правильный способ полностью удалить стиль или сценарий - сначала удалить его из очереди, а затем отменить его регистрацию.
  • Хук действия инициализации: "Запускается после того, как WordPress завершил загрузку, но перед отправкой заголовков", используйте его с осторожностью.
  • wp_enqueue_scripts используется для обработки интерфейсных сценариев.
  • admin_enqueue_scripts используется для обработки сценариев администратора.
  • login_enqueue_scripts используется для страниц входа.
  • Попробуйте использовать jQuery Migrate, если ваш код / ​​плагины разработаны для версий jQuery старше 1.9.
Другие вопросы по тегам