Le WordPress d'aujourd'hui, décodé pour les développeurs

SEO & GEO

Exporter un flux produit pour un comparateur d’achat sans extension

Un snippet WP-CLI et une tâche planifiée suffisent à générer un flux XML de produits de sport, sans installer une extension dédiée aux comparateurs.

Par WordPress Développement • 31 août 2022 • 4 min de lecture • Aucun commentaire
Exporter un flux produit pour un comparateur d'achat sans extension

wp comparateur generer-flux --format=xml : c’est la commande qui, une fois écrite, a remplacé une extension tierce jugée trop lourde pour un besoin somme toute simple, sur une boutique d’articles de sport vendant environ 1 400 références sous WooCommerce.

L’équipe technique avait testé plusieurs extensions dédiées aux flux produits pour comparateurs d’achat, mais chacune ajoutait son propre écran d’administration, ses propres tables en base de données et son propre système de mise en cache, pour un besoin qui se résumait en réalité à exporter périodiquement un fichier XML respectant un format documenté par le comparateur cible.

Écrire la commande WP-CLI

Une commande personnalisée s’enregistre facilement via la classe WP_CLI_Command. Elle parcourt le catalogue WooCommerce, filtre les produits publiés et en stock, puis écrit un fichier XML sur le disque :

class Comparateur_Command {
    public function generer_flux( $args, $assoc_args ) {
        $produits = wc_get_products( array(
            'status' => 'publish',
            'limit'  => -1,
            'stock_status' => 'instock',
        ) );

        $xml = new SimpleXMLElement( '<produits/>' );
        foreach ( $produits as $produit ) {
            $item = $xml->addChild( 'produit' );
            $item->addChild( 'id', $produit->get_id() );
            $item->addChild( 'titre', htmlspecialchars( $produit->get_name() ) );
            $item->addChild( 'prix', $produit->get_price() );
            $item->addChild( 'url', esc_url( $produit->get_permalink() ) );
        }

        $xml->asXML( WP_CONTENT_DIR . '/uploads/flux-comparateur.xml' );
        WP_CLI::success( count( $produits ) . ' produits exportés.' );
    }
}
WP_CLI::add_command( 'comparateur generer-flux', 'Comparateur_Command' );

Sur le catalogue testé, la génération complète du fichier prenait deux minutes quarante secondes, un temps largement compatible avec une exécution périodique en arrière-plan.

Pourquoi éviter WP-Cron pour cette tâche

L'essentiel à retenir : Une commande WP-CLI personnalisée pour générer le flux ; Une tâche planifiée système plutôt que WP-Cron ; Un flux XML minimal conforme au format attendu

WP-Cron ne se déclenche qu’à l’occasion d’une visite sur le site, ce qui rend son exécution imprévisible sur un site à faible trafic la nuit, précisément le moment où l’on souhaite générer le flux avant l’import quotidien du comparateur. La solution retenue s’appuie sur une tâche planifiée système, exécutée par l’hébergeur indépendamment du trafic :

0 3 * * * cd /var/www/boutique && wp comparateur generer-flux --format=xml --quiet

Cette ligne, ajoutée à la tâche planifiée du serveur, garantit une exécution chaque nuit à trois heures, quelle que soit l’activité du site à ce moment précis.

Respecter le format attendu par le comparateur

Chaque comparateur d’achat publie ses propres spécifications de flux, avec des champs obligatoires et des champs optionnels. Ignorer un champ obligatoire suffit à faire rejeter l’intégralité du flux lors de l’import. Le tableau suivant récapitule les champs retenus pour ce projet :

ChampObligatoireSource WooCommerce
idOuiget_id()
titreOuiget_name()
prixOuiget_price()
urlOuiget_permalink()
disponibiliteNonget_stock_status()

Le champ disponibilite, laissé de côté dans la première version, a été ajouté après un premier rejet du flux par le comparateur, qui exigeait en réalité ce champ dès qu’un produit passait en rupture temporaire.

Limiter la charge serveur pendant la génération

Sur un catalogue plus large, charger tous les produits en une seule requête wc_get_products() peut solliciter fortement la mémoire disponible. La commande a donc été ajustée pour traiter le catalogue par lots de deux cents produits, en écrivant progressivement dans le fichier plutôt qu’en gardant tout en mémoire :

  • Lecture par lots via le paramètre paged de wc_get_products()
  • Écriture incrémentale dans un fichier temporaire
  • Renommage atomique du fichier temporaire vers le fichier final en fin de traitement

Ce renommage final évite qu’un comparateur ne lise un fichier à moitié écrit si son propre import se déclenche pendant la génération du flux.

Variantes possibles selon les besoins

La même commande peut être déclinée pour générer un format CSV plutôt que XML, ou pour cibler un sous-ensemble de catégories seulement, en ajoutant un paramètre associatif à la commande WP-CLI :

wp comparateur generer-flux --format=csv --categorie=running

Une extension généraliste doit gérer tous les cas possibles. Une commande maison n’a besoin de gérer que le vôtre, ce qui la rend souvent plus rapide à écrire, à lire et à déboguer.

Pour aller plus loin

Ce choix d’une commande WP-CLI plutôt que d’une extension dédiée ne convient pas à tous les contextes : une boutique qui doit alimenter une dizaine de comparateurs différents avec des formats variés gagnera probablement du temps avec un outil déjà conçu pour cette diversité. Mais pour un besoin unique et bien identifié, quelques dizaines de lignes de code suffisent, sans dépendance supplémentaire à maintenir dans la durée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi