Comment puis-je reporter ou async ce JavaScript WordPress snippet à charger enfin pour des temps de chargement de page plus rapides?

j'ai différents javascripts qui sont des plugins nécessaires dans un de mes domaines WordPress, et je sais d'où dans le fichier php il est appelé.

je prends toutes les mesures que je peux prendre pour accélérer le chargement des pages fois, et chaque testeur de vitesse sur le web dit de différer javascripts si possible.

j'ai lu à propos de la différer= "différer" et async fonctions en javascript et je pense que l'un d'eux accomplira ce que je suis essayez d'accomplir. Mais je ne comprends pas comment je le ferais dans un fichier php.

Par exemple, voici un extrait d'un plugin particulier du fichier php où le fichier javascript est appelée:

function add_dcsnt_scripts() {

    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'dcsnt', dc_jqsocialtabs::get_plugin_directory() . '/js/jquery.social.media.tabs.1.7.1.min.js' );

}

j'ai lu qu'il est préférable de faire quelque chose comme ça pour des temps de chargement de page plus rapides:

<script defer async src="..."></script>

Mais je ne sais pas comment accomplir que dans un fichier php. Je veux le faire avec tous mes fichiers javascript.

Comment pourrais-je accomplir déferrer ou asyncer cet extrait de javascript à la charge is last et accélère les temps de chargement de page<!--6? Quelle serait la meilleure façon d'augmenter le temps de chargement des pages sur tous les navigateurs? Merci pour tous les conseils que n'importe qui peut offrir!

42
demandé sur vard 2013-09-22 16:54:20

11 réponses

blog deux liens vers des plugins d'intérêt:

Javascript Asynchrone

améliorer la performance de chargement de la page en chargeant de manière asynchrone javascript à l'aide de head.js

WP JavaScripts différés

reporter le chargement de tous les javascripts ajoutés avec wp_enqueue_scripts, en utilisant LABJS (un asynchrone bibliothèque javascript).

ne les ont pas testé mais vérifié le code et ils font des trucs assez fantaisistes avec WordPress scripts processus de recherche.

Mais WPSE vient à la rescousse:

// Adapted from https://gist.github.com/toscho/1584783
add_filter( 'clean_url', function( $url )
{
    if ( FALSE === strpos( $url, '.js' ) )
    { // not our file
        return $url;
    }
    // Must be a ', not "!
    return "$url' defer='defer";
}, 11, 1 );
26
répondu brasofilo 2017-04-13 12:37:31

Ou de manière plus universelle:

function add_async_forscript($url)
{
    if (strpos($url, '#asyncload')===false)
        return $url;
    else if (is_admin())
        return str_replace('#asyncload', '', $url);
    else
        return str_replace('#asyncload', '', $url)."' async='async"; 
}
add_filter('clean_url', 'add_async_forscript', 11, 1);

vous pouvez donc ajouter async à n'importe quel script sans changement de code, il suffit d'ajouter #asyncload pour que l'url du script soit:

wp_enqueue_script('dcsnt', '/js/jquery.social.media.tabs.1.7.1.min.js#asyncload' )
38
répondu bestlion 2013-12-19 02:21:31

en essayant de garder les choses quelque peu modulaires et globales, l'approche suivante choisit dynamiquement comment intégrer l'étiquette avec les attributs async ou defer en ajoutant simplement un petit identifiant au nom $ handle:

/**
* Add async or defer attributes to script enqueues
* @author Mike Kormendy
* @param  String  $tag     The original enqueued <script src="...> tag
* @param  String  $handle  The registered unique name of the script
* @return String  $tag     The modified <script async|defer src="...> tag
*/
// only on the front-end
if(!is_admin()) {
    function add_asyncdefer_attribute($tag, $handle) {
        // if the unique handle/name of the registered script has 'async' in it
        if (strpos($handle, 'async') !== false) {
            // return the tag with the async attribute
            return str_replace( '<script ', '<script async ', $tag );
        }
        // if the unique handle/name of the registered script has 'defer' in it
        else if (strpos($handle, 'defer') !== false) {
            // return the tag with the defer attribute
            return str_replace( '<script ', '<script defer ', $tag );
        }
        // otherwise skip
        else {
            return $tag;
        }
    }
    add_filter('script_loader_tag', 'add_asyncdefer_attribute', 10, 2);
}

Exemple d'utilisation:

function enqueue_my_scripts() {

    // script to load asynchronously
    wp_register_script('firstscript-async', '//www.domain.com/somescript.js', '', 2, false);
    wp_enqueue_script('firstscript-async');

    // script to be deferred
    wp_register_script('secondscript-defer', '//www.domain.com/otherscript.js', '', 2, false);
    wp_enqueue_script('secondscript-defer');


    // standard script embed
    wp_register_script('thirdscript', '//www.domain.com/anotherscript.js', '', 2, false);
    wp_enqueue_script('thirdscript');
}
add_action('wp_enqueue_scripts', 'enqueue_my_scripts', 9999);

Sorties:

<script async type='text/javascript' src='//www.domain.com/somescript.js'></script>
<script defer type='text/javascript' src='//www.domain.com/otherscript.js'></script>
<script type='text/javascript' src='//www.domain.com/anothercript.js'></script>

merci à @MattKeys @crissoca d'avoir inspiré ma réponse ici.

15
répondu Mike Kormendy 2016-11-11 18:13:40

une autre solution utilisant un filtre différent, qui peut être utilisé pour cibler une poignée de script spécifique:

function frontend_scripts()
{
    wp_enqueue_script( 'my-unique-script-handle', 'path/to/my/script.js' );
}
add_action( 'wp_enqueue_scripts', 'frontend_script' );

function make_script_async( $tag, $handle, $src )
{
    if ( 'my-unique-script-handle' != $handle ) {
        return $tag;
    }

    return str_replace( '<script', '<script async', $tag );
}
add_filter( 'script_loader_tag', 'make_script_async', 10, 3 );
11
répondu Matt Keys 2015-02-05 01:41:19

Une méthode simplifiée. Ajouter à vos fonctions.php file to make JavaScript asynchronous dans Wordpress

// Make JavaScript Asynchronous in Wordpress
add_filter( 'script_loader_tag', function ( $tag, $handle ) {    
    if( is_admin() ) {
        return $tag;
    }
    return str_replace( ' src', ' async src', $tag );
}, 10, 2 );
9
répondu TheRealJAG 2015-09-01 19:59:39

pour avoir le contrôle sur les fichiers JS à reporter et éviter les conflits, vous pouvez ajouter une variable à l'url dans la fonction wp_register_script comme ci-dessous.

wp_register_script( 'menu', get_template_directory_uri() . '/js/script.js?defer', array('jquery'), '1.0', true );

alors changez la ligne:

if ( FALSE === strpos( $url, '.js' ))

À:

if ( FALSE === strpos( $url, '.js?defer' ))

Le nouveau filtre ressemble à ceci.

add_filter( 'clean_url', function( $url )
{
    if ( FALSE === strpos( $url, '.js?defer' ) )
    { // not our file
    return $url;
    }
    // Must be a ', not "!
    return "$url' defer='defer";
}, 11, 1 );
4
répondu Nathan Friend 2014-04-02 14:51:01

incorporez le async attribuez aux scripts de sorte qu'ils ne soient chargés qu'une fois que toute la page est chargée

<script type="text/javascript">
    function ngfbJavascript( d, s, id, url ) {
        var js, ngfb_js = d.getElementsByTagName( s )[0];
        if ( d.getElementById( id ) ) return;
        js = d.createElement( s );
        js.id = id;
        js.async = true;
        js.src = url;
        ngfb_js.parentNode.insertBefore( js, ngfb_js );
    };
</script>

Source:Ici

1
répondu Anz Joy 2014-08-10 11:18:00

quelque Chose à ajouter le clean_url solution de filtre, assurez-vous de valider pour l'utiliser seulement sur la fin de police peut-être en utilisant if( ! is_admin() ){} les plugins populaires comme ACF peuvent vous donner mal à la tête.

mise à Jour

Voici ma version modifiée de la solution:

if( ! is_admin() ){
  add_filter( 'clean_url', 'so_18944027_front_end_defer', 11, 1 );
  function so_18944027_front_end_defer( $url ) {
    if ( FALSE === strpos( $url, '.js' ) )
    { // not our file
        return $url;
    }
    // Must be a ', not "!
    return "$url' defer='defer";
  }
}
1
répondu crissoca 2015-04-28 04:37:12

je crois que c'est une mauvaise pratique de reporter/async WordPress jQuery. La meilleure solution serait de exclure jQuery dans le filtre:

if (!is_admin()) {
    add_filter( 'script_loader_tag', function ( $tag, $handle ) {    
        if ( strpos( $tag, "jquery.js" ) || strpos( $tag, "jquery-migrate.min.js") ) {
            return $tag;
        }
        return str_replace( ' src', ' async src', $tag );
    }, 10, 2 );
}

Vous pouvez utiliser defer au lieu de async

1
répondu Abukwaik 2016-12-08 12:49:52

très peu de code de modification Mike Kormendy, qui vous permet d'ajouter 2 attributs à la fois:

// Async load
function add_asyncdefer_attribute($tag, $handle)
{
    $param = '';
    if ( strpos($handle, 'async') !== false ) $param = 'async ';
    if ( strpos($handle, 'defer') !== false ) $param .= 'defer ';
    if ( $param )
        return str_replace('<script ', '<script ' . $param, $tag);
    else
        return $tag;
}

Résultat:

<script async defer type='text/javascript' src='#URL'></script>
1
répondu Marina Lebedeva 2017-02-08 10:37:23

La bonne façon de le faire

wp_script_add_data( 'script-handle', 'async/defer' , true );

en savoir plus

0
répondu Sharif Mohammad Eunus 2018-07-02 08:47:55