Skip to content

Instantly share code, notes, and snippets.

@tomsihap
Last active August 9, 2021 08:21
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save tomsihap/268904d9eee5fccbc6a669105a9a318e to your computer and use it in GitHub Desktop.
Save tomsihap/268904d9eee5fccbc6a669105a9a318e to your computer and use it in GitHub Desktop.
Cours Wordpress : thèmes

Cours Wordpress

Exercice Quelle est la différence entre wordpress.com et wordpress.org ?

Exercice Téléchargez et installez Wordpress depuis https://wordpress.org/download/. Décompressez le fichier dans votre dossier de serveur (htdocs ou www) et suivez les instructions.

Attention à bien préciser le port de la base de données dans l'URL si celui-ci n'est pas 3306 : localhost:8889 par exemple.

Création d'un thème

Documentation : https://developer.wordpress.org/themes/

Composition d'un thème

Documentation : https://developer.wordpress.org/themes/getting-started/what-is-a-theme/ Un thème Wordpress est au moins composé de deux fichiers : index.php style.css

Il peut en contenir d'avantage, notamment des fichiers PHP (fichiers de template, fichiers de fonctions...), des fichiers de localisation, des assets (css/js/images).

Un thème ne doit pas contenir de fonctionnalité : c'est le rôle des plugins ! On doit idéalement pouvoir changer de thème sans qu'une fonctionnalité vienne à manquer.

Exercice : Créez un nouveau dossier dans le dossier wp-content/themes nommé wf3theme. Créez dedans les deux fichiers de base.

Déclaration du thème

Documentation : https://developer.wordpress.org/themes/basics/main-stylesheet-style-css/

Le fichier style.css, obligatoire, doit aussi contenir obligatoirement en haut du fichier ce bloc de commentaires :

/*
Theme Name: WF3Theme
Theme URI: https://wordpress.org/themes/wf3theme/
Author: John Doe
Author URI: https://linkedin.com/in/tomsihap/
Description: Description du thème
Version: 1.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: wf3theme
Tags: one-column, two-columns, right-sidebar, flexible-header, accessibility-ready, custom-colors, custom-header, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, post-formats, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready
*/

Ces informations permettent à Wordpress de détecter correctement les données du thème et de les afficher dans l'interface d'administration.

Exercice : Ajoutez et adaptez ces données à votre fichier style.css. Retrouvez votre thème dans la liste des thèmes de l'interface admin.

Dans le cas où on voudrait modifier un thème existant, on créérait un thème enfant : c'est un thème dans lequel on ajouterait la ligne Template : NomDuThemeParent plutôt que de modifier directement le thème parent.

Fichiers de template

Documentation : https://developer.wordpress.org/themes/basics/template-files/

Documentation : https://developer.wordpress.org/themes/basics/template-tags/

Documentation: https://developer.wordpress.org/themes/basics/linking-theme-files-directories/

Un thème est composé de plusieurs templates (partials), afin de séparer son code et en incluant les portions de pages nécessaires. Comme les deux fichiers obligatoires ne sont que index.php et style.css, si un fichier de template n'est pas présent (par exemple category-$id.php), il va essayer d'afficher le contenu dans un template "parent" : on peut découvrir l'hiérarchie des templates ici : https://wphierarchy.com/ .

Exercice Créez les fichiers template suivants, directement à la racine du thème: header.php, footer.php, sidebar.php.

Exercice

  1. Ajoutez un Bootstrap de base dans index.php
  2. Ajoutez une navbar de Bootstrap de base dans le fichier header.php
  3. Remplissez le footer et la sidebar de données de base (par exemple: une liste dans la sidebar, un paragraphe dans le footer)
  4. Appelez les templates dans index.php grâce aux fonctions suivantes: get_header(), get_sidebar(), get_footer().

Exercice Si je souhaite avoir un fichier template personnalisé, par exemple highlights-products.php, quelle fonction dois-je appeler ? (Réponse dans la doc)

Exercice En utilisant la découpe la plus logique, découpez le thème Blog de Bootstrap (https://getbootstrap.com/docs/4.3/examples/) en plusieurs templates.

Exemple de découpage :

- header.php    // En tête et top-menu
- partials/featured-post.php    // Post en grand en haut
- partials/highlight-posts.php  // Deux posts "featured"
- footer.php    // Pied de page
- main.php      // Contenu principal (articles)
- sidebar.php   // Menu de droite (inclus dans main.php)

Note Le blog Wordpress contient du CSS customisé : nous l'ajouterons juste après !

Ajout du CSS

Documentation : https://developer.wordpress.org/themes/basics/including-css-javascript/

Wordpress a une logique propre à lui pour charger les scripts et styles aux moments opportuns : il faut donc que nous déclarions nos styles auprès de Wordpress afin qu'il les charge au moment voulu.

Pour cela, nous allons créer un fichier functions.php à la racine du projet.

Dans functions.php :

/**
 * Fonction qui empilera nos styles
 */
function wf3_enqueue_styles() {
    wp_enqueue_style( 'wf3-main', get_template_directory_uri() . '/style.css');
}

/**
 * Déclanchement de wf3_enqueue_styles lors du hook "wp_enqueue_styles"
 */
add_action('wp_enqueue_scripts', 'wf3_enqueue_styles');

Ici :

  1. Nous créons une fonction qui appelle wp_enqueue_style(), la fonction Wordpress qui permet d'empiler nos styles dans la queue de chargement des thèmes.

  2. Nous ajoutons notre fonction à un "hook" Wordpress : c'est à dire un écouteur d'évènements. En effet, lorsque Wordpress se charge, il passe par plusieurs évènements, et parmi ceux-ci, l'évènement wp_enqueue_scripts. Nous disons ici à Wordpress d'executer notre fonction lors de ce déclancheur-là.

Exercice Vous pouvez dorénavant modifier style.css et ajouter le CSS propre au thème Blog de Bootstrap.

Exercice Pour dire à Wordpress où afficher la ligne de style dans le HTML, ajoutez la fonction wp_head() dans la balise <header> de votre thème : cela permet d'indiquer à Wordpress où se trouver le header et d'ajouter des informations automatiquement.

Dynamiser le thème : Template Tags

Documentation : https://developer.wordpress.org/themes/basics/template-tags/

Il existe des fonctions permettant d'afficher des données dynamiques, par exemple le titre du site que nous avons configuré dans l'interface admin de Wordpress.

Exercice Ajoutez le titre du site dans la balise <title> grâce à la fonction bloginfo('name').

Vous retrouverez tous les paramètres possibles pour bloginfo() ici https://developer.wordpress.org/reference/functions/bloginfo/ .

Exercice Affichez le titre du blog dans la navbar et rendez le cliquable. L'URL du lien doit être l'URL de la page d'accueil, que vous afficherez grâce à bloginfo() et le bon paramètre permettant d'afficher l'URL de la page d'accueil.

Dynamiser le thème : The Loop

Maintenant que les dépendances sont terminées, nous pouvons dynamiser le thème, c'est à dire utiliser les fonctions Wordpress afin d'afficher les données du blog !

Avant de commencer, veillez à écrire plusieurs articles et plusieurs catégories différents, afin d'avoir du contenu à afficher. Pour rappel, l'admin panel se trouve à [url_du_wordpress]/wp-admin. PRO TIP : Utilisez l'extension FakerPress : générateur de faux posts !

Main: "The Loop"

Documentation: The Loop

Commençons par le main : la partie sous "From The Firehose" qui affichera nos posts. Nous allons utiliser le principe de wordpress The Loop : s'il y a des articles à afficher, et tant qu'il y a des articles, nous instantions un pointeur vers l'article pour afficher l'article.

Dans main.php, à l'endroit où nous affichons les articles :

<?php if ( have_posts() ) : /* S'il y a des articles */ ?>
    <?php while ( have_posts() ) : the_post(); /* Tant qu'il y a des articles : j'instancie le pointeur d'articles (the_post()) sur le post en question */ ?>
        ... Display post content
    <?php endwhile; ?>
<?php endif; ?>

A la place de "... Display post content", nous allons modéliser un article. Vous pouvez donc supprimer les autres articles écrits en dur dans le fichier !

<?php if ( have_posts() ) : ?>
    <?php while ( have_posts() ) : the_post(); ?>
        <div class="blog-post">
            <h2 class="blog-post-title"><?php the_title(); ?></h2>
            <p class="blog-post-meta">Le <?php the_date(); ?> par <a href="#"><?php the_author(); ?></a></p>

            <p><?php the_excerpt(); ?></<p>
        </div><!-- /.blog-post -->
    <?php endwhile; ?>
<?php endif; ?>

Le fichier est considérablement plus petit ! Grâce aux fonctions de The Loop (voir "What The Loop Can Display"), nous avons pu facilement afficher les informations des articles dans notre template.

Nous ne verrons pas la pagination ici, plusieurs façons de faire sont possibles (pages d'articles, flux infini avec AJAX...).

Featured Post: afficher 1 seul post en haut

Pour afficher dans "Featured Post" un seul post, nous allons faire une requête personnalisée afin de n'afficher que les articles ayant le tag "featured". Bien sûr avec ce système, un seul article ne pourra être en tag Featured.

Pour cela, nous allons mettre dans featured-post.php :

$original_query = $wp_query;
$wp_query = null;

$args=array('posts_per_page'=>1, 'tag' => 'featured');
$wp_query = new WP_Query( $args );
if ( have_posts() ) :
    while (have_posts()) : the_post();
        // ... Contenu du post
    endwhile;
endif;

$wp_query = null;
$wp_query = $original_query;
wp_reset_postdata();

Nous créeons une sous-loop qui n'ira chercher qu'un post dans featured. Nous enregistrons la requête du Loop wordpress habituelle dans une variable avant de faire notre requête personnalisée grâce à WP_Query et $args.

Ensuite, nous affichons dans le loop (affichant 1 article, celui avec le tag "featured") le contenu du post (ce loop est facile, à remplir par vous même !). Enfin, nous réinitialisons les données de la requête pour retrouver le Loop qui affichera tous les articles plus bas (dans main.php).

Highlight Posts : afficher 2 posts dans les carrés

Le principe est le même: nous ajoutons le tag "highlight" à deux articles, lesquels s'afficheront dans les 2 cadres. Voici l'exemple de ce loop (dans highlight-posts.php) :

    <div class="row mb-2">
        <?php

        $original_query = $wp_query;
        $wp_query = null;

        $args=array('posts_per_page'=>2, 'tag' => 'highlight');
        $wp_query = new WP_Query( $args );
        if ( have_posts() ) :
            while (have_posts()) : the_post(); ?>

                <div class="col-md-6">
                        <div class="card flex-md-row mb-4 shadow-sm h-md-250">
                            <div class="card-body d-flex flex-column align-items-start">
                                <strong class="d-inline-block mb-2 text-primary"><?php the_category(' '); ?></strong>
                                <h3 class="mb-0">
                                    <a class="text-dark" href="#"><?php the_title();?></a>
                                </h3>
                                <div class="mb-1 text-muted"><?php the_date(); ?></div>
                                <p class="card-text mb-auto"><?php echo strlen(get_the_excerpt()) > 50 ? substr(get_the_excerpt(), 0, 50) . '...' : get_the_excerpt(); ?></p>
                                <a href="#">Lire plus</a>
                            </div>
                            <img class="card-img-right flex-auto d-none d-lg-block" data-src="holder.js/200x250?theme=thumb" alt="Card image cap">
                        </div>
                    </div>
        <?php  endwhile;
        endif;

        $wp_query = null;
        $wp_query = $original_query;
        wp_reset_postdata();
        ?>

    </div> <!-- /div.row mb-2 -->
</div> <!-- /div.container de header.php -->

Ajout d'une sidebar

La sidebar est un élément dynamique géré par Wordpress: en effet, on doit être capable de détecter cette zone afin d'y ajouter des widgets via le back-office. Pour cela, dans functions.php, on déclare la zone Sidebar :

function tt_register_sidebars() {
    /* Register the 'primary' sidebar. */
    register_sidebar(
        array(
            'id'            => 'primary',
            'name'          => __( 'Primary Sidebar' ),
            'description'   => __( 'A short description of the sidebar.' ),
            'before_widget' => '<div class="p-3 widget %2$s">',
            'after_widget'  => '</div>',
            'before_title'  => '<h4 class="font-italic">',
            'after_title'   => '</h4>',
        )
    );
    /* Repeat register_sidebar() code for additional sidebars. */
}
add_action( 'widgets_init', 'tt_register_sidebars' );

Ici, on a adapté les éléments before/after_widget et before/after_title de telle sorte que nous collions au plus près à la sidebar d'exemple !

Le fichier sidebar.php, auquel on enlève les faux widgets, va appeler la sidebar dynamique (nommée "primary" lors de la déclaration) :

<aside class="col-md-4 blog-sidebar">

    <div class="p-3 mb-3 bg-light rounded">
        <h4 class="font-italic">About</h4>
        <p class="mb-0">Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus
            sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>
    </div>

    <?php if ( is_active_sidebar( 'primary' ) ) : ?>
        <?php dynamic_sidebar( 'primary' ); ?>
    <?php endif; ?>

</aside><!-- /.blog-sidebar -->

Pour tester les widgets, on peut aller dans le back-office Wordpress et ajouter à la sidebar le widget "Archives". Néanmoins la liste des mois s'affichera dans une ul/li classique (liste à points + padding), on peut éditer le style de .widget-archive pour corriger cela dans style.css:

.widget_archive > ul {
    padding: 0;
    list-style-type: none;
}

5. Gestion des pages Articles

Documentation: Template Hierarchy

On va ajouter les liens dynamiques aux articles afin de rediriger vers une page d'articles. Les pages d'articles retombent (fallback) vers la page single.php si elle existe, on va donc la créer afin d'afficher les articles.

Ajout des liens

main.php

Pour ajouter le lien d'un article quand on est dans une Loop, on peut utiliser the_shortlink(). Il va le nom du lien en paramètre à cette fonction car par défaut, elle affiche "This is the short link." , on peut faire par exemple dans main.php :

...
<h2 class="blog-post-title"><?php the_shortlink(get_the_title()); ?></a></h2>
...

featured-post.php et highlight-posts.php

Pour ces deux fichiers, on va faire de même avec le lien "Lire plus" :

// featured-post.php
...
<p class="lead mb-0"><a href="#" class="text-white font-weight-bold"><?php the_shortlink('Lire plus...'); ?></a></p>
...
// highlight-posts.php
...
<p class="card-text mb-auto"><?php echo strlen(get_the_excerpt()) > 50 ? substr(get_the_excerpt(), 0, 50) . '...' : get_the_excerpt(); ?></p>
<?php the_shortlink('Lire plus'); ?>
...

Page d'article

Dans single.php, on va prendre le template de index.php qu'on adaptera (nous retirerons les parties featured-post et highlight-posts et la sidebar par exemple) :

<?php get_header(); ?>

    <main role="main" class="container">
    <div class="row">
        <div class="col-md-12 blog-main">

            <?php if ( have_posts() ) : /* S'il y a des articles */ ?>
                <?php while ( have_posts() ) : the_post(); /* Tant qu'il y a des articles : j'instancie le pointeur d'articles (the_post()) sur le post en question */ ?>
                    <div class="blog-post">

                        <h2 class="blog-post-title"><?php the_shortlink(get_the_title()); ?></a></h2>
                        <p class="blog-post-meta">Le <?php the_date(); ?> par <a href="#"><?php the_author(); ?></a></p>

                        <p><?php echo get_the_content(); ?></p>
                    </div><!-- /.blog-post -->
                <?php endwhile; ?>
            <?php endif; ?>

    </div><!-- /.row -->

</main><!-- /.container -->

<?php get_footer(); ?>

Autres développements

Maintenant que vous avez un thème basique qui fonctionne, vous pouvez parcourir la documentation (et Google !) pour ajouter d'autres features propres à vos besoins.

Création de plugins

Documentation : https://developer.wordpress.org/plugins/

La raison d'être d'un plugin est avant tout d'ajouter des fonctionnalités sans jamais toucher au noyau de Wordpress : de la même manière qu'un thème est un module indépendant, les plugins sont des modules indépendants du noyau Wordpress, qui peut se mettre à jour de façon autonome puisqu'on n'en touche pas les fichiers.

Création de plugin

Documentation https://developer.wordpress.org/plugins/plugin-basics/

Un plugin contient au minimum :

  • un plugin Header, qui déclare le plugin
  • des fonctions PHP, qui sont les fonctions propres au plugin
  • des hooks, pour attacher les fonctions du plugin à des évènements Wordpress, et donc déclancher le plugin en temps voulu

Exercice Créez un nouveau dossier wf3 dans le dossier wp-content/plugins. Dans ce dossier, créez le fichier plugin-wf3.php.

Exercice Dans ce fichier, nous allons déclarer le plugin (comme nous l'avons fait dans style.css pour les thèmes) :

<?php
/**
 * Plugin Name: YOUR PLUGIN NAME
 */

Tous les champs disponibles sont listés ici : https://developer.wordpress.org/plugins/plugin-basics/header-requirements/

Dorénavant, le plugin devrait apparaître dans l'interface d'administration de Wordpress !

Hooks

Documentation : https://developer.wordpress.org/plugins/plugin-basics/activation-deactivation-hooks/ Documentation : https://developer.wordpress.org/plugins/plugin-basics/uninstall-methods/ Plusieurs hooks peuvent être utilisés pour la création du plugin :

activation_hook qui se déclanche lorsque l'on active le plugin depuis le back-office. Il peut par exemple créer des tables en base de données, mettre en place des variables et des constances...

register_activation_hook( __FILE__, 'fonction_à_lancer' );

desactivation_hook est l'évènement qui se déclanche lorsque l'on désactive le plugin. On peut par exemple désactiver des fonctions, supprimer des données... Tout ce qui est nécessaire lorsque le plugin se désactive.

register_deactivation_hook( FILE, 'fonction_à_lancer' );

uninstall_hook se déclanche lorsque l'on supprime le plugin : on peut par exemple supprimer toutes les données qui ont été créées lors de l'activation_hook.

register_uninstall_hook(__FILE__, 'fonction_à_lancer');

Ajouter des hooks

Notre plugin ajoutant des fonctionnalités, on peut bien sûr déclarer de nouveaux évènements propres à notre plugin, grâce à la méthode do_action() https://developer.wordpress.org/reference/functions/do_action/ .

Exercice : création d'un plugin de renommage

Nous allons créer un plugin qui va nous permettre de renommer des mots dans nos articles, évitant les fautes d'orthographe. Par exemple, dans nos articles, le mot wordpress sera renommé en WordPress, Facbeook en Facebook...

1. Création du dossier du plugin

Exercice Créez le dossier du plugin, et déclarez le plugin correctement.

2. Création d'une fonction de renommage

Créez une fonction nommée wf3_wordpress_typo_fix( $text ), qui va prendre en paramètres $text, rechercher grâce à str_replace si la variable $text contient le mot wordpress, et le remplacer par WordPress.

Pensez à consulter la documentation de PHP pour str_replace !

3. Ajoutez un hook pour déclancher la fonction lorsque l'on utilise the_content() :

Après avoir déclaré votre fonction, vous ajouterez la ligne :

add_filter( 'the_content', 'wf3_wordpress_typo_fix' );

Ce qui déclanchera votre fonction lors du hook the_content.

Différence entre add_action et add_filter ? Techniquement, les deux fonctions font la même chose, c'est à dire de déclancher une fonction lors d'un hook. La différence est sémantique : add_action est plutôt lors d'une action effectuée (chargement des scripts, publication d'un article...), add_filter est plutôt lorsque l'on agit sur une valeur (the_content par exemple).

4. Ajouter d'avantage de mots

En créant deux arrays, un array de mots incorrects, un array de mots modifiés, vous allez améliorer votre fonction de sorte à ce que str_replace corrige non pas que wordpress, mais la liste de mots de vos arrays.

5. Testez votre plugin

Activez le plugin et testez-le ! Pour voir si tout fonctionne, il va falloir créer un article avec les mots erronés et voir s'ils se sont corrigés grâce au plugin.

Correction

Exercice 2 : fonction de renommage

function wf3_wordpress_typo_fix( $text ) {

    return str_replace('wordpress', 'WordPress', $text);
}

Exercice 3 : Appel du hook

add_filter('the_content', 'wf3_wordpress_typo_fix');

##Exercice 4 : Ajouter d'avantage de mots

function wf3_words_typo_fix( $text ) {

    $wrong = ['facbeook', 'gogole', 'wordpress'];
    $right = ['Facebook', 'Google', 'Wordpress'];
    return str_replace($wrong, $right, $text);
}

add_filter('the_content', 'wf3_words_typo_fix');

Utilisation de la base de données

Nous allons utiliser le activation_hook afin de créer une table dans la base de données de Wordpress lors de l'activation du plugin, qui contiendra un dictionnaire de mots à remplacer.

Création de la fonction qui crééra la table

function wf3_install_plugin() {

    global $wpdb;

    $tableName = $wpdb->prefix. "words";
    $sql = "CREATE TABLE IF NOT EXISTS `".$tableName."` ( `id` INT NOT NULL AUTO_INCREMENT , `wrongword` VARCHAR(150) NOT NULL , `okword` VARCHAR(150) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;";

    require_once( ABSPATH . "/wp-admin/includes/upgrade.php");
    dbDelta($sql);
}
  1. On appelle la variable $wpdb qui contient le pointeur de base de données
  2. On prépare le nom de notre table : ce sera le préfixe des tables wordpress (stocké dans $wpdb->prefix) + le nom de notre table.
  3. On prépare la requête qui crééra la table : elle aura un id (AI PK), un champ wrongword (VARCHAR 150) et un champ okword (VARCHAR 150)
  4. On importe un fichier contenant une fonction qui communique à la base de données
  5. On appelle la fonction qui communique à la base de données (dbDelta())

Maintenant notre fonction prête, on va l'ajouter au hook register_activation_hook() :

register_activation_hook(__FILE__, 'wf3_install_plugin');

Ca y est : lorsque nous activerons notre plugin (ou désactiver + réactiver), la table sera créée !

Lecture de la table

Nous avons maintenant besoin de lire dans la base de données les mots du dictionnaire de correction : on va améliorer notre fonction de correction de mots de sorte à ce que nous ne lisions plus dans un array écrit "en dur" mais bien dans la base de données :

function wf3_wordpress_typo_data( $text ) {

    global $wpdb;

    $tableName = $wpdb->prefix . "words";
    $request = "SELECT * FROM " . $tableName;

    $results = $wpdb->get_results($request);

    $wrong = [];
    $right = [];

    foreach ($results as $r) {
        $wrong[] = $r->wrongword;
        $right[] = $r->okword;
    }

    return str_replace($wrong, $right, $text);
}

On a simplement qu'à utiliser la méthode $wpdb->get_results() pour exécuter une requête SQL ! Maintenant que l'on a notre donnée, on la traite dans un foreach afin d'avoir nos deux tableaux de mots $wrong et $right.

Il ne nous reste plus qu'à appeler la fonction lors du filter the_content :

add_filter('the_content', 'wf3_wordpress_typo_data');

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment