Le site

Les réglages du site

Le téléphone, l'adresse, les réseaux sociaux, le pied de page : des données qui n'appartiennent à aucune page. Elles se remplissent une fois et s'affichent partout.

Déclaration

Dans options/site.fields.php, avec exactement la même structure que pour une page :

options/site.fields.php
<?php

defined('ABSPATH') || exit;

return [

    'contact' => [
        'label'  => 'Coordonnées',
        'fields' => [
            'phone'   => ['type' => 'text',     'label' => 'Téléphone'],
            'email'   => ['type' => 'text',     'label' => 'Adresse e-mail'],
            'address' => ['type' => 'textarea', 'label' => 'Adresse postale'],
        ],
    ],

    'social' => [
        'label'  => 'Réseaux sociaux',
        'fields' => [
            'instagram' => ['type' => 'link', 'label' => 'Instagram'],
            'linkedin'  => ['type' => 'link', 'label' => 'LinkedIn'],
        ],
    ],

];

Chaque groupe devient une section de l'écran Réglages du site, dans l'ordre où vous l'avez écrit.

Affichage

Les fonctions sont les mêmes que pour les champs de page, avec un préfixe distinct :

Fonction Rôle
iron_option($chemin) La valeur, échappée
iron_option_has($chemin) Vrai si l'option est remplie
iron_option_image($chemin, $format, $attributs) Une balise image complète
iron_option_image_url($chemin, $format) L'adresse seule
iron_option_link($chemin, $attributs) Une balise de lien complète
iron_option_rows($chemin) Les lignes d'une liste répétable globale
iron_option_is_enabled($groupe) Vrai si la section est activée
iron_option_raw($chemin) La valeur non échappée
templates/footer_on_site.php
<footer class="site-footer">

    <?php if (iron_option_has('contact.phone')) : ?>
        <p><?= iron_option('contact.phone') ?></p>
    <?php endif; ?>

    <nav>
        <?= iron_option_link('social.instagram', ['class' => 'social']) ?>
        <?= iron_option_link('social.linkedin', ['class' => 'social']) ?>
    </nav>

</footer>

Ironframe n'utilise pas les menus natifs de WordPress. Leur écran exige la capacité edit_theme_options, qui ouvre aussi le personnalisateur, les widgets et le changement de thème : la donner au client rouvrirait tout ce que le rôle Client ferme.

À la place, options/header.fields.php déclare le logo du site et une liste répétable de liens.

options/header.fields.php
'header' => [
    'label'  => 'En-tête du site',
    'fields' => [
        'logo'  => ['type' => 'image', 'label' => 'Logo'],
        'items' => [
            'type'      => 'repeater',
            'label'     => 'Menu principal',
            'max'       => 8,
            'label_add' => 'Ajouter une entrée',
            'fields'    => [
                'link' => ['type' => 'link', 'label' => 'Lien'],
            ],
        ],
    ],
],

Le rendu se trouve dans templates/header_on_site.php. À défaut de logo, le nom du site est affiché. Pour ajouter une entrée, le client passe par Réglages du site → En-tête du site ; pour changer la structure du menu, c'est au développeur de modifier le schéma.

Un exemple pris sur ce site

Le menu que vous voyez en haut de page vient de ce répétable. Le gabarit y ajoute une seule chose : la comparaison du chemin de chaque lien avec l'URL courante, pour poser aria-current sur la bonne entrée.

templates/header_on_site.php
// La valeur d'une ligne est déjà échappée : on peut la comparer,
// pas l'afficher sans balise.
$url  = $entree['link']['url'];
$path = trailingslashit(wp_parse_url($url, PHP_URL_PATH) ?: '/');
$attr = ['class' => 'site-nav__link'];

if ($path === $ici) {
    $attr['aria-current'] = 'page';
}

echo iron_row_link($entree, 'link', $attr);

Qui peut y accéder

L'écran est gouverné par une capacité dédiée, iron_edit_options, accordée aux administrateurs, aux éditeurs et au rôle Client.

Ce n'est pas manage_options : le client doit pouvoir changer le téléphone du site sans obtenir au passage l'accès aux réglages de WordPress.

Où c'est stocké

Une entrée par champ dans la table des options, nommée d'après le groupe et le champ, chargée automatiquement. Ces valeurs étant lues sur presque toutes les pages du site, le chargement automatique est ici justifié.