Accoda il core jQuery nel piè di pagina?


22

Ho questo nel mio functions.phpfile e non riesco a caricare jQuery nel piè di pagina. Tuttavia, il includesfile viene caricato nel piè di pagina. Cos'altro devo fare?

function starter_scripts() {
    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );

    wp_enqueue_script( 'jquery', '', '', '', true );

    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

Se lo stai facendo per motivi di prestazioni, potresti prendere in considerazione l'aggiunta deferai tag di script: matthewhorne.me/defer-async-wordpress-scripts
diachedelic

WP dev qui, ho creato un plugin per gestire questo: wordpress.org/plugins/jquery-manager
Remzi Cavdar

Risposte:


23

Per fare ciò dovrai prima annullare la registrazione dello script jQuery e quindi registrarti di nuovo. Se usi jQuery viene fornito con WordPress, la seguente è la funzione che stai cercando.

function starter_scripts() {
    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', includes_url( '/js/jquery/jquery.js' ), false, NULL, true );
    wp_enqueue_script( 'jquery' );

    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

Se usi la versione di jQuery ospitata da Google CDN, fammi sapere che modificherò questo codice per l'URL di Google CDN.


5
Cosa intendi? La soluzione riguarda lo spostamento di jQuery a piè di pagina.
Robert hue,

2
Potresti anche aver bisogno di controllare is_admin () per evitare di apportare modifiche al back-end jQuery, dopo tutto abbiamo davvero bisogno di ottimizzare il frontend dei nostri siti :)
Tim Malone

1
@TimMalone - in realtà no - wp_enqueue_scriptsviene utilizzato solo sul front-end mentre admin_enqueue_scriptsviene utilizzato per il back-end
dev_masta

1
Penso che questa soluzione sia davvero orribile. I tag di versione vengono rimossi con questo. Cos'è questo stile di partenza e questo include include.min.js e cosa c'entra con jQuery.
NextGenThemes,

2
@redanimalwar starter-style e include file sono direttamente dalla domanda.
Tehlivi il

43

Ecco un'altra opzione che evita di dover annullare la registrazione e ripetere la registrazione:

/**
 * Move jQuery to the footer. 
 */
function wpse_173601_enqueue_scripts() {
    wp_scripts()->add_data( 'jquery', 'group', 1 );
    wp_scripts()->add_data( 'jquery-core', 'group', 1 );
    wp_scripts()->add_data( 'jquery-migrate', 'group', 1 );
}
add_action( 'wp_enqueue_scripts', 'wpse_173601_enqueue_scripts' );

Questa soluzione imita il core di WordPress impostando il groupto 1, che è il modo in cui WordPress determina se uno script deve essere nel piè di pagina o meno (non sono a conoscenza del ragionamento per 1, come notato da @jgraup nei commenti sembra un po 'arbitrario).


1
Interessante. Sembra che wp_register_scriptusi add_data( $handle, 'group', 1 )per spostare gli script nel piè di pagina. core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/… - Potresti espandere il perché? Dando un'occhiata al tuo codice, "gruppo" sembra un po 'arbitrario. Ma posso vedere in core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/… come viene usato in WP_Scripts-> in do_itemseguito. Ad ogni modo, questa sembrerebbe la risposta meno distruttiva.
jgraup,

2
Spero che qualcuno possa commentare ulteriormente queste tre risposte votate. Tutti sono diversi e richiedono una certa conoscenza di WP. Poiché google richiede che questi script siano above the fold, questo è un argomento importante.
ssaltman,

2
Migliore risposta! Nota : funziona da WordPress 4.2.0 e lo usa in Functions.php nel callback hook 'wp_enqueue_scripts'
realmag777

Ciao, ho provato l'approccio sopra, ma non ha funzionato. Qualcuno può aiutare?
iSaumya,

1
Questo è così bello! Grazie mille. Ma vale la pena notare come afferma @tehlivi - WP usa una vecchia versione di jQuery - considera la cancellazione e la registrazione di una versione più recente.
skolind

18

Una soluzione migliore:

add_action( 'wp_default_scripts', 'move_jquery_into_footer' );

function move_jquery_into_footer( $wp_scripts ) {

    if( is_admin() ) {
        return;
    }

    $wp_scripts->add_data( 'jquery', 'group', 1 );
    $wp_scripts->add_data( 'jquery-core', 'group', 1 );
    $wp_scripts->add_data( 'jquery-migrate', 'group', 1 );
}

Perché è meglio quindi la risposta accettata IMO

  1. Lo cambia nel profondo, non in una fase successiva in cui altre cose potrebbero già incasinarlo.
  2. La stringa della versione è rimasta al suo posto e non rimossa!
  3. Non annulla la registrazione e registra nuovamente uno script, ma imposta semplicemente il valore del gruppo che è essenzialmente lo stesso come se lo script fosse registrato $footer = true.

Di non farlo all'amministratore

Se i plugin aggiungono jquery in linea a wp_head fallirà quando jquery non viene caricato a quel punto, quindi ti consiglio di evitarlo fino a quando non avrai milioni di modifiche al tuo sito e provi a ottimizzare le prestazioni del tuo amministratore. Questo vale anche per il frontend, quindi dovresti stare attento ai temi o plugin non codificati che assumono jquery nella testa usando il codice jQuery in linea. WP e plugin registrano altri script nella testa dell'amministratore con jquery in deps, quindi non funzionerebbe comunque credo.

A proposito che non funziona

È necessario essere consapevoli del fatto che se qualsiasi altro script viene caricato nella testa che ha jQuery nelle sue dipendenze, farà anche caricare jQuery nella testa proprio prima di se stesso. E questo è buono e previsto, il motivo per cui esiste il sistema wp_enqueue. Ciò significa che imparerai presto se utilizzi alcuni plugin che uno di essi richiederà causa jquery alla testa. È il valore predefinito per gli script accodati, purtroppo.

Soluzione radicale

Penso che frenerà qualsiasi JS in linea che assume jquery ma dovrebbe essere raro. Ciò costringerà tutti gli script a piè di pagina indipendentemente da come vengono accodati.

add_action( 'wp_enqueue_scripts', 'js_to_footer' );

function js_to_footer() {
  remove_action( 'wp_head', 'wp_print_scripts' );
  remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
  remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
}

2
Mentre questo può rispondere alla domanda e ha alcuni punti positivi da masticare, c'è troppo rumore (lanugine?) Nella risposta ed è molto simile alle risposte precedentemente pubblicate con miglioramenti minori del codice. Potrebbe essere più ben accolto se fosse modificato e ridotto in una versione più informativa. Non è inoltre necessario chiamare utenti o risposte specifici (poiché potrebbero non esistere per qualsiasi motivo in futuro).
Howdy_McGee

Si chiama un completamente non menzionato e probabilmente migliore di qualsiasi cosa menzionata in altre risposte "miglioramenti del codice minori". Bene, questo è semplicemente falso. Inoltre non ho "chiamato" nessuno, ho appena menzionato fatti che conosco per migliorare lo stile di programmazione e istruire i lettori su di esso per farli scrivere codice migliore. Scherzi a parte, ho impiegato parecchio tempo per scrivere la migliore risposta qui a lontano e questo è quello che ottengo.
NextGenThemes,

4
Le altre risposte non menzionano nulla degli altri script che costringono jQuery alla testa, infatti la mia risposta toglie la confusione alle persone che non sanno perché non funziona. Nessuna delle altre risposte menziona i potenziali rischi ...
NextGenThemes,

Questo codice (come il codice della risposta sopra) mi ha restituito un errore 500. Ho WordPress 4.9.9
Marco Panichi

Difficile credere che questo codice stia causando un 500, probabilmente hai fatto un errore nell'implementarlo nel tuo codice. Questo non è davvero il posto giusto per chiedere e la tua versione WP obsoleta non è quasi sufficiente informazione.
NextGenThemes

2

Ho sviluppato un plugin per questo problema specifico. Questo plugin non scherza con WordPress jQuery in quanto viene caricato solo nel front-end. Vedi: jQuery Manager per WordPress

Perché ancora un altro strumento di aggiornamento / gestione / sviluppo / debug di jQuery?

Poiché nessuno degli strumenti di sviluppo consente di selezionare una versione specifica di jQuery e / o jQuery Migrate. Fornisce sia la versione compressa / ridotta sia la versione non compressa / di sviluppo. Vedi le caratteristiche di seguito!

✅ Eseguito solo nel front-end, non interferisce con admin / backend WordPress e personalizzatore WP (per motivi di compatibilità) Vedi: https://core.trac.wordpress.org/ticket/45130 e https: // core. trac.wordpress.org/ticket/37110

Attiva / disattiva jQuery e / o jQuery Migrate

✅ Attivare una versione specifica di jQuery e / o jQuery Migrate

E altro ancora! Il codice è open source, quindi puoi studiarlo, imparare da esso e contribuire.


Quasi tutti usano l'handle errato

WordPress utilizza effettivamente l'handle jquery-core, non jquery:

https://github.com/WordPress/WordPress/blob/f84ab5e19f0038a3abec71821c9b8f47a4272942/wp-includes/script-loader.php#L1017

// jQuery
$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4-wp' );
$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4-wp' );
$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.4.1' );

L' handle jquery è solo un alias per caricare jquery-core con jquery-migrate

Ulteriori informazioni sugli alias: wp_register_script identificatori multipli?

Il modo corretto di farlo

Nel mio esempio di seguito uso il CDN jQuery ufficiale su https://code.jquery.com Uso anche script_loader_tag in modo da poter aggiungere alcuni attributi CDN.
È possibile utilizzare il seguente codice:

// Front-end not excuted in the wp admin and the wp customizer (for compatibility reasons)
// See: https://core.trac.wordpress.org/ticket/45130 and https://core.trac.wordpress.org/ticket/37110
function wp_jquery_manager_plugin_front_end_scripts() {
    $wp_admin = is_admin();
    $wp_customizer = is_customize_preview();

    // jQuery
    if ( $wp_admin || $wp_customizer ) {
        // echo 'We are in the WP Admin or in the WP Customizer';
        return;
    }
    else {
        // Deregister WP core jQuery, see https://github.com/Remzi1993/wp-jquery-manager/issues/2 and https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226
        wp_deregister_script( 'jquery' ); // the jquery handle is just an alias to load jquery-core with jquery-migrate
        // Deregister WP jQuery
        wp_deregister_script( 'jquery-core' );
        // Deregister WP jQuery Migrate
        wp_deregister_script( 'jquery-migrate' );

        // Register jQuery in the head
        wp_register_script( 'jquery-core', 'https://code.jquery.com/jquery-3.3.1.min.js', array(), null, false );

        /**
         * Register jquery using jquery-core as a dependency, so other scripts could use the jquery handle
         * see /wordpress/283828/wp-register-script-multiple-identifiers
         * We first register the script and afther that we enqueue it, see why:
         * /wordpress/82490/when-should-i-use-wp-register-script-with-wp-enqueue-script-vs-just-wp-enque
         * /programming/39653993/what-is-diffrence-between-wp-enqueue-script-and-wp-register-script
         */
        wp_register_script( 'jquery', false, array( 'jquery-core' ), null, false );
        wp_enqueue_script( 'jquery' );
    }
}
add_action( 'wp_enqueue_scripts', 'wp_jquery_manager_plugin_front_end_scripts' );


function add_jquery_attributes( $tag, $handle ) {
    if ( 'jquery-core' === $handle ) {
        return str_replace( "type='text/javascript'", "type='text/javascript' integrity='sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=' crossorigin='anonymous'", $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'add_jquery_attributes', 10, 2 );

0
add_action("wp_enqueue_scripts", "myscripts");

function myscripts() { 
   wp_enqueue_script( 'jquery' , '', array(), true); //true for footer
   wp_enqueue_script( 'someScript-js', 'https://domain.com/someScript.js' , '', '', true );
}

-3

Ehi, cambia solo il tuo codice in questo modo

function starter_scripts() {
        wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
        wp_enqueue_script('jquery');
        wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', array( 'jquery' ) );
    }
    add_action( 'wp_enqueue_scripts', 'starter_scripts' );

penso che funzioni bene

aggiungi queste righe nel tuo file Functions.php

remove_action('wp_head', 'wp_enqueue_scripts', 1);
add_action('wp_footer', 'wp_enqueue_scripts', 5);

quindi aggiunge lo script nel piè di pagina


Questo mette jQuery in testa. Ne ho bisogno nel piè di pagina.
Desi,

Ehi Desi, per favore, controlla la risposta modificata. Penso che ti aiuti
Amit Mishra,

6
Sono abbastanza sicuro che questa sia un'idea terribile: hai effettivamente impedito a qualsiasi cosa di caricare script nell'intestazione, non solo jQuery, e potrebbe essere script a doppio accodamento (non hai studiato così profondamente). In effetti, probabilmente hai bisogno solo della remove_action/ add_actionparte se lo farai in questo modo.
drzaus,

1
Davvero un'idea terribile, non farlo!
NextGenThemes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.