Injecter du JS grâce au PHP

Vous êtes ici : Accueil » Construire et gérer un blog avec WordPress » Introduction aux langages du Web » Injecter du JS grâce au PHP

Pour rendre le code JS portable (pouvoir le récupérer sur un autre site dans un thème enfant par exemple) sans le dupliquer (on pourrait en effet écrire le code en dur dans chaque modèle où il est nécessaire), il est préférable de se rabattre sur des solutions côté serveur (donc en PHP).

SolutionUnicité du codePortabilité du code
Bloc HTML personnifiéNONOUI
Composition avec bloc HTML personnifiéOUINON
Bloc Code court + Fonction PHP retournant du HTMLOUIOUI
Fonction PHP de chargement d’un script JSOUIOUI

Code court (short code)

Bibliographie
  • https://capitainewp.io/formations/developper-theme-wordpress/shortcode
  • https://developer.wordpress.org/apis/shortcode

Le bloc Code court permet d’appeler une fonction PHP qui va par exemple retourner une chaîne de caractère contenant l’intégralité du HTML à injecter, y compris la partie script.

Ainsi on évite de dupliquer le code : il suffit d’utiliser le short code, comme on appellerait une fonction (c’est d’ailleurs ce que va faire le short code).

Le code de la fonction se trouve à un seul endroit, idéalement dans le fichier functions.php du thème enfant.

L’avantage du Code court sur la Composition, est qu’il fait appel à une fonction qui est stockée dans le fichier functions.php du thème enfant. Ainsi, si on exporte le thème enfant pour l’installer sur un autre site, on récupère la fonction, contrairement aux Compositions qui restent des objets stockés dans la base de données du site initial.

L’avantage de la Composition sur le Code court, est qu’elle est administrable/modifiable depuis wp-admin, alors que la fonction appelée par le Code court se trouve sur le serveur (dans un fichier functions.php) auquel il faut pouvoir accéder, et est écrite en langage PHP qu’il faut connaître.

Prenons l’exemple de la Composition Bouton top qui permet d’incérer dans le menu escamotable, un bouton permettant de remonter en haut de la page.

Au lieu d’avoir une barre de navigation qui ressemble à ceci :

On aura une barre de navigation qui ressemble à cela :

L’intérêt du bloc Code court, est qu’on peut, comme la Composition, le positionner à l’endroit exact où on en a besoin.

Dans le bloc Code court, il suffit d’inscrire [nom_du_code_court_choisi] soit, dans notre exemple,

.

Côté serveur, il faut déclarer une fonction et activer le Code court (short code).

Rappel du code HTML de la Composition Bouton top
<!-- Bouton "Début" -->
<div style="text-align: center;">
<button type="button" onclick="montop();">▲</button>
</div>
<script>
    function montop(){
        scrollTo(0,0); 
    }
</script>

C’est ce HTML, script inclus, que la fonction va devoir retourner lorsque le serveur qui fabrique la page tombe sur le Code court. Dans notre exemple, la fonction associée au code court s’appelle cma_bouton_top :

Fonction cma_bouton_top() et activation du short code
function cma_bouton_top() {
    $html = '<div style="text-align: center;"><button type="button" onclick="montop();">▲</button></div>'; 
    $html.= '<script>function montop(){ scrollTo(0,0); }</script>';

    return $html;
}

add_shortcode( 'bouton_top', 'cma_bouton_top' );

Explications :

  • $html = ‘ etc. ‘; stocke la première partie du HTML (la div)
  • html.= ‘ etc. ‘; (idem $html = $html . ‘etc. ‘) ajoute à la chaîne de caractères la 2e partie du HTML (le script)
    • On aurait pu tout stocker d’un coup dans la variable $html mais on a procédé en 2 étapes pour améliorer la lisibilité du code
    • En PHP, toutes les variables commencent par $
    • En PHP, l’opérateur point (.) permet de concaténer les chaînes de caractères (en JS on aurait utilisé l’opérateur plus (+))
  • return $html;
    • La chaîne de caractères $html retournée par la fonction, sera intégralement inscrite sur la page à l’endroit où le short code a été appelé
  • add_shortcode( ’bouton_top’, ‘cma_bouton_top’ );
    • La fonction add_shortcode permet de déclarer le short code bouton_top pour qu’il exécute la fonction cma_bouton_top au moment où la page est créée par le serveur.
    • En effet, le code de la fonction déclarée par function cma_bouton_top() {etc. } n’est exécuté que si on appelle la fonction d’une façon ou d’une autre (ici grâce à l’appelle du short code bouton_top dont le lien avec la fonction à déclencher cma_bouton_top, a été fait grâce à une autre fonction : add_shortcode.

Résumé

  • Le code court est appeler entre crochets dans un bloc Code court : [nom_du_code_court_choisi]
  • La fonction associée est idéalement placée dans le fichier functions.php d’un thème enfant :
function nom_de_la_fonction_choisi() {
    $html = 'du HTML'; 
    $html.= 'du HTML';
    $html.= 'du HTML';
    etc.

    return $html;
}

add_shortcode( 'nom_du_code_court_choisi', 'nom_de_la_fonction_choisi' );

Avant d’intégrer le HTML dans la fonction PHP, vous pouvez commencer par le tester dans un bloc HTML personnalisé, depuis wp-admin (donc sans avoir à accéder au serveur).

Chargement d’un script JS

Bibliographie
  • https://tutoriels.lws.fr/wordpress/ajouter-du-javascript-a-wordpress-avec-hooks

Quand le HTML à incérer consiste seulement en un script JS devant s’exécuter juste avant d’afficher la page : au lieu d’utiliser un code court en fin de page pour insérer le HTML (en fait, du code JS entre deux balises script), il est préférable d’utiliser une fonction (idéalement stockée dans le fichier functions.php du thème enfant) ; cela pour plusieurs raisons :

  • C’est la méthode préconisée par WP qui aime bien connaître les scripts qu’il doit charger et lancer, et dans quel ordre
  • Le code JS va être stocké dans un fichier autonome (avec extension .js), dans un dossiers « /js » du thème enfant
    • Ainsi, le code JS ne sera pas saucissonné en plusieurs chaînes de caractères dans une fonction associée à un code court : ça sera plus pratique pour faire évoluer le code JS qui restera lisible, d’autant que certains scripts peuvent comporter de nombreuses lignes de code.

Comme avec les codes courts, avant de mettre en place ce dispositif, vous pouvez commencer par tester le script dans un bloc HTML personnalisé, par exemple depuis wp-admin /Apparence /Editer /Modèles, donc sans avoir à accéder au serveur.

cma-effacer-auto-liens

Nous allons prendre pour exemple le script Effacer auto liens qui est utilisé par les modèles Page et Archive :

  • Qui désactive et met en vert le background des liens de la page qui pointent vers la page elle-même (en particulier dans les menus)
  • Puis qui met en vert le background de l’aïeul de cet élément désactivé du menu.
Script JS Effacer auto liens
<script>
//Effacer les liens de la page qui pointent vers la page elle-même :

var urlcourante = document.location.href; 
// Supprimons l'éventuel dernier slash de l'URL
urlcourante = urlcourante.replace(/\/$/, "");
// Gardons dans la variable queue_url uniquement la portion derrière le dernier slash de urlcourante
var queue_url = urlcourante.substring (urlcourante.lastIndexOf( "/" )+1 );

const liensPage = document.querySelectorAll("a");
//alert(queue_url +" : "+ liensPage.length);
if(liensPage.length > 0){
    var urlLien;
    var queue_urlLien;

    for (let pas = 0; pas < liensPage.length; pas++) {
        if(liensPage[pas].hasAttribute("href")){
            urlLien = liensPage[pas].getAttribute("href");
            urlLien = urlLien.replace(/\/$/, "");
            queue_urlLien = urlLien.substring(urlLien.lastIndexOf("/") +1);
            if(queue_url == queue_urlLien){
                liensPage[pas].removeAttribute ('href');
                liensPage[pas].setAttribute ('style','background-color:lightgreen');
                liensPage[pas].parentElement .parentElement.parentElement.querySelectorAll('a')[0].setAttribute ('style','background-color:lightgreen');
            }
        }
    }
} 
</script>

Nous allons dans un 1er temps :

  1. Créer un dossier js dans le du thème enfant
  2. Créer un fichier effacer-auto-liens.js dans le dossier js
  3. Copier-coller le code du script (sans les balises script) dans le fichier effacer-auto-liens.js

Nous allons dans un 2e temps :

  1. Editer le fichier functions.php du thème enfant
  2. Copier-coller dans ce fichier la 2e version du code ci-dessous
Version 1 du code (à ne pas copier-coller)
function cmaAjouterScriptEffacerAutoLiens() {
    wp_enqueue_script('cma-effacer-auto-liens', get_stylesheet_directory_uri() . '/js/effacer-auto-liens.js', array(), '1.0.0', true);
}
add_action('wp_enqueue_scripts', 'cmaAjouterScriptEffacerAutoLiens');

Explications :

  • function cmaAjouterScriptEffacerAutoLiens et add_action(‘wp_enqueue_scripts’, ‘cmaAjouterScriptEffacerAutoLiens’);
    • La fonction cmaAjouterScriptEffacerAutoLiens sera déclenchée (fonction WP add_action) au moment où WP constitue la liste ordonnée des scripts à lancer pour la page qu’il est en train de construire (wp_enqueue_scripts au pluriel)
    • La fonction cmaAjouterScriptEffacerAutoLiens consiste précisément à charger notre script en particulier
  • wp_enqueue_script (au singulier) : cette fonction WP permet de charger un script en particulier
    • cma-effacer-auto-liens est l’identifiant unique que nous donnons à notre script (il sera utilisé par WP)
    • get_stylesheet_directory_uri est une fonction WP qui renvoie l’url du dossier du thème enfant (attention, la fonction get_template_directory_uri renvoie l’url du thème parent).
    • L’opérateur point (.) permet de concaténer les chaînes de caractères
    • array() est un tableau qui peut si nécessaire être utilisé pour prioriser l’exécution d’un script par rapport à un autre (quel que soit l’ordre du chargement de ces scripts)
    • true (vrai) indique que le script doit être chargé dans le footer (donc lorsque la page est quasiment prête à être affichée).
Version 2 du code (à copier-coller)
function cmaAjouterScriptEffacerAutoLiens() {
    if(is_category() or is_page())
    wp_enqueue_script('cma-effacer-auto-liens', get_stylesheet_directory_uri() . '/js/effacer-auto-liens.js', array(), '1.0.0', true);
}

add_action('wp_enqueue_scripts', 'cmaAjouterScriptEffacerAutoLiens');

Explications :

  • Comme ce script ne concerne que les pages HTML de type Page et Archive (le type d’une page HTML est déduit du modèle, Page ou Archive, auquel elle est associée), il ne faut charger le script que pour les pages HTML concernées.
  • On a donc ajouté un test, if (si) pour ne charger le test qu’en présence des pages HTML concernées.
  • On a utilisé pour cela des fonctions WP particulières nommées conditional tags (balises conditionnelles) : is_category et is_page
    • Il en existe pleins d’autres dont is_archive, is_single, etc. : voir https://developer.wordpress.org/themes/basics/conditional-tags/
  • or est le ou logique en PHP
  • Remarque : pourquoi ne pas avoir mis ce test plus en amont, sur add_action, pour éviter une opération inutile ? Tout simplement parce qu’au moment où WP exécute functions.php, (donc add_action), il ne sait pas encore quel type de page on va lui demander de renvoyer. Par contre, au moment de constituer la liste des scripts (wp_enqueue_scripts au pluriel) WP possède cette information (et il peut utiliser la fonction cmaAjouterScriptEffacerAutoLiens de functions.php qu’il a déjà chargé avec une instruction de type include ‘functions.php’;).

Dans un 3e temps, une fois la version 2 du code copiée-collée dans le fichier functions.php du thème enfant :

  1. Si elle s’y trouve, supprimer la Composition (ou le HTML personnalisé que vous avez testé) à la fin des deux modèles Pages et Archives des catégories.

Autres scripts stockés sur le serveur

cma-effacer-auto-liens-et-categorie

Suivre ce lien

cma-sommaire-h2-h3-dans-id-div-sommaire

Suivre ce lien


https://xn--crire-9ra.fun/wp-admin/edit.php?post_type=wp_block&mode=list

wp_block

manage_wp_block_posts_columns

functions.php du thème enfant :

//Ajouter une colonne
add_filter('manage_wp_block_posts_columns', function($columns) {
    $columns['synchro'] = 'Synchro';
    return $columns;
});
//Remplir la colonne
add_action('manage_wp_block_custom_column', function($columns, $post_id){
    switch ($columns) {
      case 'synchro':
        echo get_option( 'post_content', $post_id )) 
          ) 
        );
        echo $post_wordcount;
        break;
    }
  }, 2, 10);

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.