Theme Reference
Theme Panel
Site settings page.
Sections
- Admin Panel — Gutenberg, admin bar, dashboard
- Security — XML-RPC, REST API, version hiding
- Extensions — Forms, SMTP, Telegram, reCAPTCHA
- WooCommerce — WooCommerce settings
- Theme Settings — Field backend, migration tools
- Search — Search configuration
Requêtes
Créez des sélections WP_Query / get_terms() réutilisables. Utilisez-les de deux façons : appelez un préréglage de requête depuis un template PHP, ou attachez une Custom Query à un élément de boucle directement via des attributs HTML.
Depuis un template PHP (Query Presets)
Créez un préréglage dans le sous-onglet Post/Term Query Presets, donnez-lui un Query Code, puis appelez-le depuis le code du template :
- Posts:
$q = new WP_Query(tf_get_query('your-code')); - Terms:
$terms = tf_get_term_query('your-code'); - Auto-apply : associez un préréglage à une archive de type de publication ou de taxonomie dans l'onglet « Auto-apply » et il remplace automatiquement la requête principale (via pre_get_posts), sans modifier le template.
Via les attributs HTML (Custom Queries)
Nommez une requête dans le sous-onglet Custom Queries / Term Queries, puis référencez-la sur l'élément de boucle — ou écrivez les arguments en ligne. Seul le premier élément enfant sert de modèle répété.
- Nommée:
<div wp-select="catalog"> … </div>(alias :wp-query-name) - En ligne:
<div wp-query="'post_type'=>'product','posts_per_page'=>8"> - Liste de termes:
<div wp-term-query="'taxonomy'=>'product_cat','parent'=>0">·wp-term-select="name" - WooCommerce:
<div wp-product-query="get_related_products(4)">
Dans la boucle — champs
Sur les éléments à l'intérieur de la boucle, affichez les valeurs avec des attributs WordPress ou des attributs de champ ACF/SCF :
- WordPress:
wp="post-title",wp="post-image",wp="post-link",wp="term-title",wp="term-link" - ACF / SCF:
fld-text,fld-image,fld-link,fld-loop(format alternatif :f_text,f_image,f_loop)
Compatibilité
Le runtime lit trois sources par ordre de priorité : les préréglages TF, puis Query Master (anciens sites importés), puis les requêtes du configurateur hérité. Les nouveaux préréglages sont toujours enregistrés dans le stockage TF ; les données existantes continuent de fonctionner.
Types de publication & taxonomies personnalisés
Enregistrez des types de publication et des taxonomies personnalisés depuis le panneau — chaque ligne du répéteur correspond à un appel d'enregistrement WordPress, sans code.
Types de publication personnalisés
Chaque ligne correspond à register_post_type(). Le champ « Name » est la clé du type de publication (minuscules latines, sans espaces). Définissez les libellés pluriel/singulier/menu, une icône Dashicons, les fonctionnalités prises en charge (titre, éditeur, image mise en avant, …), le slug d'URL de l'archive, REST/Gutenberg, la disponibilité publique, un interrupteur « Archive publique » (désactive le flux /slug/ pour les types de service) — et une « Page d'atterrissage d'archive » facultative qui rend l'archive modifiable (voir la section « Pages d'atterrissage d'archives » ci-dessous).
Taxonomies personnalisées
Chaque ligne correspond à register_taxonomy(). Choisissez hiérarchique (comme les catégories) ou plate (comme les étiquettes), liez-la à un ou plusieurs types de publication, et définissez le slug et la visibilité REST.
Comment ils s'articulent
Les nouveaux types de publication et taxonomies apparaissent automatiquement dans les listes déroulantes des préréglages de requêtes. Les permaliens sont actualisés à l'enregistrement. Les templates suivent les conventions WordPress : single-{type}.php, archive-{type}.php, taxonomy-{taxonomy}.php.
Pages d'atterrissage d'archives
L'URL d'une archive (le blog, le catalogue de la boutique, l'archive d'un type de publication personnalisé) affiche une LISTE de publications — elle n'a pas de page propre, il n'y a donc normalement rien à y modifier. ThemeForge donne à chaque archive une page d'atterrissage : une vraie page de la liste des Pages, dont les champs deviennent le contenu modifiable de l'archive (titre hero, texte d'introduction, images, SEO), tandis que le flux continue d'afficher la liste. Les rédacteurs modifient l'archive comme n'importe quelle autre page.
Comment ça marche
Sur la page d'archive de votre projet Webflow (archive-post, archive-product, archive-{type}), placez les attributs de champ EN DEHORS de la boucle de liste — c'est-à-dire hors de l'élément marqué wp="posts" / wp="products". Ces champs s'attachent automatiquement à la page d'atterrissage dans l'administration et s'affichent depuis elle sur l'URL de l'archive.
- Hors boucle, tout champ à valeur unique fonctionne : fld-text, fld-image, fld-link, fld-bg-image, fld-editor et le reste de la famille fld-*, plus wp="post-title" et wp="post-content", qui affichent le titre et le contenu de la page d'atterrissage elle-même.
- Les champs À L'INTÉRIEUR de la boucle gardent leur sens habituel : ils lisent chaque publication listée, exactement comme avant.
- Les sites multilingues résolvent la page d'atterrissage par langue automatiquement (Polylang / WPML) : chaque langue modifie sa propre traduction de la page.
- SEO : pour les archives de types personnalisés, la page d'atterrissage alimente aussi Yoast — l'archive reçoit son titre SEO et une URL canonique correcte, y compris sur les pages paginées.
Blog
L'atterrissage du blog est la « Page des articles » native de WordPress. Créez une page (par exemple /blog/), assignez-la dans Réglages → Lecture, et les champs placés hors boucle sur le template archive-post s'attachent à cette page — aucune configuration supplémentaire.
archive-postCatalogue WooCommerce
Le catalogue de la boutique utilise la page Boutique de WooCommerce comme atterrissage. Les champs hors de la boucle produits sur le template archive-product s'attachent à la page Boutique et s'affichent sur l'URL du catalogue.
archive-productTypes de publication personnalisés
L'archive d'un type personnalisé n'a pas d'atterrissage natif dans WordPress, ThemeForge en ajoute donc un : créez une page dont l'URL correspond au slug de l'archive (par exemple /portfolio/ pour un type au slug d'archive « portfolio »), puis sélectionnez-la dans la ligne de ce type dans le Theme Panel. L'URL de l'archive continue d'afficher le template du flux, et la page sélectionnée porte ses champs modifiables. Si le template d'archive de votre projet Webflow déclare un groupe de champs, ThemeForge crée (ou adopte) la page d'atterrissage automatiquement — dans chaque langue du site, comme WooCommerce crée sa page Boutique.
archive-{type}La page liée POSSÈDE l'URL de l'archive : renommez la page et l'archive se déplace avec elle (le champ de slug est masqué tant qu'une page est liée). Sans page liée, le slug vient du Theme Panel. La page elle-même n'est jamais affichée directement — c'est la surface d'édition derrière l'archive.
Bon à savoir
- Les champs de groupe hors boucle (répéteur, groupe, contenu flexible, galerie) sont lus depuis la page d'atterrissage comme les champs à valeur unique. La seule exception est un groupe avec loop-mode="0" : l'onglet Journaux du projet le signale comme « archive-scope-unsupported ».
- Un champ placé À L'INTÉRIEUR d'une boucle de liste appartient aux publications listées — déclarez-le sur le template single-{type} correspondant pour qu'il apparaisse sur leurs écrans d'édition.
- Si aucune page d'atterrissage n'est configurée, rien ne casse : l'archive s'affiche exactement comme avant. Vous pouvez l'ajouter à tout moment sans régénérer le thème.
Forms Extension
Built-in form handling.
Features
- SMTP email sending
- reCAPTCHA v3 / v2
- Telegram notifications
- Protection anti-spam sans clé — activée sur les nouveaux sites
- Auto-reply
- JustValidate client-side validation
- CPT
tf_form_entry— submission storage - CSV export
Protection anti-spam
Fonctionne sans clé ni service externe. Sur un nouveau site, elle est active dès le départ ; sur un site qui reçoit déjà des demandes, activez-la avec « Protection de base contre le spam » dans Formulaires → Réglages.
- Écarte les envois qui remplissent un champ piège caché, arrivent sans le script de la page, sont envoyés plus vite qu’une personne ne peut taper, contiennent plusieurs liens ou contournent le captcha image. La fréquence d’envoi depuis une même adresse est limitée.
- Les envois écartés ne sont transmis nulle part : ils restent 30 jours dans le dossier Spam des Entrées, et un envoi écarté par erreur peut être récupéré avec « Pas un spam ».
- Les formulaires propres à WordPress sont protégés par un interrupteur distinct, « Protection anti-spam des formulaires WordPress », activé par défaut : commentaires et avis produits, inscription et réinitialisation du mot de passe. Un commentaire qu’un robot envoie sans ouvrir la page est refusé et n’est enregistré nulle part ; un cas limite va dans Commentaires → Indésirables ; une inscription ou une demande de réinitialisation suspecte est refusée avec une invitation à réessayer. Le formulaire de connexion et les utilisateurs connectés ne sont pas vérifiés.
- Le captcha image parle la langue de la page : les textes se règlent par langue, et il ne dessine que des caractères qu’un visiteur peut taper sans changer de disposition de clavier (lettres ukrainiennes, russes, latines ou chiffres).
Contre les robots conçus pour imiter une personne, utilisez reCAPTCHA avec des clés Google : elle s’active dans les mêmes réglages.
wp-field — une clé de champ qui survit à un renommage
Par défaut, un champ de formulaire est envoyé sous le libellé saisi dans Webflow. Renommez ce libellé plus tard et le modèle d'e-mail ainsi que la table de correspondance qui s'y référaient ne correspondent plus — en silence, car la demande arrive toujours. Marquez le champ (ou son conteneur avec le libellé) : la clé ne dépend alors plus du texte affiché.
<input type="tel" wp-field="phone">
<div class="row" wp-field="phone">
<label for="tel">Téléphone</label>
<input type="tel" id="tel">
</div>
La clé est inscrite dans le champ lors de la génération du thème ; rien à configurer ensuite. Utilisez lettres latines, chiffres, _ et - ; les noms réservés par le système de formulaires sont refusés et consignés dans le journal du projet. Les champs dont le nom est imposé par WordPress ou WooCommerce — commentaires, avis, commande — utilisent leurs propres marqueurs.
Moteur de champs personnalisés
Le thème stocke les champs personnalisés via un moteur compatible ACF. Deux moteurs interchangeables partagent les mêmes champs et données : vous pouvez basculer sans perdre de valeurs.
Deux moteurs, un seul format de données
Secure Custom Fields est utilisé par défaut — une extension WordPress.org gratuite qui se met à jour automatiquement et fournit tous les types de champs d'ACF PRO, sans licence. Vous préférez votre propre ACF PRO sous licence ? Installez-le, le thème le détecte automatiquement.
Options multilingues
Support multilingue intégré pour les options du thème et les champs de page. S'active automatiquement avec Polylang ou WPML.
Fonctionnement
Le thème détecte automatiquement Polylang ou WPML et charge l'intégration appropriée.
- Détection automatique : Polylang (pll_current_language) ou WPML (ICL_SITEPRESS_VERSION)
- Stockage par langue : chaque langue dispose de son propre jeu de valeurs d'options
- Fallback : les champs vides héritent des valeurs de « Tous (par défaut) »
- Drapeaux personnalisés : télécharger des drapeaux depuis la Médiathèque
Gestion des options par langue
Utilisez le sélecteur de langue sur la page d'options pour modifier les valeurs de chaque langue.
| Action | Description |
|---|---|
| « Tous (par défaut) » | Valeurs maîtres. Utilisées comme fallback quand une langue n'a pas de valeur spécifique. |
| Édition par langue | Basculez vers une langue pour modifier ses valeurs. Les champs vides héritent de « Tous ». |
| Héritage | Laissez un champ vide sur la page d'une langue pour utiliser la valeur « Tous (par défaut) » côté public. |
Traduction automatique des champs
Traduction automatique intégrée des valeurs de champs. Disponible dans la barre latérale sur les pages d'édition et d'options.
- Bouton « Traduire » à côté de chaque champ texte
- « Tout traduire » dans la barre latérale — traduit tous les champs d'un coup, y compris les onglets et répéteurs cachés
- Les champs de liens sont ignorés automatiquement (détection par nom et motif URL)
- Pas de clé API requise — utilise le point d'accès gratuit Google Translate
- Champs WYSIWYG (texte riche) supportés — structure HTML préservée
Protected Files
These files are preserved during theme updates.
user-functions.php— Custom PHP functionscss/user.css— Custom CSS stylesjs/user.js— Custom JavaScript
Ordre de chargement CSS : main.css → themeforge.css → user.css.
Import System
Data and media import from pages.json and menus.json.
Import Order (Important!)
- Step 1: Upload images (import_images)
- Step 2: Import data (import_data)
Images must be uploaded before data import.
Import Actions
| Action | Description |
|---|---|
/?action=import_images | Upload all media files |
/?action=import_data | Import all field data |
/?action=import_page_media&slug=X | Upload media for a specific page |
/?action=import_page_data&slug=X | Import data for a specific page |
/?action=import_menu_data | Import all menus |
Source du titre de page
Lors de la création de pages WordPress pendant l'import, le titre est extrait du HTML source par ordre de priorité :
<meta property="og:title">— Open Graph<title>— HTML title tag- Nom du template (ex. « About » de page-about)
Image Filename Resolution
The import system resolves image filenames using a fallback chain:
- URL-decode filename
- Strip Webflow hash prefix
- sanitize_file_name() + DB LIKE query
Import par langue
Ajoutez &lang=xx pour importer les données dans une langue spécifique. La métabox d'import détecte automatiquement la langue de la page.
/?action=import_page_data&slug=theme-options&lang=en| Contexte | Description |
|---|---|
| Options du thème | Enregistre les options avec un suffixe de langue (options_LOCALE_field). Utilisez le sélecteur de langue sur la page Options. |
| Pages | Trouve ou crée la traduction Polylang, importe les données dedans. La page originale est trouvée indépendamment du filtre de langue. |
| Métabox d'import | Sur les pages : détecte la langue du post (pll_get_post_language). Sur les options : lit ?lang= depuis l'URL. |
Référence développeur
Détails techniques pour développeurs et assistants IA. Attributs HTML, types de champs, système de menus, hooks JavaScript, fonctions utilitaires.
Field Types
Correspondance des types de champ ACF / SCF. Chaque type d'attribut correspond à un élément HTML spécifique.
| ACF / SCF Type | Element | Attribute Example |
|---|---|---|
| text | div, span, p, h1-h6 | fld-text="name" |
| textarea | div, p | fld-area="name" |
| wysiwyg | div | fld-editor="name" |
| image | img (src) | fld-image="name" |
| link / url | a (href) | fld-link="name" |
| true_false | wrapper div | fld-show="name" |
| color_picker | any (bg) | fld-bg-color="name" |
| repeater | wrapper div | fld-loop="name" |
| group | wrapper div | fld-group="name" |
| gallery | wrapper div | fld-gallery="name" |
| tab | container div | fld-tab="name" |
Field Groups (wp-fields-group)
The wp-fields-group attribute creates field groups in WordPress admin.
Usage
<div wp-fields-group="Section Name"> ... fields ... </div>- Wraps fields into a named group
- Multiple wp-fields-group groups per page supported
- On theme-options: all groups merge into one container
- Without wp-fields-group: fields generate PHP only
wp-show-editor
Garder l'éditeur de texte WordPress visible sur les pages avec des champs personnalisés.
Utilisation
<body wp-show-editor wp-fields-group="Section">- Placer sur la balise <body> — par défaut, l'éditeur est masqué sur les modèles de pages avec des champs
- Utiliser avec wp-fields-group quand la page a besoin de champs personnalisés ET de the_content()
- Ne s'applique pas aux modèles d'articles (single, single-product) — l'éditeur y reste toujours visible
Compatibilité des données ACF / SCF
Secure Custom Fields est un fork gratuit et compatible d'ACF PRO, maintenu sur WordPress.org. Il est identique au niveau de l'API et stocke les valeurs exactement au même endroit : SCF, ACF PRO et toute donnée ACF existante sont entièrement interchangeables.
Mêmes champs, mêmes données
Changer de moteur ne migre ni ne réécrit jamais votre contenu — les deux moteurs lisent les mêmes clés de champ dans wp_postmeta / wp_options. Les données ACF existantes d'un autre thème ou d'une configuration manuelle sont reprises par nom de champ, quel que soit le moteur qui les a créées.
Données ACF existantes et tierces
Si des données ACF (ou SCF) existent déjà — d'un autre générateur, d'un thème précédent ou d'un groupe de champs manuel — le thème les lit telles quelles par nom de champ. Rien à importer ni à convertir ; les valeurs apparaissent dans l'éditeur sous le moteur actif.
Hooks JavaScript
Fonctions callback personnalisées disponibles dans custom.js. Le thème vérifie ces fonctions et les appelle au moment approprié.
Hooks généraux
| Hook | Quand appelé |
|---|---|
tf_webflow_init() | Après le chargement AJAX du contenu (réinitialisation des interactions Webflow) |
tf_after_filter() | Après le chargement des résultats du filtre AJAX |
Hooks WooCommerce
| Hook | Quand appelé |
|---|---|
tf_cart_data_modify(data) | Avant l'ajout au panier (modifier les données du panier) |
tf_after_add_to_cart() | Après l'ajout du produit au panier |
tf_after_cart_data_modify() | Après la modification des données du panier |
tf_after_variation_change() | Après le changement de variante du produit |
tf_after_recalc_checkout() | Après le recalcul des totaux de la commande |
Définissez ces fonctions dans custom.js. Les anciens noms avec le préfixe wfp_ sont également supportés pour la compatibilité.
Requêtes personnalisées
Créez des requêtes WP_Query et de termes via l'interface du Panneau du thème — sans code.
Requête d'articles
Configuration dans Panneau du thème → Custom Queries. Chaque requête contient : nom, type d'article, articles par page, pagination, filtres de taxonomie.
$args = select_query_by_name('my_query');
$query = new WP_Query($args);Requête de termes
Configuration dans Panneau du thème → Custom Term Queries. Chaque requête contient : nom, taxonomie, hide_empty, orderby, order.
$args = select_term_query_by_name('my_terms');
$terms = get_terms($args);Fonctions utilitaires
Fonctions PHP disponibles dans les templates et user-functions.php.
Général
| Fonction | Retourne |
|---|---|
tf_default_thumbnail() | URL de l'image par défaut (configurable dans les Paramètres du thème) |
tf_declense($n, $f1, $f2, $f5) | Forme plurielle slave : choisir la forme correcte du mot pour un nombre |
tf_num_decline($n, $titles) | Pluriel avec préfixe numérique. Accepte un tableau ou une chaîne séparée par des virgules. |
search_context($chars) | Afficher un extrait de texte autour de la correspondance de recherche |
device_is($type) | Détecter l'appareil : phone, tablet, mobile, desktop, ios, android |
WooCommerce
| Fonction | Retourne |
|---|---|
is_sale() | Si le produit actuel est en promotion |
get_price($type, $format) | Prix du produit : "price", "price_sale", "price_regular". Format : "default", "extreme", "range" |
get_cart_info($info) | Totaux du panier : total_without_discount, total_with_discount, discount_amount, discount_percentage, coupon_discounts |
get_cart_volume() | Volume total du panier en mètres cubes |