WordPress de A à Z — F comme Functions.php

Voici le 7ème article de la série WordPress de A à Z qui a débuté le 18/03/2011 avec «Créer son site web avec WordPress de A à Z… avec le Codex». «F comme Functions» propose un aperçu des fonctions disponibles dans le fichier functions.php situé à la racine de la plupart des thèmes WordPress, comme c’est le cas dans WordPress Basics, dont je vais m’inspirer dans la suite de cet article. Ce fichier se comporte comme un plugin. Il est chargé pendant la phase d’initialisation de WordPress, à la fois pour les pages internes à l’administration du site et pour les pages visibles pour l’ensemble des visiteurs. Voici le sommaire complet des 26 articles de WordPress de A à Z.

Le fichier functions.php est chargé automatiquement par WordPress lorsqu’il est présent à la racine du thème. Il est utilisé dans plusieurs cas, parmi lesquels :

  • Activation des fonctionnalités du thème prévues par WordPress (menus de navigation, miniatures, formats de billet, en-tête et fond personnalisés, etc.),
  • Définition des fonctions personnalisées pour les intégrer ensuite dans vos modèles de page,
  • Mise en place des options dans la partie administration du site (options de style, de couleur, ajout de menus, modification de variables, etc.)

La souplesse de ce fichier functions.php peut vite se transformer en casse-tête si l’on ne prend pas soin de l’organiser. Sans compter qu’il faut aussi penser à la possibilité de créer un thème enfant. La nouvelle version de WordPress Basics est livrée avec le Child Theme Beyond Basics.

Le fichier functions.php de ce dernier est chargé avant celui qui est présent dans Basics, le thème parent. En effet, contrairement à ce qui se passe pour la feuille de style style.css du thème parent qui est complèment ignorée au bénéfice de celle qui est présente dans le thème enfant, le cas échéant, le fichier functions.php du thème parent est chargé, lui.

Pour ajouter une fonction de votre cru à Beyond Basics, il suffit de la créer dans le fichier functions.php et elle sera chargée comme celles qui se trouvent dans le thème parent.

Pour modifier une fonction existante, il suffira de la déclarer avec le même nom dans votre fichier functions.php et voilà ! Dans WordPress Basics, je vérifie que la fonction n’existe pas déjà avant de l’utiliser grâce à la condition if ( ! function_exists( 'ma_fonction' ) ) :

if ( ! function_exists( 'ma_fonction' ) ) :
    function ma_fonction() {
        [...]
    }
endif;

C’est la même chose si la fonction est injectée via add_action() ou add_filter().

functions.php

Pour des questions de modularité et pour faciliter la maintenance, le fichier functions.php ne comporte que des appels à des fichiers externes situés dans le répertoire inc/ (à partir de la version 0.2.7.1) :

<?php
require( dirname( __FILE__ ) . '/inc/functions-setup.php' );
require( dirname( __FILE__ ) . '/inc/functions-filter-action.php' );
require( dirname( __FILE__ ) . '/inc/functions-display.php' );
require( dirname( __FILE__ ) . '/inc/functions-comment.php' );
?>

functions-setup.php

Ce premier fichier initialise quelques variables (largeur pour la zone de contenu, paramètres pour la traduction du thème) et active les fonctions embarquées dans le coeur de WordPress via la fonction basics_setup(). Voici la liste des fonctionnalités disponibles dans WordPress :

  • La fonction Custom Headers n’est pas incluse dans Basics. Elle sera intégrée plus tard, soit dans Basics, soit dans Beyond Basics, selon la préférence du plus grand nombre.

Rien que de très classique, donc, si ce n’est que j’en ai profité pour renommer le fichier editor-style.css en markup.css via la fonction :

/**
 * Add support to styles the visual editor
 * to match the front theme style
 */
add_editor_style( 'markup' );

functions-filter-action.php

Les filtres et les actions font partie de la boite à outils de l’intégrateur WordPress. Ils permettent de modifier le comportement de WordPress à différentes étapes de son lancement. S’ils sont regroupés dans le même fichier, c’est parce qu’ils appartiennent à la grande famille de la Plugins API. Ce sont des Hooks (crochets) que les développeurs de WordPress ont placé à des endroits stratégiques. Ils fonctionnement globalement de la même manière.

Les filtres

Les filtres sont des accroches (hooks) permettant de modifier les contenus avant de les insérer dans la base de données ou de les afficher dans le navigateur. Il existe de très nombreux hooks disponibles. Parmi les plus utilisés dans un site WordPress, on trouve notamment the_content ou the_excerpt mais aussi body_class qui peut s’avérer très utile.

Grâce à la fonction add_filter() on pourra modifier the_content() comme bon nous semble. L’exemple qui suit modifie la fonction the_content(). Une fois le filtre ajouté, elle affichera une icône au début de chaque article :

add_filter( 'the_content', 'my_the_content_filter', 20 );
function my_the_content_filter( $content ) {
    if ( is_single() )
        $content = sprintf(
        '<img class="post-icon" src="%s/images/post_icon.png" alt="Post icon" title=""/>%s',
        get_bloginfo( 'stylesheet_directory' ),
        $content
    );
    return $content;
}

La suppression d’un filtre s’effectue grâce à la fonction remove_filter().

Les actions

Comme les filtres, les actions sont des hooks disséminés dans le coeur de WordPress qui s’activent à des étapes spécifiques lors de l’affichage d’une page ou d’une action de la part de l’utilisateur connecté à l’administration du site. Ils s’utilisent comme les filtres via la fonction add_action() :

/**
 * Register widgetized area and update sidebar with default widgets
 */
add_action( 'widgets_init', 'basics_widgets_init' );
if ( ! function_exists( 'basics_widgets_init' ) ) :
function basics_widgets_init() {
    register_sidebar( array (
        'name' => __( 'One', 'basics' ),
        'id' => 'war-1',
        'description' => __( 'Widgets Area One', 'basics' ),
        'before_widget' => '<div id="%1$s" class="%2$s">',
        'after_widget' => '</div>',
        'before_title' => '<h2>',
        'after_title' => '</h2>',
    ) );
}
endif;

La suppression d’une action s’effectue grâce à remove_action().

Actions et filtres dans Basics

  • remove_filter() — Supprime la balise <p> dans les catégories ou les tags,
  • basics_page_menu_args() — Affiche un lien vers la page d’accueil dans wp_nav_menu() ,
  • basics_excerpt_length() — Limite l’extrait (the_excerpt) à 52 characters,
  • basics_continue_reading_link() — Affiche un lien « Lire la suite » pour les extraits,
  • basics_auto_excerpt_more() — Remplace « […] » par trois petits points + basics_continue_reading_link(),
  • basics_custom_excerpt_more() — Personnalise le lien « Lire la suite » pour les extraits personnalisés,
  • basics_widgets_init() — Enregistre les zones de widgets,
  • basics_body_class() — Ajoute une classe personnalisée à la fonction body_class(),
  • basics_img_caption_shortcode() — Utilise les balises <figure> et <figcaption> avec le shortcode image,
  • basics_change_mce_options() — Ajoute le support pour la balise <iframe> dans l’éditeur Wysiwyg,
  • basics_jquery() — Charge jQuery dans le footer,
  • basics_scripts() — Charge d’autres scripts dans le footer après jQuery.

functions-display.php

C’est là que j’ai regroupé les fonctions appelées dans les différents fichiers du thème Basics :

  • basics_content_nav() — Liens pages suivantes et précédentes,
  • basics_title() — Optimisation du contenu de la balises <title> (SEO),
  • basics_description() — Optimisation de la balise <meta description> (SEO),
  • basics_section_heading() — Titres de section personnalisés en fonction du contexte d’affichage,
  • basics_posted_on() — Informations présentes dans le <header> des articles,
  • basics_posted_in() — Informations présentes dans le <footer> des articles,
  • basics_favicons() — Affiche les liens des favicons dans les meta tags,
  • basics_extra_head() — Affiche des meta tags personnalisés,
  • basics_i_love_wordpress() — Affiche l’icône du thème Basics dans le footer,
  • basics_search_autofocus() — Affiche l’attribut « autofocus » dans le champs input du formulaire de recherche.

functions-comment.php

Deux fonctions sont chargées de modifier le marquage HTML par défaut pour y ajouter des morceaux entiers de sémantique HTML5 et un peu d’accessiblité avec des petits bouts d’ARIA :

  1. basics_comments() — Contient le modèle pour l’affichage des commentaires et des trackbacks . Elle est utilisée en tant que fonction de rappel de la fonction wp_list_comments.
  2. basics_respond() — Affiche le formulaire permettant de laissser un commentaire.

L ‘idée de base étant d’obtenir un marquage HTML5 pour l’affichage des commentaires avec la balise <article>, mais aussi pour le formulaire permettant aux visiteurs de laisser un commentaire pour profiter des nouveaux champs et attributs de formulaires à la mode de HTML5.

En bref

Ce fichier functions.php s’avère donc très utile. Toutefois, avant de le remplir au maximum, on peut se demander si un ou plusieurs plugins ne serait pas plus adaptés, vu que ce fichier fonctionne grosso modo comme un plugin géant. N’hésitez pas à décortiquer le fichier functions.php de Basics et de Beyond Basics (très léger pour le moment) et à me faire part de vos remarques et suggestions pour améliorer le bouzin 🙂

→ Rendez-vous sur WordPress & Webdesign pour télécharger Basics et Beyond Basics.