#!/usr/bin/env python3
"""Brouillon pilier « Développeur / architecte / expert e-commerce 2026 »."""

from __future__ import annotations

import json
import sys
import urllib.parse
import urllib.request
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "scripts"))

from article_studio.config import load_config  # noqa: E402
from article_studio import wp_client  # noqa: E402

BASE = "https://www.arnaud-merigeau.fr"

TITLE = (
    "Développeur, freelance, architecte ou expert e-commerce : "
    "qui appeler (et où le trouver) en 2026 ?"
)
SLUG = "qui-appeler-developpeur-ecommerce-2026"
YOAST_TITLE = "Développeur e-commerce : freelance, architecte ou expert ?"
YOAST_DESC = (
    "Où trouver un développeur e-commerce en 2026 ? Grille freelance, architecte "
    "et expert — Malt vs contact direct, 7 signaux, et comment me joindre."
)
FOCUS = "développeur e-commerce"
EXCERPT = (
    "Tu cherches un développeur e-commerce, un freelance, un architecte ou un "
    "expert. Malt et Codeur te noient. Voici qui appeler, où le trouver, "
    "et quand m'écrire — PrestaShop, WordPress, WooCommerce."
)
POST_ID = 16101
FEATURED_ID = 16100

CONTACT = f"{BASE}/contact/"
PS = f"{BASE}/freelance-prestashop/"
WP = f"{BASE}/freelance-wordpress/"
WOO = f"{BASE}/freelance-woocommerce/"
REAL = f"{BASE}/realisations/"
TICKET = f"{BASE}/produit/ticket-intervention-prestashop-wordpress/"
PS9 = f"{BASE}/prestashop-9/"
PS92 = f"{BASE}/prestashop-9-2-onepage-checkout-ask-ai-extra-properties/"
FE = f"{BASE}/facturation-electronique-prestashop-wordpress-2026/"
MIGRATION = f"{BASE}/migration-prestashop-1-7-vers-9-sans-perdre-seo/"
PHP84 = f"{BASE}/compatibilite-php-8-4-plugins-wordpress/"
AI = f"{BASE}/ai-assisted-development-prestashop-9/"
OLD = f"{BASE}/5-bonnes-raisons-de-choisir-un-freelance-pour-votre-projet-prestashop-ou-wordpress/"
AQUA = f"{BASE}/portfolio/aquadiveshop-optimisation-prestashop/"
ARTICLE_URL_PLACEHOLDER = f"{BASE}/{SLUG}/"

IMG_HERO_LOCAL = ROOT / "assets" / "developpeur-architecte-expert-ecommerce-2026-featured.png"
IMG_BO = f"{BASE}/wp-content/uploads/2025/06/tableau-bord-prestashop-9-scaled.png"
IMG_FE = f"{BASE}/wp-content/uploads/2026/06/featured-export-comptable-article-2026-dark-1.png"

CATEGORY_IDS = [2, 44]  # PrestaShop, E-commerce — WordPress ajouté dynamiquement
TAG_NAMES = [
    "développeur e-commerce",
    "freelance e-commerce",
    "architecte e-commerce",
    "expert e-commerce",
    "développeur freelance prestashop",
    "freelance wordpress",
    "freelance woocommerce",
]


CONTENT = f"""
<p>Tu tapes <strong>développeur e-commerce</strong>, <strong>freelance e-commerce</strong>, <strong>architecte e-commerce</strong> ou <strong>expert e-commerce</strong>. Google te sort Malt, Codeur, des agences et quelques pages perso. Toi, tu as une boutique à faire vivre : encaisser, migrer, facturer, rester conforme — sans casser le SEO.</p>
<p>En 2026, le chantier n'est plus « installer un thème ». C'est une <strong>architecture</strong> :</p>
<ul>
<li>la <strong>facturation électronique</strong> (réception dès septembre 2026) ;</li>
<li><strong>PrestaShop 9 / 9.2</strong> (tunnel, modules, Hummingbird) ;</li>
<li>le <strong>bouton de rétractation</strong> (en vigueur depuis le 19 juin) et la <strong>transparence IA</strong> des chatbots (depuis le 2 août) ;</li>
<li>l'<strong>accessibilité</strong>, PHP 8.4, les connecteurs ERP / PDP.</li>
</ul>
<p>Ce guide tranche <strong>qui appeler</strong>, <strong>où le trouver</strong>, et ce que chaque intitulé veut vraiment dire. Mon terrain : PrestaShop, WordPress, WooCommerce — France entière. Si le profil colle, <a href="{CONTACT}">écris-moi</a> avec l'URL de ta boutique.</p>

<!--more-->

<h2>Sommaire</h2>
<ol>
<li><a href="#ce-que-tu-cherches-vs-ce-dont-tu-as-besoin">Ce que tu tapes dans Google vs ce dont tu as vraiment besoin</a></li>
<li><a href="#quatre-intitules">Développeur, freelance, architecte ou expert e-commerce</a></li>
<li><a href="#chantiers-2026">Les 7 chantiers 2026 qu'un plugin ne règle pas</a></li>
<li><a href="#sept-signaux">7 signaux que tu as besoin d'un expert (pas d'un exécutant)</a></li>
<li><a href="#agence-vs-freelance">Agence, freelance, architecte : qui pilote la boutique ?</a></li>
<li><a href="#ou-trouver">Où trouver un développeur e-commerce en 2026</a></li>
<li><a href="#comment-choisir">Comment choisir (grille à envoyer telle quelle)</a></li>
<li><a href="#ce-que-je-fais">Ce que je fais concrètement (et ce que je refuse)</a></li>
<li><a href="#faq-profils">Questions / réponses</a></li>
<li><a href="#conclusion-appeler">Conclusion : le bon appel, maintenant</a></li>
</ol>

<figure class="wp-block-image size-large"><img src="{BASE}/wp-content/uploads/2026/08/developpeur-architecte-expert-ecommerce-2026-featured.png" alt="Développeur, freelance, architecte et expert e-commerce — guide 2026 PrestaShop WordPress WooCommerce" width="1536" height="1024" loading="lazy" /><figcaption>En 2026, le bon prestataire n'est pas « celui qui code le plus vite » — c'est celui qui sait quel rôle jouer sur ta stack.</figcaption></figure>

<h2 id="ce-que-tu-cherches-vs-ce-dont-tu-as-besoin">1. Ce que tu tapes dans Google vs ce dont tu as vraiment besoin</h2>
<p>Deux familles de recherches se mélangent :</p>
<ul>
<li>les <strong>intitulés génériques</strong> : développeur e-commerce, freelance e-commerce, architecte e-commerce, expert e-commerce — tu ne précises pas encore le CMS ;</li>
<li>les <strong>intitulés CMS</strong> : freelance WordPress, développeur PrestaShop freelance, expert PrestaShop, freelance WooCommerce — tu sais déjà sur quoi tu es.</li>
</ul>
<p>Les deux décrivent un <strong>statut</strong> ou une <strong>étiquette</strong>. Presque jamais le <strong>travail</strong>. Or en 2026, le travail a changé de nature :</p>
<ul>
<li>Tu ne « fais pas un site ». Tu fais vivre une <strong>machine à cash</strong> (tunnel, stock, SAV, SEO, pubs).</li>
<li>Tu ne « mets à jour PrestaShop ». Tu changes de socle (Symfony, PHP 8.x, modules cassés, URLs à préserver) — voir la <a href="{MIGRATION}">migration 1.7 → 8/9 SEO-safe</a>.</li>
<li>Tu ne « branches un chatbot ». Tu dois le <strong>déclarer comme IA</strong> dès la première interaction (AI Act, art. 50, en vigueur depuis le 2 août 2026).</li>
</ul>
<p>Résultat : beaucoup de marchands embauchent un développeur pour un ticket, et se retrouvent avec une dette d'architecture. J'en avais déjà parlé en 2012 dans <a href="{OLD}">5 bonnes raisons de choisir un freelance</a> — l'argument « moins cher que l'agence » est toujours vrai, mais insuffisant. Le critère 2026 : <strong>est-ce que cette personne sait dire non, prioriser, et relier le code au CA ?</strong></p>

<h2 id="quatre-intitules">2. Développeur, freelance, architecte ou expert e-commerce</h2>
<p>Les quatre mots se tapent presque comme des synonymes. Ils n'en sont pas. Voici le dictionnaire que je donne à mes clients — tu peux le coller dans un brief.</p>

<h3>Développeur e-commerce</h3>
<p>C'est le <strong>rôle d'exécution</strong> : bug, module, override, thème enfant, hook, API, import catalogue. Indispensable. Insuffisant dès que le chantier touche le tunnel, la data, la conformité ou le SEO. Un bon <strong>développeur e-commerce</strong> livre ce qui est spécifié. Il n'écrit pas forcément la spec.</p>

<h3>Freelance e-commerce</h3>
<p>C'est un <strong>statut</strong>, pas un métier. Un freelance e-commerce peut être junior Malt, intégrateur thème, ou expert certifié. Le mot ne dit rien sur la profondeur. Ce qu'il dit : un interlocuteur unique, peu de frais de structure, une vélocité souvent plus haute qu'une agence. Sur PrestaShop / WordPress / Woo, c'est mon modèle — pages <a href="{PS}">freelance PrestaShop</a>, <a href="{WP}">freelance WordPress</a>, <a href="{WOO}">freelance WooCommerce</a>.</p>

<h3>Architecte e-commerce</h3>
<p>Pas un PowerPoint. L'<strong>architecte e-commerce</strong> dessine la stack avant d'empiler les modules : front, back, data, intégrations, SEO, recette. Tu l'appelles quand trois outils ne se parlent pas, quand tu migres, quand la facturation électronique arrive, quand un override checkout te fait peur. C'est le profil le plus rare — et le plus cher à ne <em>pas</em> avoir au mauvais moment.</p>

<h3>Expert e-commerce</h3>
<p>L'<strong>expert e-commerce</strong> relie le code au métier : tunnel, catalogue, logistique, conversion, process SAV. Ce n'est pas un titre LinkedIn. C'est quelqu'un qui a déjà cassé (puis réparé) des boutiques en production, et qui regarde le taux d'ajout panier avant la palette de couleurs.</p>

<table>
<thead>
<tr><th>Intitulé</th><th>C'est surtout…</th><th>Tu l'appelles quand…</th><th>Piège classique</th></tr>
</thead>
<tbody>
<tr>
<td><strong>Développeur e-commerce</strong></td>
<td>Un rôle (exécution)</td>
<td>Le cadrage est écrit, le risque est localisé</td>
<td>Lui demander d'arbitrer le métier</td>
</tr>
<tr>
<td><strong>Freelance e-commerce</strong></td>
<td>Un statut (indépendant)</td>
<td>Tu veux un interlocuteur unique, pas un organigramme</td>
<td>Croire que « freelance » = senior</td>
</tr>
<tr>
<td><strong>Architecte e-commerce</strong></td>
<td>Un rôle (stack + data + risques)</td>
<td>Migration, ERP, FE, dette, perf, sécurité</td>
<td>Le prendre pour un chef de projet sans code</td>
</tr>
<tr>
<td><strong>Expert e-commerce</strong></td>
<td>Un niveau (métier + techno)</td>
<td>Le CA dépend du site</td>
<td>Le titre sans preuve (portfolio, versions, TMA)</td>
</tr>
</tbody>
</table>
<p>Le bon profil senior, c'est souvent <strong>développeur + architecte + expert, en freelance</strong>. Le mauvais, c'est un développeur vendu comme expert. La question n'est pas « agence ou freelance » — j'y reviens plus bas — c'est « <strong>qui porte les décisions</strong> ».</p>

<h3>Ce que « architecte e-commerce » veut dire sur une boutique</h3>
<p>Concrètement, l'architecture d'une boutique :</p>
<ul>
<li><strong>Front</strong> : thème enfant / Hummingbird, Core Web Vitals, accessibilité EAA, tunnel (4 étapes vs <a href="{PS92}">One Page Checkout natif 9.2</a>).</li>
<li><strong>Back</strong> : modules, overrides, file d'attente, cron, droits, sauvegardes.</li>
<li><strong>Data</strong> : catalogue, stocks, commandes, clients, factures — et bientôt Factur-X / flux PDP.</li>
<li><strong>Intégrations</strong> : paiement, transporteurs, ERP, compta, PIM, marketplaces, pub.</li>
<li><strong>SEO</strong> : URLs, 301, canonical, schema Product, Search Console — le trafic organique est un actif, pas un bonus.</li>
</ul>
<p>Si ton prestataire ne dessine pas ça avant de commit, tu paies deux fois : une fois le développement, une fois le chantier de rattrapage.</p>

<h2 id="chantiers-2026">3. Les 7 chantiers 2026 qu'un plugin ne règle pas</h2>
<figure class="wp-block-image size-large"><img src="{IMG_BO}" alt="Tableau de bord PrestaShop 9 — back-office d'une boutique à piloter, pas seulement à « développer »" width="2560" height="1440" loading="lazy" /><figcaption>PrestaShop 9 : le back-office n'est plus un simple CMS. C'est le cockpit d'une stack (modules, API, tunnel, data).</figcaption></figure>

<h3>1. Facturation électronique (septembre 2026 et après)</h3>
<p>Ni PrestaShop ni WooCommerce ne sortent nativement des factures Factur-X / UBL branchées PDP. C'est un sujet <strong>architecture + compta + module</strong>, pas un réglage. J'ai détaillé la feuille de route dans <a href="{FE}">facturation électronique PrestaShop &amp; WordPress 2026</a>. Si tu attends le 1er septembre pour ouvrir le dossier, tu seras dans la file d'attente des marchands qui découvrent que leur PDF de facture ne suffit plus.</p>

<h3>2. PrestaShop 9 / 9.2 : socle, pas cosmétique</h3>
<p>PHP 8.x, Symfony, Hummingbird, Admin API, puis le <a href="{PS92}">One Page Checkout natif de la 9.2</a>. Les modules 1.7 « qui marchent encore » sont une bombe à retardement. Un développeur peut patcher. Un architecte planifie la bascule sans perdre le SEO — c'est tout le sujet de la <a href="{MIGRATION}">migration 1.7 vers 9</a>.</p>

<h3>3. Bouton de rétractation (depuis le 19 juin 2026)</h3>
<p>Un PDF dans les CGV ou un mail SAV ne suffisent plus : il faut une <strong>fonctionnalité visible</strong> pour exercer le droit de rétractation. Ça touche le thème, le compte client, parfois le module SAV. Ce n'est pas « une mention légale » : c'est de l'UX + du process.</p>

<h3>4. Transparence des chatbots (AI Act, depuis le 2 août 2026)</h3>
<p>Si un visiteur parle à une IA, il doit le savoir <strong>dès le premier échange</strong>, dans l'interface — pas dans les CGV. Modules de chat, reco produits, assistants : audit + mention claire. L'IA t'aide aussi côté dev (j'en parle dans <a href="{AI}">AI-assisted development PrestaShop 9</a>) ; elle ne te dispense pas de la conformité.</p>

<h3>5. Accessibilité (EAA) et perf mobile</h3>
<p>PrestaShop 9.1 a poussé Hummingbird 2.0 côté accessibilité. Côté WordPress, un thème page-builder chargé de 40 plugins, c'est souvent hors-jeu. Un expert e-commerce regarde le <strong>taux d'ajout panier mobile</strong> avant la palette de couleurs.</p>

<h3>6. PHP 8.4 / plugins WordPress</h3>
<p>Le joli site qui « plante après la MAJ PHP de l'hébergeur » : classique. La carte des plugins cassants, je l'ai cartographiée dans <a href="{PHP84}">compatibilité PHP 8.4 des plugins WordPress</a>. Encore une fois : ce n'est pas un ticket, c'est une politique de stack.</p>

<h3>7. Connecteurs métier (ERP, stock, pub, PDP)</h3>
<p>Pennylane, Sellsy, WMS, flux shopping, multi-dépôts… Chaque connecteur mal cadré crée des doublons de commandes, des stocks fantômes ou des factures incohérentes. C'est le cœur du rôle d'architecte — et la raison pour laquelle un TJM « pas cher » finit par coûter un Black Friday.</p>

<figure class="wp-block-image size-large"><img src="{IMG_FE}" alt="Export comptable et facturation : le type de chantier où développeur et expert-comptable doivent parler la même langue" width="1200" height="675" loading="lazy" /><figcaption>Compta, factures, exports : le chantier 2026 où le développeur seul (sans vision métier) te fait perdre des semaines.</figcaption></figure>

<h2 id="sept-signaux">4. 7 signaux que tu as besoin d'un expert (pas d'un exécutant)</h2>
<p>Tu n'as pas besoin d'un architecte pour changer la couleur d'un bouton. Tu en as besoin si tu coches <strong>deux ou plus</strong> de ces signaux :</p>
<ol>
<li><strong>Ton CA dépend du site</strong> — une heure de downtime se voit sur le relevé Stripe / PayPal.</li>
<li><strong>Tu as plus de 3 briques critiques</strong> (CMS + paiement + transporteur + ERP ou compta).</li>
<li><strong>Tu es encore en PrestaShop 1.7</strong> (ou WordPress avec un thème non maintenu) et tu « vas migrer un jour ».</li>
<li><strong>Personne ne sait expliquer le tunnel</strong> : guest checkout, comptes, relances panier, codes promo qui se combinent n'importe comment.</li>
<li><strong>Le SEO a déjà chuté</strong> après une « petite » refonte, ou tu as peur qu'il chute.</li>
<li><strong>Les devis que tu reçois</strong> parlent de pages, pas de risques (301, recette, formation, TMA).</li>
<li><strong>Tu empiles les tickets</strong> au lieu d'avoir une roadmap trimestrielle.</li>
</ol>
<p>Si tu coches surtout le 1 et le 7 : un <a href="{TICKET}">ticket d'intervention</a> peut débloquer l'urgence, puis on enchaîne sur un cadrage. Si tu coches 3 + 5 : on parle migration, pas « un freelance deux jours ».</p>

<h2 id="agence-vs-freelance">5. Agence, freelance, architecte : qui pilote la boutique ?</h2>
<p>La question « agence ou freelance » est mal posée. Voici le vrai tableau.</p>
<table>
<thead>
<tr><th></th><th>Agence web</th><th>Freelance exécutant</th><th>Freelance expert / architecte</th></tr>
</thead>
<tbody>
<tr><td>Interlocuteur</td><td>Commercial → chef de projet → intégrateur</td><td>La personne qui code</td><td>La personne qui code <em>et</em> arbitre</td></tr>
<tr><td>Spécialisation CMS</td><td>Variable (souvent généraliste)</td><td>Souvent une techno</td><td>Profondeur PrestaShop / WP / Woo</td></tr>
<tr><td>Coût de structure</td><td>Élevé (tu le paies)</td><td>Faible</td><td>Faible, TJM plus haut</td></tr>
<tr><td>Projet multi-stakeholders</td><td>Adapté</td><td>Fragile</td><td>OK si un décideur côté client</td></tr>
<tr><td>Migration / FE / ERP</td><td>Si l'équipe a déjà livré ça</td><td>Risqué</td><td>Cœur de métier</td></tr>
<tr><td>Vélocité</td><td>Moyenne (process)</td><td>Haute sur un ticket</td><td>Haute sur un chantier cadré</td></tr>
</tbody>
</table>
<p>Mon avis terrain, après +15 ans et +400 projets : une PME avec un décideur unique gagne presque toujours à prendre un <strong>freelance expert certifié</strong> plutôt qu'une agence qui redistribue le projet à un junior. Une ETI avec DSI, juridique et 4 marques a besoin d'un chef d'orchestre — parfois l'agence, parfois un architecte freelance + tes équipes.</p>
<p>Ce n'est pas du marketing : c'est du coût d'erreur. Un override mal placé sur le checkout PrestaShop, tu le paies à chaque soldes. Un thème WordPress « premium » non enfant, tu le paies à chaque mise à jour.</p>

<h2 id="ou-trouver">6. Où trouver un développeur e-commerce en 2026</h2>
<p>La question « <strong>où trouver un développeur e-commerce</strong> » est celle que se posent les marchands avant même de savoir s'ils ont besoin d'un architecte. Les canaux existent. Ils ne se valent pas.</p>
<table>
<thead>
<tr><th>Canal</th><th>Utile pour…</th><th>Risque</th><th>Mon avis 2026</th></tr>
</thead>
<tbody>
<tr>
<td><strong>Malt, Comet, plateformes</strong></td>
<td>Ticket court, profil filtré, dispo rapide</td>
<td>Course au TJM, peu d'architecture, brief trop court</td>
<td>OK pour un hotfix isolé. Fragile pour une migration ou la FE.</td>
</tr>
<tr>
<td><strong>Codeur.com et mises en concurrence</strong></td>
<td>Comparer des devis vite</td>
<td>Le moins-disant gagne ; la dette arrive au lot 2</td>
<td>Utile pour calibrer un prix. Dangereux comme seul critère.</td>
</tr>
<tr>
<td><strong>LinkedIn / reco / groupes métier</strong></td>
<td>Confiance, preuve sociale</td>
<td>Lent ; qualité très variable</td>
<td>Le meilleur canal si tu sais filtrer (portfolio, versions, TMA).</td>
</tr>
<tr>
<td><strong>Agence web</strong></td>
<td>Gros projet, plusieurs métiers, beaucoup d'interlocuteurs</td>
<td>Tu paies la structure ; le junior peut coder</td>
<td>Justifié en ETI. Souvent trop lourd pour une PME avec un décideur.</td>
</tr>
<tr>
<td><strong>Contact direct (blog, site expert)</strong></td>
<td>Chantier critique : migration, tunnel, FE, ERP</td>
<td>Il faut un brief (URL, version, ce qui bloque)</td>
<td>Le plus rentable quand le CA dépend du site. C'est <a href="{CONTACT}">ma porte d'entrée</a>.</td>
</tr>
</tbody>
</table>
<p>Ce que je ne ferai pas : te dire « n'utilise jamais Malt ». Pour un ticket de 2 jours, une plateforme peut suffire. Ce que je te dis : <strong>ne recrute pas un architecte e-commerce au moins-disant</strong>. La facturation électronique, PrestaShop 9 et un checkout qui encaisse ne se jouent pas à l'heure.</p>
<p>Périmètre honnête : je suis le bon appel sur <strong>PrestaShop, WordPress, WooCommerce</strong>. Si tu cherches un développeur e-commerce Shopify / Magento / Salesforce natif, ce n'est pas moi — et tu perds du temps à me briefer.</p>
<p>Concrètement, pour me trouver : ce blog, les pages <a href="{PS}">PrestaShop</a> / <a href="{WP}">WordPress</a> / <a href="{WOO}">WooCommerce</a>, ou le <a href="{CONTACT}">formulaire</a>. Un message avec l'URL vaut mieux qu'un appel d'offres à 12 prestataires.</p>

<h2 id="comment-choisir">7. Comment choisir un développeur e-commerce (grille à envoyer)</h2>
<p>Grille que tu peux envoyer telle quelle. Si le prestataire élude, tu as ta réponse.</p>
<h3>Questions à poser (et réponses attendues)</h3>
<ul>
<li><strong>Dernière migration PrestaShop 8/9 ou refonte Woo livrée</strong> — URL, version source, ce qui a cassé, comment le SEO a été préservé.</li>
<li><strong>Qui écrit les specs ?</strong> S'il attend un cahier des charges de 80 pages, ce n'est pas un architecte.</li>
<li><strong>Comment il teste</strong> : staging, commandes sandbox, guest vs connecté, mobile réel.</li>
<li><strong>TMA après go-live</strong> : SLA, ce qui est inclus, délai de hotfix.</li>
<li><strong>Modules / plugins</strong> : développe-t-il, ou empile-t-il Addons / CodeCanyon ?</li>
<li><strong>Conformité 2026</strong> : a-t-il un avis sur FE, rétractation, chat IA, EAA — ou il « verra avec le juriste » ?</li>
</ul>
<h3>Red flags</h3>
<ul>
<li>Devis au forfait sans périmètre (nombre de templates, langues, connecteurs, rounds de recette).</li>
<li>« On reprend tes URLs » sans parler de plan de redirections 301 ni de Search Console.</li>
<li>Thème premium + 25 plugins comme unique architecture WordPress.</li>
<li>Aucun accès à un portfolio récent, ou uniquement des captures Figma.</li>
<li>TJM cassé pour une migration critique — tu externalises le risque vers toi.</li>
</ul>
<h3>Green flags</h3>
<ul>
<li>Il te dit <strong>ce qu'il ne fera pas</strong> dans le lot 1.</li>
<li>Il relie chaque ligne du devis à un risque métier (CA, SEO, stock, facture).</li>
<li>Il a des <a href="{REAL}">réalisations</a> dans ta typologie (catalogue, B2B, logistique, contenu).</li>
<li>Il propose un <strong>audit court</strong> avant le grand chantier — pas « on verra en cours de route ».</li>
</ul>
<p>Si tu veux un ordre de grandeur budgétaire PrestaShop (TJM, forfaits, TMA), le pilier tarifs est le complément de celui-ci. Ici, on tranche le <strong>profil</strong>, pas le prix.</p>

<h2 id="ce-que-je-fais">8. Ce que je fais concrètement (et ce que je refuse)</h2>
<p>Je suis Arnaud Mérigeau, freelance PrestaShop &amp; WordPress, certifié Experts, basé à Bordeaux, missions France entière. +15 ans, +400 projets. Je ne vends pas « un site ». Je vends un <strong>pilotage</strong> :</p>
<ul>
<li><strong>Création / refonte</strong> PrestaShop 8/9, WordPress, WooCommerce — thème enfant, tunnel, SEO de base.</li>
<li><strong>Migration</strong> 1.7 → 8/9 sans casser le trafic organique.</li>
<li><strong>Modules et plugins sur mesure</strong>, connecteurs (compta, stock, ERP, search).</li>
<li><strong>Architecture</strong> : recette, perf, sécurité, dette, feuille de route trimestrielle.</li>
<li><strong>TMA</strong> : mises à jour, hotfix, évolutions — pas un sav « on vous rappelle lundi ».</li>
</ul>
<p>Exemple récent : <a href="{AQUA}">AquaDiveShop</a> — optimisation PrestaShop (perf mobile, stabilité, packs saisonniers), pas une refonte cosmétique. C'est typiquement un sujet d'expert e-commerce, pas un ticket « changer le slider ».</p>
<p>Ce que je refuse, pour être clair :</p>
<ul>
<li>les projets où personne côté client ne peut décider ;</li>
<li>les « clones Shopify en PrestaShop pour hier » sans catalogue ni process logistique ;</li>
<li>le bricolage sur une 1.6 / 1.7 sans plan de sortie.</li>
</ul>
<p>Pour démarrer, trois portes d'entrée :</p>
<ol>
<li><a href="{CONTACT}"><strong>Formulaire de contact</strong></a> — URL de la boutique, version CMS, ce qui bloque, deadline. Devis sous 24 h ouvrées.</li>
<li>Pages métiers : <a href="{PS}">PrestaShop</a>, <a href="{WP}">WordPress</a>, <a href="{WOO}">WooCommerce</a>.</li>
<li>Urgence ciblée : <a href="{TICKET}">ticket d'intervention</a>.</li>
</ol>

<h2 id="faq-profils">9. Questions / réponses</h2>
<h3>Où trouver un développeur e-commerce en France ?</h3>
<p>Plateformes (Malt, Codeur) pour un ticket court ; reco / LinkedIn / blog d'expert pour un chantier critique. Si tu es sur PrestaShop, WordPress ou WooCommerce, le plus simple reste de <a href="{CONTACT}">m'écrire</a> avec l'URL — devis sous 24 h ouvrées.</p>
<h3>Quelle différence entre développeur e-commerce et freelance e-commerce ?</h3>
<p>Le premier est un <strong>rôle</strong> (il code). Le second est un <strong>statut</strong> (indépendant). Un freelance e-commerce peut être développeur, architecte ou les deux. Vérifie le niveau, pas l'étiquette.</p>
<h3>C'est quoi un architecte e-commerce ?</h3>
<p>Quelqu'un qui dessine la stack (CMS, data, intégrations, perf, conformité) avant d'empiler des modules. En 2026, facturation électronique, PrestaShop 9 et chatbots IA rendent ce rôle obligatoire dès qu'il y a du CA en jeu.</p>
<h3>Expert e-commerce : ça veut dire quoi concrètement ?</h3>
<p>Pas un badge. Un expert e-commerce relie tunnel, catalogue, logistique, SEO et TMA. Demande une URL livrée récemment, la version CMS, et ce qui a cassé. Sans ça, c'est du marketing.</p>
<h3>Freelance WordPress ou agence : que choisir pour une PME ?</h3>
<p>PME avec un décideur : un <a href="{WP}">développeur WordPress freelance</a> senior est en général plus rapide et plus spécialisé. Structure avec 10 interlocuteurs : agence, ou freelance + un PM interne.</p>
<h3>Je cherche un développeur freelance PrestaShop : par où commencer ?</h3>
<p>Envoie l'URL, la version (1.7 / 8 / 9), et le problème (migration, checkout, module, perf). Évite les briefs « je veux un site moderne ». Ma page <a href="{PS}">freelance PrestaShop</a> liste le périmètre ; le <a href="{CONTACT}">contact</a> lance le devis.</p>
<h3>Interviens-tu sur Shopify ?</h3>
<p>Non, ce n'est pas mon socle. Je me concentre sur PrestaShop, WordPress et WooCommerce — là où +15 ans et +400 projets pèsent vraiment.</p>
<h3>Un ticket d'intervention suffit-il ?</h3>
<p>Oui pour un bug isolé, un module, un hotfix. Non pour une migration, une FE ou une refonte tunnel. Le <a href="{TICKET}">ticket</a> sert d'entrée ; l'architecture se discute ensuite.</p>
<h3>Faut-il déjà être en PrestaShop 9 pour bosser ensemble ?</h3>
<p>Non. Beaucoup de missions commencent précisément parce que tu es en 1.7 ou 8.x. L'objectif, c'est une bascule maîtrisée — pas un saut en bêta 9.2 en production.</p>
<h3>Interviens-tu aussi sur WooCommerce ?</h3>
<p>Oui. Même logique : architecture, tunnel, plugins, PHP, SEO. Détails sur <a href="{WOO}">freelance WooCommerce</a>.</p>
<h3>Tu bosses à distance ou seulement à Bordeaux ?</h3>
<p>France entière, en visio + accès staging. Bordeaux si un atelier physique aide (cadrage, recette). Le code, lui, n'a pas de périphérique.</p>
<h3>Combien de temps entre le premier message et un devis ?</h3>
<p>Objectif : <strong>sous 24 h ouvrées</strong> si tu fournis URL + version + besoin. Un audit plus long (2 à 5 jours) se chiffre à part.</p>

<h2 id="conclusion-appeler">10. Conclusion : le bon appel, maintenant</h2>
<p>Retiens quatre phrases, et tu as l'article :</p>
<ol>
<li><strong>Développeur, freelance, architecte, expert</strong> ne sont pas des synonymes — rôle, statut, stack, niveau.</li>
<li><strong>Où trouver</strong> un développeur e-commerce dépend du risque : plateforme pour un ticket, contact direct pour une boutique qui encaisse.</li>
<li><strong>Le chantier 2026</strong> est d'architecture : FE, PS9, rétractation, IA, PHP, connecteurs.</li>
<li><strong>Le bon profil</strong> est celui qui arbitre, pas seulement celui qui commit.</li>
</ol>
<p>Si tu veux un développeur qui exécute un ticket déjà cadré, dis-le clairement — un <a href="{TICKET}">ticket d'intervention</a> peut suffire. Si tu veux quelqu'un qui te dit « on ne touche pas au checkout avant d'avoir un plan 301 et un staging », alors tu cherches un <strong>architecte / expert e-commerce</strong> en freelance.</p>
<p>C'est exactement le rôle que je prends. <a href="{CONTACT}">Écris-moi</a> avec l'URL de ta boutique : on verra en 20 minutes si c'est un hotfix, une TMA ou une migration — et on ne te vendra pas les trois pour le prix d'un.</p>
"""

SOCIAL_WHO = f"""Je suis Arnaud Mérigeau, freelance PrestaShop & WordPress certifié Experts. +15 ans, +400 projets : développement, architecture e-commerce, migrations et TMA.

Tu veux cadrer un chantier 2026 (PS9, facturation électronique, refonte, TMA) ? Discutons-en.

{CONTACT}
"""

SOCIAL_WHO_X = (
    "Je suis Arnaud Mérigeau, freelance certifié Experts (+15 ans). On en parle ? "
    + CONTACT
)

SOCIAL_LINKEDIN = f"""Tu tapes « développeur e-commerce », « freelance e-commerce », « architecte » ou « expert ».

Google te sort Malt et Codeur. Le vrai sujet, c'est qui pilote ta boutique en 2026 :

→ développeur = exécution
→ freelance = un statut, pas un niveau
→ architecte = stack, data, risques
→ expert = métier + techno, preuves à l'appui

Et « où le trouver » : plateforme OK pour un ticket, contact direct dès que le CA dépend du site (migration, facturation électronique, tunnel).

J'ai posé la grille complète — PrestaShop, WordPress, WooCommerce.

{ARTICLE_URL_PLACEHOLDER}

""" + SOCIAL_WHO

SOCIAL_X = f"""Développeur, freelance, architecte ou expert e-commerce : qui appeler — et où le trouver — en 2026 ?
{ARTICLE_URL_PLACEHOLDER}

""" + SOCIAL_WHO_X

SOCIAL_FACEBOOK = f"""Où trouver un développeur e-commerce en 2026 ?

Malt, Codeur, agence, reco, contact direct : les canaux ne se valent pas. Et « freelance » n'est pas un métier — c'est un statut.

J'ai tranché développeur vs architecte vs expert, avec une grille à envoyer telle quelle (PrestaShop, WordPress, WooCommerce).

{ARTICLE_URL_PLACEHOLDER}

""" + SOCIAL_WHO


def get_or_create_tag(base: str, user: str, password: str, name: str) -> int:
    slug = name.lower().replace(" ", "-")
    lookup = f"{base}/wp-json/wp/v2/tags?slug={urllib.parse.quote(slug)}"
    _, tags = wp_client._request("GET", lookup, user, password)
    if tags:
        return int(tags[0]["id"])
    _, tag = wp_client._request(
        "POST",
        f"{base}/wp-json/wp/v2/tags",
        user,
        password,
        data=json.dumps({"name": name, "slug": slug}).encode("utf-8"),
        headers={"Content-Type": "application/json"},
    )
    return int(tag["id"])


def category_id_by_slug(base: str, user: str, password: str, slug: str) -> int | None:
    lookup = f"{base}/wp-json/wp/v2/categories?slug={urllib.parse.quote(slug)}"
    _, cats = wp_client._request("GET", lookup, user, password)
    if cats:
        return int(cats[0]["id"])
    return None


def save_exports(article_url: str, post_id: int | None = None) -> Path:
    out = ROOT / "exports" / "developpeur-architecte-expert-2026"
    social = out / "social"
    article = out / "article"
    social.mkdir(parents=True, exist_ok=True)
    article.mkdir(parents=True, exist_ok=True)

    (article / "content.html").write_text(CONTENT.strip() + "\n", encoding="utf-8")
    (article / "seo.yaml").write_text(
        "\n".join(
            [
                f"titre_seo: {YOAST_TITLE}",
                f"slug: {SLUG}",
                f"meta_description: {YOAST_DESC}",
                f"focus_keyword: {FOCUS}",
                "categorie_wp: PrestaShop, WordPress, E-commerce",
                f"tags: {', '.join(TAG_NAMES)}",
                f'h1: "{TITLE}"',
                f"excerpt: {EXCERPT}",
                "",
                "variante_titre_seo_2: Où trouver un développeur e-commerce en 2026 ?",
                "variante_meta_2: Malt, Codeur, agence ou contact direct ? Grille freelance / architecte / expert e-commerce — et quand m'écrire.",
                "",
                "variante_titre_seo_3: Freelance e-commerce : développeur, architecte ou expert ?",
                "variante_meta_3: Les 4 intitulés n'ont pas le même job. Compare, évite le moins-disant, contacte un expert PrestaShop / WordPress.",
                "",
            ]
        ),
        encoding="utf-8",
    )

    posts = {
        "linkedin.txt": SOCIAL_LINKEDIN.replace(ARTICLE_URL_PLACEHOLDER, article_url),
        "x.txt": SOCIAL_X.replace(ARTICLE_URL_PLACEHOLDER, article_url),
        "facebook.txt": SOCIAL_FACEBOOK.replace(ARTICLE_URL_PLACEHOLDER, article_url),
    }
    for name, text in posts.items():
        (social / name).write_text(text.strip() + "\n", encoding="utf-8")

    (out / "README.txt").write_text(
        f"Article brouillon développeur / architecte / expert 2026\n"
        f"URL prévue : {article_url}\n"
        f"Post ID : {post_id or 'n/a'}\n\n"
        "Fichiers :\n"
        "- article/content.html\n"
        "- article/seo.yaml\n"
        "- social/linkedin.txt\n"
        "- social/x.txt\n"
        "- social/facebook.txt\n"
        "- featured : assets/developpeur-architecte-expert-ecommerce-2026-featured.png\n",
        encoding="utf-8",
    )
    return out


def resolve_featured_path() -> Path | None:
    if IMG_HERO_LOCAL.is_file():
        return IMG_HERO_LOCAL
    alt = Path(
        "/Users/arnaudmerigeau/.cursor/projects/Users-arnaudmerigeau-Locals-arnaudmerigeau/assets/"
        "developpeur-architecte-expert-ecommerce-2026-featured.png"
    )
    return alt if alt.is_file() else None


def ping_indexnow(article_url: str) -> None:
    key = "5f8e4b8b35b143b988c607967725f4b9"
    payload = {
        "host": "www.arnaud-merigeau.fr",
        "key": key,
        "keyLocation": f"https://www.arnaud-merigeau.fr/{key}.txt",
        "urlList": [article_url],
    }
    req = urllib.request.Request(
        "https://api.indexnow.org/indexnow",
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json; charset=utf-8"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=20) as resp:
            print(f"IndexNow {resp.status} — {article_url}")
    except Exception as exc:  # noqa: BLE001
        print(f"IndexNow ignoré : {exc}")


def main() -> int:
    cfg = load_config()
    base = cfg.wp_base_url.rstrip("/")

    if not cfg.wp_user or not cfg.wp_application_password:
        print("Credentials WP manquants dans .secrets/.env")
        return 1

    print("Catégories…")
    cat_ids = list(CATEGORY_IDS)
    wp_cat = category_id_by_slug(base, cfg.wp_user, cfg.wp_application_password, "wordpress")
    if wp_cat and wp_cat not in cat_ids:
        cat_ids.append(wp_cat)
        print(f"  WordPress id={wp_cat}")

    print("Tags…")
    tag_ids = [
        get_or_create_tag(base, cfg.wp_user, cfg.wp_application_password, t)
        for t in TAG_NAMES
    ]

    payload: dict = {
        "title": TITLE,
        "content": CONTENT.strip(),
        "excerpt": EXCERPT,
        "status": "publish",
        "slug": SLUG,
        "author": cfg.wp_author_id,
        "categories": cat_ids,
        "tags": tag_ids,
        "featured_media": FEATURED_ID,
        "meta": {
            "_yoast_wpseo_title": YOAST_TITLE,
            "_yoast_wpseo_metadesc": YOAST_DESC,
            "_yoast_wpseo_focuskw": FOCUS,
            "_yoast_wpseo_linkdex": "75",
        },
    }

    print(f"Mise à jour + publication du post {POST_ID}…")
    _, post = wp_client._request(
        "POST",
        f"{base}/wp-json/wp/v2/posts/{POST_ID}",
        cfg.wp_user,
        cfg.wp_application_password,
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json"},
    )

    post_id = post.get("id")
    link = post.get("link") or f"{base}/{SLUG}/"
    print(f"Publié — ID {post_id}")
    print(f"Lien : {link}")

    out = save_exports(link, post_id=post_id)
    print(f"Exports : {out}")
    ping_indexnow(link)
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
