Ошибка 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.