Présentation technique du site

Vous êtes ici : Accueil » Construire et gérer un blog avec WordPress » Présentation technique du site

Présentation générale


Le blog rire et écrire (titre du site), créé avec WordPress 6.5 et son éditeur de blocs Gutenberg), est hébergé chez OVH.

Il est consultable avec l’url https://xn--crire-9ra.fun/ (on peut aussi saisir écrire.fun ou ecrire.fun dans la barre d’adresse du navigateur).

Le domaine ecrire.fun (sans accent) est redirigé vers le domaine écrire.fun.

J’ai créé ce blog littéraire pour « Partager ma pratique de l’écriture de façon ludique » (description du site).

Il comporte actuellement environ 60 articles et 50 pages.

L’une de ces pages (slug = wordpress), une page parent regroupant environ la moitié de ces 50 pages, propose de vous guider dans la création d’un blog au moyen du CMS WordPress (voir https://xn--crire-9ra.fun/wordpress) : ces 25 pages me servent de support de cours lorsque je délivre une formation WordPress.

La description détaillée et l’intégralité du code se trouvent dans la documentation du site : https://xn--crire-9ra.fun/wordpress/documentation-du-site/

Réglages


La page d’accueil affiche la liste des articles.

Un menu permanent permet d’accéder :

  • aux catégories d’articles
  • aux articles qui sont seuls dans leur catégorie
  • à certaines pages.

L’ensemble des pages et articles est structuré au sein de 6 sous-menus qui ne sont pas des catégories en tant que tels : Jeux, Phrases, Textes, Récits, Outils, Potins. Les 5 premiers sous-menus ébauchent un parcours pédagogique de type atelier d’écriture.

Les catégories d’articles, au nombre de 20, ne sont pas hiérarchisées. Et un article n’appartient qu’à une seule catégorie.

Liste des 20 catégories

Les étiquettes ne sont pas utilisées pour ne pas augmenter le nombre de pages et la duplication des contenus. J’ai préféré soigner les menus et améliorer la fonction Recherche.

Les 25 pages du support de cours WordPress bénéficient d’un menu secondaire structuré en 5 rubriques

Structure des URL :

  • Les pages ont des URL de type Nom de domaine /slug de la page.
  • Les catégories ont des URL de type Nom de domaine /slug de la catégorie grâce à l’extension Yoast SEO.
  • Les pages filles ont des URL de type Nom de domaine /slug de la page parent /slug de la page.
  • Les articles ont des URL de type Nom de domaine /slug de la catégorie /slug de l’article : ce choix a été déterminé par le fait que les slug des articles eux-mêmes sont parfois fantaisistes. Le slug de la catégorie permet de mieux structurer l’URL pour les moteur de recherche.
Outre Yoast SEO, le site utilise les extensions suivantes.
  • Redirection
  • UpdraftPlus – Sauvegarde/Restauration
  • WP-Optimize – Nettoyer, compresser, mettre en cache
  • Akismet Anti-spam: Spam Protection
  • Broken Link Checker
  • Site Kit by Google
  • myStickymenu

Quelques écrans


Page d’Accueil

Ecrans

Menu

Ecrans

Catégorie Quiz

Ecran

Recherche dans la catégorie Quiz

Ecran

Article Quiz Nouvelle-Zélande

Ecrans

Page parent Construire et gérer un blog avec WordPress

Ecrans

Architecture


Thème et thème enfant

Le thème activé est le thème Twenty Twenty-Two développé par l’équipe WordPress en 2022.

J’ai créé, sans l’activer, un thème enfant, twentytwentytwo-child, minimaliste (sans répertoire Templates), mais je n’en ai pas eu besoin : pour protéger mes fonctions additionnelles des mises à jour WordPress, j’ai préféré créer une extension : ecrire-fun-2022 (voir plus loin).

Les modèles utilisés du thème twentytwentytwo

wp-admin /Apparence /Editeur /Modèles

Tableau récapitulatif

PHP : wp-content /plugins /ecrire-fun-2022 /includes /mesfonctions.php

JS : wp-content /plugins /ecrire-fun-2022 /includes /js

Modèle ou Instance*
(divers) = pas de lien entre les cellules de la ligne
Elément de modèleNomcompo (* si synchro)
ou Bloc Nombloc
ou .nomclasse
Script JS (.js)
ou fonction() PHP
ou /code court/
o Index
o Page 404
Pied de page
o Index
o Accueil
En-tête avec titreMenu*/bouton_top/
Accueil (divers)Pied de pageBouton fermer Détails

Bloc Recherche
/lire_la_suite/
Page (divers)WPYSEO breadcrumb*effacer-auto-liens.js

cma-sommaire-h2-h3-dans-class-div-sommaire.js

page-racine-de-recherche.js
o Page 404
o Page
o Recherche
o Archive
En-tête sans catégorieMenu*/bouton_top/
Archive (divers)Pied de pageBloc Recherche/lire_la_suite/

effacer-auto-liens.js

categorie-de-recherche.js
Recherche (divers)Pied de pageBloc Recherche/lire_la_suite/

ma_recherche_filter ($query)

contrainte-de-recherche.js
Publications seulesEn-tête sans titreMenu*/bouton_top/
Publications seules (divers)Pied de pageeffacer-auto-liens-et-categorie.js

cma-sommaire-h2-h3-dans-class-div-sommaire.js
Page* (divers)Bloc Recherche de classe .racine-de-recherche/wpversion/
o Page* (divers)
o Publications seules* (divers)
Groupe de classe class-div-sommaire*
Tableau récap des modèles de twentytwentytwo
Tableau récap des en-têtes et de leur navigation
Modèles WP 2022Elément de modèle de type En-têteCaractéristiques de la barre de navigation
(tous les éléments de modèle utilisent en plus la compo Menu* et le code court /bouton_top/)
AccueilEn-tête avec titreo Icone non cliquable (SEO)
o Avec titre du site
o Sans catégorie
o Page 404
o Page
o Archive
o Recherche
En-tête sans catégorieo Icone cliquable
o Avec titre du site
o Sans catégorie
Publications seulesEn-tête sans titreo Icone cliquable
o Pas de titre du site (responsivité : pour rester sur une seule ligne sur un smartphone)
o Avec la catégorie de l’article
Tableau récapitulatif des en-têtes des modèles de twentytwentytwo
Rappel des noms de fichiers des différents modèles (dossier templates)
  • Page 404 : 404.html
  • Index : index.html
  • Accueil : home.html
  • Archive : archive.html
  • Recherche : search.html
  • Pages : page.html
  • Publications seules : single.html

Les compositions de blocs WP

Faciliter la création de glossaires

Une composition de blocs complexe a été créée pour faciliter la création de glossaires (mais son utilisation reste rare).

Faciliter la création de quiz

Une composition de blocs complexe a été créée pour faciliter la création de quiz (qui ne sont pas rares sur ce site). Celle-ci a été composée à partir de 8 sous-compositions, dont ces 2 boutons avec leurs scripts :

  1. Quiz-bouton-Nb réponses et ouvrir profil (composition non synchronisée) :
    • Compte les inputs de type checkbox cochés dont le name= »bonnereponse »
    • Puis affiche le score en % dans une balise span globale
    • Puis affiche le profil en fonction du % de bonnes réponses obtenu.
  1. Quiz-bouton-raz (composition synchronisée)
    • RAZ les inputs radio, checkbox et select
    • Referme les blocs Détails
    • Efface le résultat affiché dans le span global (cf. la composition ci-dessus)
    • Positionne l’affichage sur le bloc dont l’id est quiz.
Script JS Quiz-bouton-Nb réponses et ouvrir profil
<!-- Bouton "Comptabilisez vos bonnes réponses" -->
<!-- Toutes les boîtes à cocher à compter dans la page doivent être définies ainsi en html : <input type="checkbox" name="bonnereponse"> -->
<div class="div-centree">
    <button type="button" class="nice-button" onclick="count_chkBox();">
        Comptabilisez vos bonnes réponses
    </button>
    <br><span id="spanresult"></span>
</div>
<script>
    function count_chkBox(){
        var nbre_check = 0;
        //variable globale pour donner accès au bouton RAZ du script Quiz-bouton-raz
        spanresult = document.getElementById ("spanresult");
        var boites = document.getElementsByName ("bonnereponse");
        const nbquestions = boites.length;
        for (i=0; i<boites.length; i++) {
            if (boites[i].checked) nbre_check ++ ;
        }
        if(nbre_check>1) spanresult.textContent = Math.abs(nbre_check).toString() + " bonnes réponses";
        else spanresult.textContent = Math.abs(nbre_check).toString() + " bonne réponse";

        //Fermer les 3 profils
        let details = document.querySelectorAll ('.profil');
        for (let detail of details) {
            detail.open = false;
        }
        //Ouvrir profil1 (<=25 %)
        if(nbre_check <= nbquestions * 25/100) {
            let detail1 = document.querySelectorAll ('.profil1');
            for (let detailbis of detail1) {
                detailbis.open = true;
            }
        }
        //Ou bien ouvrir profil2 (<= 70%)
        else if(nbre_check <= nbquestions *70/100){
            let detail2 = document.querySelectorAll ('.profil2');
            for (let detailbis of detail2{
                detailbis.open = true;
            }
        }
        //Ou bien ouvrir profil3
        else {
            let detail3 = document.querySelectorAll ('.profil3');
            for (let detailbis of detail3) {
                detailbis.open = true;
            }
        }
        //Ouvrir la boîte à profils
        let box = document.querySelectorAll ('.profils');
        for (let thebox of box) {
            thebox.open = true;
        }
    }
</script>
Script JS Quiz-bouton-raz
<!-- Bouton "Effacez toutes vos réponses" -->
<div style="text-align: center;">
    <button type="button" class="nice-button" onclick="raz();">Effacez toutes vos réponses</button>
</div>
<script>
    function raz(){
        var quiz = document.getElementById ("quiz");
        quiz.scrollIntoView();

        let selects = document.querySelectorAll ('select');
        for (let select of selects) {
            select.selectedIndex = 0;
        }
        let radios = document.querySelectorAll ('input[type=radio]');
        for (let radio of radios) {
            radio.checked = false;
        }
        let boxes = document.querySelectorAll ('input[type=checkbox]');
        for (let box of boxes) {
            box.checked = false;
        }
        let details = document.querySelectorAll ('details');
        for (let detail of details) {
            detail.open = false;
        }
        spanresult.textContent = "";
    }
</script>

Une extension sur mesure

J’ai créé et activé une extension ecrire-fun-2022
wp-content /plugins /ecrire-fun-2022
wp-content /plugins
/ecrire-fun-2022 /includes
wp-content /plugins
/ecrire-fun-2022 /includes /js

Cette extension possède :

  • Un fichier wp-content /plugins /ecrire-fun-2022 /includes /mesfonctions.php qui contient :
    • 2 fonctions de modification de l’écran d’administration des pages WordPress, et leurs instructions de chargement add_filter et add_action
    • 6 fonctions de codes courts et leurs instructions add_shortcode
    • Les fonctions de chargement des 8 scripts JS, et leurs instructions de chargement add_action(‘wp_enqueue_scripts’ etc. Ces fonctions tiennent compte des contextes, par exemple : if (is_category() or is_page()) wp_enqueue_script etc.
    • Une fonction ma_recherche_filter ($query) chargée de limiter la recherche à certaines pages selon les cas, et son instruction de chargement add_filter.
  • Un répertoire wp-content /plugins /ecrire-fun-2022 /includes /js qui contient les scripts JS chargés par les fonctions du fichier mesfonctions.php. Le fichier mesfonctions.php adresse les scripts js grâce à l’instruction suivante :
$cmaWayToJs = plugin_dir_url( __FILE__ ) . "js/";
  • Un fichier wp-content /plugins /ecrire-fun-2022 /ecrire-fun-2022.php qui définit l’extension et récupère le contenu du fichier mesfonctions.php :
ecrire-fun-2022.php
<?php
/*
 * Plugin Name: ecrire-fun-2022
 * Description: Utilisé par le site écrire.fun avec le thème WP 2022. Gère la Recherche sélective, la désactivation des liens inutiles, les sommaires, les short codes.
 * Author: CHIRO314
 * Version: 1.0
 */

require_once plugin_dir_path(__FILE__) . 'includes/mesfonctions.php';

Intégralité du code du fichier mesfonctions.php : https://xn--crire-9ra.fun/wordpress/documentation-du-site/#mesfonctions-php

Les fonctionnalités de l’extension


Les fonctionnalités lourdes

Les fonctionnalités lourdes ont été développées sur le serveurs au moyen de Hooks et de scripts, en évitant autant que faire se peut les compositions (non portables) et les codes courts :

  • Désactivation automatique des liens des menus qui pointent vers le document lui-même
    • Pour les pages et catégories (effacer-auto-liens.js) : désactive les liens de la page qui pointent vers la page elle-même et grise le chemin dans le menu (3 niveaux)
    • Pour les articles (effacer-auto-liens-et-categorie.js) : désactive les liens de l’article qui pointent vers la page elle-même (y compris les catégories mono-article) et grise le chemin dans le menu (2 niveaux).
  • Création d’un sommaire simple
    • Nécessite le code court sommaire_simple h=n, avec n valant de 2 à 6 ; n représente le niveau maximum des titres affichés (par défaut H2 à H3)
    • Le script sommaires-h2-h6-dans-class-div-sommaire-n.js, qui initialise les sommaires avec la liste indentée des titres avec leurs liens, est également utilisé par les types de sommaire ci-dessous.
  • Création d’un sommaire double (avec 2 boutons : Sommaire et Détail)
    • Nécessite le code court sommaire_double h=n, n valant de 2 à 5 ; n représente le niveau maximum des titres affichés par le sommaire (par défaut H2 à H3)
    • Le détail affiche (à la demande) un sommaire complet (titres H2 à H6)
    • Outre le script qui initialise les sommaires, ce type de sommaire utilise le script sommaire-double.js qui permet d’animer les 2 boutons, Sommaire et Détail.
  • Création d’un sommaire au choix (avec saisie de la profondeur dans une liste déroulante)
    • Nécessite le code court sommaire_au_choix h=n, n valant de 2 à 6 ; n représente le niveau maximum des titres affichés par le sommaire au chargement de la page (par défaut H2 à H3)
    • La liste déroulante ne propose que les valeurs de niveaux possibles pour le document
    • Outre le script qui initialise les sommaires, ce type de sommaire utilise le script sommaire-au-choix.js qui permet d’animer la liste déroulante.
  • Gestion de la recherche d’un mot sur le site (bloc Recherche de WP) : n’utilise aucune composition ni code court
    • Cas d’une recherche depuis la page d’accueil : certaines pages sont exclues
    • Cas d’une recherche limitée aux articles d’une catégorie : pour informer la fonction ma_recherche_filter ($query) du serveur, le script categorie-de-recherche.js ajoute l’input caché ‘categorie‘ dans le formulaire de recherche
    • Cas d’une recherche limitée aux pages filles d’une page parent : le bloc Recherche de la page parent doit appartenir à la classe racine-de-recherche (à renseigner par l’utilisateur d’admin-WP) ; pour informer la fonction ma_recherche_filter ($query) du serveur, le script page-racine-de-recherche.js ajoute l’input caché ‘racine‘ dans le formulaire de recherche
    • Cas d’une recherche depuis le résultat d’une recherche antérieure : le script contrainte-de-recherche.js analyse l’URL pour ajouter le même input caché (‘racine’ ou ‘categorie‘) dans le formulaire de recherche, afin d’indiquer à la fonction ma_recherche_filter ($query) du serveur, de continuer la nouvelle recherche avec les mêmes restrictions.
Code : scripts JS et PHP* (codes courts, Chargement des scripts, fonctions)

* Tout le PHP se trouve dans mesfonctions.php

Les fonctionnalités légères

Trois fonctionnalités légères ont été développées sur le serveurs à travers des codes courts (short codes) :

  • Un bouton permettant de remonter en haut de la page (utilisé dans la barre de navigation permanente) : code court bouton_top
  • Contenu du paragraphe Lire la suite, à la fin de chaque extrait d’article listé : code court lire_la_suite
  • Afficher la version de WordPress utilisée par le site : code court wpversion couleur= » » taille= » ». Par exemple dans la page parent wordpress :
[wpversion couleur="#605924" taille="2rem"]
PHP : short code bouton_top
add_shortcode( 'bouton_top', 'cma_bouton_top' );

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;
}
PHP : short code wpversion
add_shortcode ('wpversion', 'cma_wpversion');

function cma_wpversion() { 
    global $wp_version;
    $html = '
    <p style="font-size: xx-large; color: #605924">
        <em><strong>' .$wp_version. '</strong></em>
    </p>'; 
       
    return $html;
}

Le code CSS additionnel


wp-admin /Apparence /Personnaliser /CSS additionnel

Code CSS
/*Marges suite PB avec les modèles :
h2, h3{margin-top: 40px !important; margin-bottom: 25px !important;}  */
input[type="radio"], input[type="checkbox"] {margin-right: 5px;}
/* details *, .divm1rem>*{padding: 3px;} */
details p, .divm1rem>*{padding: 10px;}
img{padding: 10px;}

/*Hauteur trop importante du menu permanent sur le PC sur page et article :
Navigation dans compo Menu : */
.cmamenu {max-height: 48px;}
/*.cmasousmenu {max-height: 40px;}*/


/*Ecrire une histoire /Intrigue /tableau : */

.cma-decimal-list-block{list-style-type: decimal;}
.cma-table-22-etapes tr:nth-of-type(1), .cma-table-22-etapes tr:nth-of-type(2), .cma-table-22-etapes tr:nth-of-type(5), .cma-table-22-etapes tr:nth-of-type(12), .cma-table-22-etapes tr:nth-of-type(15){
    background-color: gray;
		color: white;
}
.cma-table-22-etapes tr:nth-of-type(3) td:first-of-type, .cma-table-22-etapes tr:nth-of-type(6) td:first-of-type,
.cma-table-22-etapes tr:nth-of-type(7) td:first-of-type, .cma-table-22-etapes tr:nth-of-type(8) td:first-of-type,
.cma-table-22-etapes tr:nth-of-type(9) td:first-of-type, .cma-table-22-etapes tr:nth-of-type(10) td:first-of-type,
.cma-table-22-etapes tr:nth-of-type(13) td:first-of-type {
    border-bottom: 3px solid white;
		border-top: 1px solid white;
}
.cma-entete-tableau-gris tr:nth-of-type(1){
	background-color: gray;
	color:white;
}
.cma-lignes-2-3-tableau-gras tr:nth-of-type(2), .cma-lignes-2-3-tableau-gras tr:nth-of-type(3) {font-weight:bold;}

/*FIN DE Ecrire une histoire /Intrigue /tableau */

/* Centrer : */
.div-centree {text-align: center;}
.text-align-center {text-align: center;}

/*Justifier : */
.puce-justifiee {text-align: justify; padding-left : 1.1em;}
.justifier, p{text-align: justify;}
.text-align-start{text-align: start;}

/*Puces : */
.liste-sans-puce{list-style-type: none;}
.no-bullet {list-style-type: none}
.dialogue{list-style-type: '–  '; text-align: justify; padding-left : 1.1em;}

/*Mise en page spéciales (Les filles de Thespios) : */

.first-letter-blue::first-letter {color: blue; font-size: 3em;font-weight: bold;}
.first-letter-green::first-letter {color: green; font-size: 3em;font-weight: bold;}
.first-letter-orange::first-letter {color: orange; font-size: 3em;font-weight: bold;}
.first-letter-red::first-letter {color: red; font-size: 3em;font-weight: bold;}
.li-a-blue>a{color:blue}
.li-a-green>a{color:green}
.li-a-orange>a{color:orange}
.li-a-red>a{color:red}
.orange-checkbox {background: orange;}

/* Jolis boutons : */

.nice-button{
  width: auto;
  margin: auto;
  /*margin-top: 0.2em;*/

  color: white;
  background-color: #6495ED;
  text-shadow: 1px 1px black;

  text-decoration: none;
  text-align: center;
  padding: 2px;
  border: 3px outset #c0c0c0;
}
.nice-button2{
  width: auto;
  margin-top: 0.2em;

  color: white;
  background-color: #6495ED;
  text-shadow: 1px 1px black;

  text-decoration: none;
  text-align: center;
  padding: 7px;
  border: 3px outset #c0c0c0;
}
.clavier-glossaire *{
  width: 2.4em;
  margin: auto;
  margin-top: 0.2em;

  color: white;
  background-color: #6495ED;
  text-shadow: 1px 1px black;

  text-decoration: none;
  text-align: center;
  padding: 2px;
  border: 3px outset #c0c0c0;
}
/* FIN DE Joli boutons : */

Exemple de code : page-racine-de-recherche


Rappel du besoin

Faire en sorte que le bloc Recherche d’une page parent limite sa recherche aux pages filles.

Rappel : tout le PHP se trouve dans mesfonctions.php.

Etape 1 : qualifier le bloc Recherche de la page parent

Techniquement, il suffit d’attribuer manuellement la classe racine-de-recherche au bloc Recherche (dans le cas d’une liste d’articles d’une catégorie, il n’y a rien à faire car toute catégorie est considérée comme l’équivalent d’une page racine par un autre script, categorie-de-recherche.js).

Classe racine-de-recherche (en bas à droite)

Etape 2 : charger le script

Le script page-racine-de-recherche.js est automatiquement chargé pour toutes les pages.

PHP : chargement du script
$cmaWayToJs = plugin_dir_url( __FILE__ ) . "js/";

add_action('wp_enqueue_scripts', 'cmaAjouterScriptPageRacineDeRecherche');
function cmaAjouterScriptPageRacineDeRecherche() {
    global $cmaWayToJs;
    if(is_page()) {
        wp_enqueue_script('cma-page-racine-de-recherche', $cmaWayToJs . 'page-racine-de-recherche.js', array(), '1.0.0', true);
    }
}

Etape 3 : exécuter le script

Avant d’afficher la page, le navigateur exécute le script qui, s’il existe dans la page au moins un bloc Recherche appartenant à la classe racine-de-recherche :

  1. Récupère le slug de la page dans l’URL
  2. Crée et met à jour un imput caché, avec le slug de la page pour valeur
  3. Insère l’input caché dans le formulaire du 1er bloc Recherche appartenant à la classe racine-de-recherche : la présence de cet input permettra au serveur (fonction ma_recherche_filter) de reparamétrer la requête de la Recherche si une recherche est effectuée par l’internaute
  4. Indique le périmètre de la recherche dans le label du bloc Recherche.
Script JS
//Chercher la classe racine-de-recherche
let testerRacine = document.getElementsByClassName ("racine-de-recherche");
if(testerRacine.length > 0){
    let currentInput = document.getElementsByName ("s"); //s est la zone de saisie des blocs Recherche
    if(currentInput.length > 0){
        //Récupérer le slug de la page dans l'URL
        let urlcourante = document.location.href; 
        // Supprimer l'éventuel dernier slash de l'URL
        let urlcourante = urlcourante.replace (/\/$/, "");
        // Garder dans la variable queue_url uniquement la portion derrière le dernier slash de urlcourante
        let queue_url = urlcourante.substring (urlcourante.lastIndexOf( "/" )+1 );
        //Créer et mettre à jour l'imput caché qui informera le serveur lors du traitement du formulaire de recherche
        let myinput = document.createElement ("input");
        let libelleracine = "racine";
        myinput.setAttribute("name", libelleracine);
        myinput.setAttribute("type", "hidden");
        myinput.setAttribute("value", queue_url);
        //Insérer l'input caché dans le formulaire du 1er bloc Recherche appartenant à la classe racine-de-recherche
        currentInput[0].parentElement.appendChild (myinput); 
        //Indiquer le périmètre de la recherche dans le label du bloc Recherche
        document.getElementsByClassName("wp-block-search__label")[0].innerHTML = 'Recherche sur le thème "'+queue_url+'"';
    }
}

Etape 4 : limiter les pages dans lesquelles chercher avant d’effectuer la recherche

Avant de récupérer les pages contenant le mot recherché, la fonction ma_recherche_filter est utilisée pour reparamétrer la requête de la Recherche ; ce qui consiste à :

  1. Constituer la liste des pages à exclure en dernier recours
  2. Vérifier si le formulaire contient un input caché
  3. S’il n’y a pas d’input caché on se contente de reparamétrer la requête en fournissant la liste des pages à exclure
  4. S’il y a un input caché, que ce soit une catégorie d’articles ou une page parent, c’est le même principe ; par exemple, pour une page parent, cela consiste à :
  5. Récupérer la page parent indiquée dans l’input caché
  6. Récupérer les pages filles de cette page parent
  7. Constituer la liste des id de ces pages filles
  8. Reparamétrer la requête pour qu’elle se limite à rechercher parmi les pages filles dont on fournit le tableau des id
  9. S’il n’y a pas de pages filles, on reparamètre la requête pour qu’elle exclue toutes les pages et articles du site (cela afin d’éviter qu’un internaute contourne les restrictions en fabriquant une URL appropriée).
PHP : fonction ma_recherche_filter
//Je demande que la fonction ma_recherche_filter soit utilisée (add) avant (pre) de récupérer (get) les page HTML (posts) pour filtrer (filter) le résultat de la Recherche (add_filter ('pre_get_posts', etc. :

add_filter('pre_get_posts','ma_recherche_filter');

function ma_recherche_filter( $query )
{
    //Les id des pages de test à exclure :
    $pagesAExclureTests = array(13584);
    //Les id des pages particulières à exclure :
    $pagesAExclureSpeciales = array();
    //Les id des pages filles à exclure qui parlent de WP :
    $pagesAExclureWordPress = array(13650, 13743, 13759, 13779, 13797, 13825, 13878, 14009, 14270, 14470, 14489, 14739, 14907, 14926, 15014, 15054, 15184, 15295, 15427, 15436, 16804, 18035, 18347, 18978);
    //Tableau complet des id de toutes les pages HTML à exclure :
    $pagesAExclure = array_merge ($pagesAExclureTests, $pagesAExclureSpeciales, $pagesAExclureWordPress);

    $libelleracine = "racine";
    $libelleracine2 = "categorie";

    //Si l'on n'est pas dans WP-admin :
    if(!is_admin() && $query->is_main_query()){
        //Si la requête concerne une recherche :
        if ( $query->is_search ){ 
            //Si le formulaire contient un champ "racine" et qu'il n'est pas vide :
            if (isset($_GET[$libelleracine]) and $_GET[$libelleracine] != "" ) {
                //On récupère l'objet associé à la page racine :
                $mypost = get_page_by_path ($_GET[$libelleracine], '', 'page');
                //On récupère les pages fille de cette page racine :
                $mypages = get_pages (array ('child_of' => $mypost->ID, 'sort_column' => 'post_date', 'sort_order' => 'desc'));
                //S'il existe des pages filles :
                if(count($mypages) >0){
                    //On met dans un tableau l'id de chacune des pages filles :
                    foreach($mypages as $myPage) $pagesAInclure[] = $myPage->ID;
                    //On paramètre la requête pour qu'elle se limite à rechercher parmi les pages (filles) dont on fournit le tableau des id :
                    $query->set ('post__in', $pagesAInclure);
                } else{
                    //On paramètre la requête pour qu'elle exclue toutes les pages et articles (dont je fourni le tableau des id) :
                    $toutesLesPages = get_pages();
                    foreach($toutesLesPages as $unePage) $pagesAExclure2[] = $unePage->ID;
                    $toutsLesArticles = get_posts (array ('numberposts' => -1));
                    foreach ($toutsLesArticles as $unArticle) $articlesAExclure[] = $unArticle->ID;
                    $pagesAExclure3 = array_merge ($pagesAExclure2, $articlesAExclure);
                    $query->set ('post__not_in', $pagesAExclure3);
                }
            }
            else if (etc. //le formulaire contient un champ "categorie" qui n'est pas vide : traitement du cas d'une catégorie d'articles similaire à celui d'une page parent
            } //Fin du traitement d'une catégorie d'articles.

            //Si le formulaire ne contient ni de champ "racine", ni de champ "categorie", non vide :
            else {
                //On paramètre la requête pour qu'elle exclue certaines pages dont on fournit le tableau des id :
                $query->set ('post__not_in', $pagesAExclure);
            }
        }
    }
    //A toute fin utile, la fonction retourne la requête reparamétrée :
    return $query;
} //fin de la fonction ma_recherche_filter

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.

Get 30% off your first purchase

X