WordPress : Comment différer conditionnellement les scripts en fonction du nom de la page ?

Publié par Jean-Michel le

J’ai le code suivant dans functions.php. La première fonction met correctement le script en file d’attente en fonction du nom de la page. Cependant, la deuxième fonction ajoute toujours l’attribut ‘defer’.

function custom_scripts() {
    global $page;
    if ($page->page_name !== 'awkward_page') {
        wp_enqueue_script('jquery');
    }

    // ...
}
add_action( 'wp_enqueue_scripts', 'custom_scripts' );


function defer_scripts( $tag, $handle ) {
    global $page;
    if ($page->page_name !== 'awkward_page') {
        return str_replace( ' src', ' defer src', $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'defer_scripts', 10, 2 );

Quel est le problème avec ce code ?

Si ce n’est pas la bonne façon d’ajouter conditionnellement l’attribut html ‘defer’, quelle est la bonne façon ?

Solution n°1 trouvée

$pageLa variable globale n’est pas un WP_Postobjet. C’est juste l’identifiant du poste. Donc, pour obtenir le titre de la page, vous devez d’ WP_Postabord obtenir l’objet à partir de l’ID de publication.

La raison pour laquelle le report est toujours ajouté est double. Tout d’abord, $pageest un entier, donc $page->page_namesera évalué comme nullet nulln’est pas identiquement égal à ‘awkward_page’. Il lancera également une erreur ou un avertissement. De plus, page_namen’est pas une propriété valide d’un objet WP_Post. La propriété correcte est post_name– même sur les pages.

function defer_scripts( $tag, $handle ) {

    //* Get the post object
    $page = get_post( get_the_ID() );

    //* Defer on some condition
    if( 'awkward_page' !== $page->post_name ) {
      $tag = str_replace( ' src', ' defer src', $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'defer_scripts', 10, 2 );

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *