WOOT
Plugin WooCommerce qui présente le catalogue de la boutique sous forme de tableaux triables et filtrables, avec ajout au panier sur chaque ligne.
- Première version
- Installations actives
- 1 000+
- Note
- Lire les avis
À propos
WOOT affiche un catalogue WooCommerce sous forme de tableau : une ligne par produit, une colonne pour n'importe quel champ de produit, attribut, taxonomie ou clé méta, et un contrôle d'ajout au panier sur chaque ligne. Les tableaux se configurent dans le panneau d'administration ou se décrivent directement dans un shortcode [woot]. Le même moteur dessine aussi le panier, les listes de variations, les ventes incitatives, les ventes croisées, les produits similaires et les tableaux de produit unique.
La difficulté est qu'une colonne doit faire trois choses : afficher une cellule, trier la requête serveur et servir de filtre. Les produits existent en plusieurs types (simple, variable, groupé, externe, variation) qui se comportent différemment dans une cellule et dans le panier. Toutes les données des tableaux passent par un seul point d'accès AJAX public, qui doit rester utilisable sur de grands catalogues et ne doit exposer ni brouillons, ni types de contenu non publics, ni fichiers du serveur.
Le moteur de tableau dans le navigateur (data-table-23.js) est du JavaScript pur avec des classes ES6 et fetch. Il met les pages en cache selon le hachage de la requête, annule les requêtes périmées, peut basculer un tableau en mode navigateur et l'interroger en SQL sur un tableau JSON, et change la mise en page pour les petits écrans. jQuery ne sert qu'à déclencher les propres événements de panier de WooCommerce.
WOOT · tableaux de produits
ce qui a été résolu
Requêtes de tableau côté serveur
shipped · 2020Ce que cela apporteLes clients paginent, trient et filtrent les tableaux de produits par prix, SKU ou stock dans leur propre langue, et les listes prédéfinies comme les meilleures ventes affichent le nombre exact d'articles.
- Problème
- Chaque changement de page, clic de tri et modification de filtre arrive comme une requête AJAX. Elle doit devenir une seule WP_Query qui respecte la visibilité dans le catalogue, les préréglages du tableau, les filtres, la langue du visiteur et des clés de tri que WP_Query ne gère pas.
- Solution
get_table_data() lit un ensemble de clés de requête sur liste blanche, applique préréglages et filtres comme des transformations des arguments de la requête, corrige le SQL uniquement là où WP_Query est insuffisante, et renvoie les lignes avec un total pour la pagination.
- Stack
Un point d'accès public sert chaque tableau et chaque visiteurListe blanche de clés de requête, nettoyage de chacune selon son type, construction des arguments WP_Query, renvoi des lignes et du total
get_table_data() est enregistrée pour les utilisateurs connectés et anonymes. Elle parcourt $_REQUEST avec un switch et ne garde que les clés connues : post_type, per_page, orderby, order, current_page, table_id, wp_columns_actions, filter_data, filter_provider, fields, lang, predefinition et shortcode_args_set. Les nombres passent par intval, les clés par sanitize_key, les charges JSON par json_decode et un nettoyeur récursif.
Deux de ces clés sont des noms de hooks. wp_columns_actions est passée à apply_filters() pour charger le profil de colonnes, et filter_provider sélectionne le filtre woot_filter_provider_{name} qui ajoute les conditions de filtre. Les deux sont nettoyées comme du texte mais ne sont pas vérifiées par rapport à une liste de noms enregistrés.
La même fonction est appelée depuis PHP avec un tableau pour les tableaux rendus au chargement de la page, de sorte que le chemin serveur et le chemin AJAX partagent une seule implémentation. Chaque ligne est produite en appelant la closure de rendu de chaque colonne demandée, avec l'ID du produit conservé sous pid pour les actions de cellule.
Trier par prix, SKU ou stock revient à trier par postmetaLes colonnes déclarent meta_key et orderby ; la requête fait correspondre les clés de tri à meta_value(_num)
Une entrée de colonne telle que price porte 'orderby' => 'meta_value_num' et 'meta_key' => '_price'. get_table_data() cherche la clé de tri demandée dans le profil de colonnes et réécrit les arguments de la requête à partir de celui-ci.
La liste déroulante de tri utilise ses propres clés (price-desc, sku, stock-desc, sales et ainsi de suite), traduites dans un filtre woot_wp_query_args. Les tris par stock et par total des ventes excluent les produits groupés et externes avec une clause product_type NOT IN, car ces types n'ont pas de valeur de stock ou de ventes propre. Pour les tris de la liste déroulante, le plugin appelle aussi WC()->query->get_catalog_ordering_args(), qui attache les propres clauses de tri de WooCommerce pour la popularité, la note et le prix, de sorte que ces tris correspondent à la page de la boutique.
WP_Query ne sait pas trier par post_statusAttacher un filtre posts_orderby pour cette seule requête et le retirer juste après son exécution
Pour orderby=post_status, une closure est ajoutée à posts_orderby avant WP_Query et retirée après, de sorte que les autres requêtes de la même requête HTTP gardent leur propre tri.
Les préréglages Top-N (meilleures ventes, nouveautés) doivent afficher exactement N produitsPlafonner posts_per_page à N et fixer found_posts à N pour que la pagination ne compte que N articles
Le préréglage des meilleures ventes trie par total_sales et celui des nouveautés par post_date, tous deux avec posts_per_page fixé à N. WP_Query indique found_posts pour tous les produits correspondants ; après la requête, found_posts est donc ramené à la limite du préréglage et la pagination n'affiche que les N premiers.
Les préréglages ont besoin d'inclure et d'exclure selon plusieurs taxonomiesAnalyser une chaîne de règle compacte en un tax_query imbriqué ; inverser la relation pour l'exclusion
Une règle de préréglage est stockée sous forme de chaîne comme product_cat:25,26|pa_color:19|rel:AND. get_by_taxonomy() la transforme en un groupe tax_query imbriqué et ignore les taxonomies qui n'existent plus.
Pour la variante d'exclusion, chaque clause utilise NOT IN et la relation est inversée (AND devient OR et inversement), ce qui est la loi de De Morgan : exclure les produits qui correspondent à A et B revient à garder ceux qui sont hors de A ou hors de B. Les préréglages de SKU font correspondre le SKU d'une variation à l'ID de son produit parent, car le tableau liste les produits parents.
Les requêtes admin-ajax perdent la langue du visiteurEnvoyer la locale avec chaque requête et basculer WPML dessus avant d'interroger et de rendre
admin-ajax.php s'exécute en dehors du contexte de langue du front-end. draw_table_data() écrit get_locale() dans le JSON du tableau, le navigateur le renvoie sous lang, et get_table_data() le fait passer par le filtre woot_current_lang.
La classe de vocabulaire s'accroche à ce filtre et appelle $sitepress->switch_lang(), de sorte que WP_Query renvoie les produits dans la bonne langue. Les titres de colonnes et les libellés sont traduits par WOOT_Vocabulary::get() à partir de la table propre au plugin, chargée une fois par requête et indexée par locale.
Modèle de colonnes
shipped · 2020Ce que cela apporteLe propriétaire choisit quels détails de produit apparaissent comme colonnes du tableau, y compris les champs personnalisés de la boutique, et peut copier ou déplacer les configurations de tableau.
- Problème
- Une colonne est plus qu'une cellule. Le même champ doit s'afficher pour chaque type de produit, piloter le tri et apparaître comme widget de filtre, et les propriétaires de boutique ajoutent leurs propres taxonomies et clés méta.
- Solution
Chaque tableau fonctionne avec un profil : un tableau de descripteurs de champs dont les closures affichent la cellule, modifient les arguments de WP_Query pour le filtrage et décrivent le widget de filtre. Les taxonomies et les clés méta sont ajoutées au profil à l'exécution.
- Stack
Une définition de champ doit piloter la cellule, le tri et le filtreProfil de descripteurs avec des closures de rendu, d'arguments de filtre et d'interface de filtre pour chaque champ
WOOT_WooCommerce::action() renvoie le profil. Chaque clé est un champ avec un titre, une closure action qui affiche la cellule pour un ID de produit, des données de tri (order, orderby, meta_key) et, pour les champs filtrables, des closures get_filter_query_args et get_filter_draw_data. L'indice 0 contient les réglages du tableau : type de contenu, statuts autorisés, fournisseur de filtre.
Les profils sont enregistrés par nom et résolus avec apply_filters sur l'action du tableau. Le panier, les variations, la vue de produit unique et même les écrans d'administration du plugin (liste des tableaux, clés méta, vocabulaire) tournent sur le même moteur avec leurs propres profils.
Chaque taxonomie et attribut de produit doit pouvoir être une colonneColonnes issues de get_object_taxonomies('product') moins les internes, affichées comme arbres de termes
product_type, product_visibility, product_shipping_class et translation_priority de WPML sont retirés de la liste. La cellule affiche les termes propres du produit via build_taxonomy_tree() limité aux ID de termes assignés, sous forme de liens ou de texte brut selon l'option de la colonne.
Côté filtre, on ajoute une clause tax_query dont l'opérateur (IN, NOT IN, AND) vient des réglages du tableau et est vérifié par rapport à cette liste blanche.
Les propriétaires de boutique ont besoin de colonnes pour des clés méta arbitrairesRegistre de méta typées (texte, nombre, calendrier) qui donne à chaque clé son mode de tri et son filtre
Les clés méta sont stockées par tableau dans woot_tables_meta avec un type. assemble_meta_for_system() transforme chacune en champ de profil : le texte se trie par meta_value et se filtre avec LIKE ; le nombre se trie par meta_value_num et se filtre avec un BETWEEN numérique sur un curseur de plage ; le calendrier se filtre en DATETIME ou en horodatage unix numérique, choisi par champ, car des plugins comme ACF stockent les dates dans des formats différents.
Les champs sont fusionnés dans le profil par le filtre ext_{action}, et chaque clé apparaît aussi dans la liste déroulante de tri avec des entrées croissante et décroissante.
Lignes fois colonnes répètent les mêmes recherches de produits et d'optionsCaches statiques au niveau de la requête pour les produits, les options de tableau, les lignes de colonnes et les lignes de méta
Chaque closure de colonne a besoin de l'objet WC_Product ; get_product() garde donc une table statique des résultats de wc_get_product(). Les options de tableau sont décodées du JSON une fois par tableau, les lignes de méta sont mises en cache par md5 de la chaîne SQL, et le constructeur de filtres résout le profil une fois au lieu d'une fois par champ.
Les configurations de tableau ont besoin de leur propre stockage, clonage et transfertQuatre tables personnalisées via dbDelta ; le clonage copie colonnes et méta ; l'import remplit à nouveau à partir de JSON
install.php crée woot_tables, woot_tables_columns (indexée par table_id et is_active, ordonnée par pos_num), woot_tables_meta et woot_vocabulary. L'ordre des colonnes par glisser-déposer arrive sous forme de liste d'ID et est réécrit en pos_num.
clone() copie la ligne du tableau, puis ses colonnes et ses clés méta sous le nouvel ID de tableau. L'export vide les quatre tables et les options en JSON ; l'import vide chaque table et insère les lignes, après un contrôle de capacité et de nonce.
Filtrage
shipped · 2020Ce que cela apporteLes clients affinent le tableau par plages, dates, catégories et texte, et les tableaux suivent le plugin de filtrage existant de la boutique sur la même page.
- Problème
- Les filtres arrivent du navigateur sous forme d'une table plate clé/valeur et doivent devenir des arguments WP_Query : plages de méta, clauses de taxonomie, recherche de texte et plages de dates. Les boutiques qui utilisent déjà un plugin de filtrage s'attendent à ce que le tableau le suive.
- Solution
Un fournisseur de filtre transmet chaque clé à la propre closure de requête de la colonne. Les plugins de filtrage externes se branchent comme fournisseurs alternatifs qui renvoient une liste d'ID de produits.
- Stack
Un filtre de plage de dates a besoin de deux champs pour une colonneScinder un champ calendrier en key et key---to ; le fournisseur retire le suffixe et inverse la comparaison
À la construction du formulaire de filtre, un champ calendrier est dupliqué sous une clé ---to avec les libellés Du et Au. Au retour, provider() voit une clé inconnue qui se termine par ---to, retire le suffixe et appelle la même closure de colonne avec un indicateur, de sorte que la closure compare avec <= au lieu de >=.
Les curseurs de plage ont besoin de bornes avant tout filtreCalculer MIN et MAX de la clé méta en SQL quand l'administrateur a laissé les bornes vides
Si un champ de plage n'a ni min ni max configuré (-1), get_field_drawing_data() exécute SELECT MIN ou MAX(cast(meta_value as UNSIGNED)) sur postmeta pour la clé méta du champ via $wpdb->prepare. Le nom de la fonction vient d'une liste blanche interne, pas de la requête. Le curseur du nombre de commentaires lit ses bornes dans la table posts.
La recherche de texte doit couvrir les champs choisis sans injection SQLClause posts_where avec esc_like et prepare ; liste de champs limitée à trois colonnes d'article
Les champs de recherche viennent du shortcode mais sont filtrés pour ne garder que post_title, post_content et post_excerpt. Chacun devient LOWER(field) LIKE %s avec la valeur échappée par esc_like et liée par prepare.
Dans le navigateur, une recherche ne part sur Entrée que lorsque le champ atteint son minlength, et un Entrée à vide ou Échap retire le terme, ce qui évite que de courts mots partiels n'atteignent le serveur.
Les tableaux doivent suivre le filtre HUSKY (WOOF) de la même pageRejouer la requête de WOOF, exécuter sa prédiction d'ID et injecter les ID dans post__in
Avec filter_provider=woof, le shortcode capture les données de requête de WOOF dans le JSON du tableau. À chaque appel AJAX, le fournisseur restaure $_GET à partir de celui-ci, demande tous les résultats, appelle woof_products_ids_prediction() et lit woof_wp_query_ids, en acceptant un tableau ou une chaîne séparée par des virgules et en ne gardant que des entiers positifs. Aucun ID donne post__in = [0].
L'état du filtre MDTF doit atteindre la requête AJAXDécoder l'état MDTF, demander uniquement les arguments de requête, retirer ses propres indicateurs, précharger les ID de produits
Le paramètre page_mdf est décodé et MDTF est exécuté avec mdf_get_query_args_only pour qu'il renvoie des arguments WP_Query au lieu de HTML. La clause méta mdf_hide_post et la clause product_visibility sont retirées (WOOT ajoute les siennes), le tri est abandonné et la requête s'exécute avec fields=ids. La liste d'ID voyage comme données de filtre et devient post__in.
Ajout au panier depuis le tableau
shipped · 2020Ce que cela apporteLes clients achètent n'importe quel type de produit directement depuis le tableau, ajoutent plusieurs lignes à la fois, et le panier reste en phase avec le reste de la boutique.
- Problème
- Chaque type de produit a besoin d'un contrôle d'achat différent, les quantités sont plafonnées par le stock, et le panier du tableau doit rester synchronisé avec le mini-panier du thème et la page panier de WooCommerce.
- Solution
Le serveur émet un descripteur compact par type de produit, le navigateur construit les contrôles à partir de lui et envoie vers le point d'accès AJAX propre de WooCommerce. Le contenu du panier est dessiné par le même moteur de tableau.
- Stack
Simple, variable, groupé et externe ont besoin de contrôles différentsLe serveur émet un descripteur data-about typé ; le JS construit un champ, une case à cocher ou un lien de fenêtre
add_to_cart.php vérifie is_purchasable() et is_in_stock() et, quand le stock est géré, exige une quantité non nulle. Pour les produits simples, le descripteur porte l'ID, le stock et le SKU ; le client construit un champ numérique dont le max est le stock, en lecture seule pour les produits vendus à l'unité, plus une case à cocher pour l'ajout groupé.
Les produits variables et groupés reçoivent un bouton qui ouvre une fenêtre avec un tableau de leurs enfants. Les produits externes renvoient vers l'URL externe. Les types inconnus passent par le filtre woot_woocommerce_add_to_cart afin que d'autres plugins puissent fournir le balisage.
L'ajout au panier doit se comporter comme le bouton natif de WooCommercePOST vers wc-ajax=add_to_cart, puis déclencher wc_fragment_refresh pour les mini-paniers du thème
L'URL du point d'accès est prise dans wc_add_to_cart_params quand WooCommerce l'imprime, de sorte que les points d'accès AJAX personnalisés continuent de fonctionner. La quantité est comparée au max avant l'envoi. Après le succès, le plugin déclenche wc_fragment_refresh, rafraîchit ses propres informations de panier et, selon une option du tableau, redirige vers le panier ou le paiement.
Les clients veulent ajouter plusieurs lignes en une seule actionLignes cochées et quantités envoyées en une requête ; les variations reçoivent l'ID parent et les attributs
Une case à cocher dans l'en-tête de la colonne du panier sélectionne toutes les lignes. add_to_cart_some() parcourt les articles envoyés. Pour une variation, elle reconstruit la table attribute_* à partir de get_attributes('edit') et appelle WC()->cart->add_to_cart() avec l'ID parent, la quantité, l'ID de variation et cette table, qui est la forme attendue par le panier WooCommerce.
Les produits variables ont besoin d'un tableau de leurs variationsLe fournisseur de filtre fixe post_type sur product_variation et limite post__in aux enfants
WOOT_WooCommerceVariations::filter_provider() fixe post_type sur product_variation et post__in sur les enfants du parent, après avoir vérifié que le parent est visible pour le visiteur. Les tableaux de ventes incitatives, de ventes croisées, de produits groupés et de produits similaires partagent la classe de base WOOT_WooCommerceUniversal et ne diffèrent que par la source des ID.
Dans les lignes de variations, le titre reçoit en suffixe les noms des termes d'attributs, et les colonnes de taxonomie lisent le slug d'attribut propre à la variation au lieu des termes assignés à l'article.
Le panier lui-même devrait être un tableau triableLes closures du profil de panier reçoivent l'ID du produit et la quantité ; le moteur le dessine en mode JSON
Le profil woot_cart combine les colonnes de produit configurées avec la quantité, le sous-total (WC_Cart::get_product_subtotal) et la suppression. Chaque modification du panier répond avec un tableau de panier à jour, le nombre d'articles et le sous-total. La suppression et la mise à jour retrouvent la ligne du panier par product_id ou variation_id.
La fenêtre du panier prend l'habillage du tableau qui l'a ouverte : le bloc de style du parent est copié et son ID de tableau remplacé par l'ID du tableau de la fenêtre. Une option du tableau peut aussi masquer les produits déjà dans le panier via post__not_in.
Moteur de tableau dans le navigateur
shipped · 2020Ce que cela apporteLes tableaux répondent vite à la pagination et au tri, plusieurs tableaux peuvent partager une page, et les tableaux larges restent utilisables sur téléphone.
- Problème
- La pagination, le tri et la recherche doivent paraître instantanés, plusieurs tableaux avec des habillages différents peuvent partager une page, et les tableaux larges doivent fonctionner sur téléphone.
- Solution
data-table-23.js est une classe sans dépendance par tableau, avec un cache indexé par hachage de requête, l'annulation des requêtes, un mode SQL facultatif dans le navigateur et un basculement vers une mise en page compacte.
- Stack
Une page ou un ordre de tri déjà vus ne devraient pas solliciter à nouveau le serveurMettre les réponses en cache sous un hachage de l'objet de requête complet ; vider le cache sur des événements
__hash_object() sérialise request_data en JSON et le réduit à un hachage de 32 bits utilisé comme clé de cache. Le cache est désactivé dans les modes JSON et load-more, où les données sont déjà locales. Des extensions comme compare et favourites envoient table23-reset-cache quand leurs données changent.
Les petits catalogues devraient se trier et se chercher sans allers-retoursLe mode to_json charge toutes les lignes une fois, puis les trie, les pagine et les recherche avec AlaSQL
Avec le mode to_json, le serveur renvoie toutes les lignes (posts_per_page -1). Après la première réponse, le tableau passe de lui-même en mode json, et draw_data() construit SELECT ... WHERE ... ORDER BY ... LIMIT ... OFFSET et l'exécute avec AlaSQL sur le tableau. Un tableau d'une seule page trouvé dans le cache est recherché et trié de la même façon.
Une réponse antérieure lente ne doit pas écraser une page plus récenteInterrompre le fetch précédent avec AbortController avant d'envoyer le suivant
Chaque tableau garde son AbortController courant. Une nouvelle requête de page, de tri ou de filtre interrompt celle en attente, de sorte qu'une réponse antérieure lente ne peut plus écraser la page plus récente.
Les tableaux larges doivent passer en mise en page compacte sur téléphoneRedessiner seulement quand la largeur franchit le point de rupture ; gestionnaire de redimensionnement verrouillé pendant 999 ms
Chaque tableau a son propre compact_view_width. L'écouteur de redimensionnement compare le nouvel état au précédent et ne redessine qu'en cas de changement ; un indicateur de verrouillage l'empêche de se déclencher à nouveau pendant 999 ms. Les colonnes marquées hide-on-mobile sont ignorées à la construction des en-têtes, l'en-tête flottant est désactivé en mode compact, et des règles media-hide par colonne sont générées en CSS pour l'ID HTML du tableau.
Plusieurs tableaux avec des habillages différents sur une même pageLe CSS d'habillage utilise un espace réservé tid remplacé par l'ID HTML de chaque tableau au rendu
get_theme_css() lit l'habillage d'abord dans le dossier woot-skins du thème, puis dans le dossier skins du plugin, remplace l'espace réservé tid par l'ID HTML du tableau, et retire les commentaires et les espaces superflus. Chaque règle est limitée à un seul tableau, de sorte que les habillages ne débordent pas d'un tableau à l'autre sur la même page.
Les cellules peuvent contenir leurs propres tableauxLa configuration du tableau imbriqué est livrée en JSON dans un div masqué et instanciée après chaque dessin
draw_table_data() encode la configuration avec JSON_HEX_QUOT et JSON_HEX_TAG pour qu'elle puisse se trouver dans du HTML sans sortir de l'élément. Une fois les lignes dessinées, do_after_draw() trouve les tableaux dans les cellules et crée une instance WOOT_GeneratedTables pour chacun, sans la barre de défilement horizontale.
Sécurité des points d'accès publics
dans le produitCe que cela apporteLes tableaux publics n'affichent que les produits qui doivent être visibles, et les visiteurs ne peuvent pas utiliser les requêtes de tableau pour atteindre du contenu masqué ni exécuter du code.
- Problème
- Les données des tableaux, les fenêtres et les actions du panier sont servies à des visiteurs anonymes via admin-ajax, et les requêtes portent des réglages de tableau, des arguments de shortcode, des noms d'habillage et des noms de hooks.
- Solution
La visibilité est appliquée au moment de la requête et par article, les noms qui aboutissent dans des chemins, du CSS ou du SQL sont réduits à des jeux de caractères sûrs en un seul point, et chaque écriture d'administration vérifie la capacité et le nonce.
- Stack
Les requêtes de tableaux publics portent un type de contenu et un statut choisis par le clientImposer le statut publish aux visiteurs ; types non publics uniquement pour les tableaux construits dessus
Juste avant l'exécution de WP_Query, post_status est remis à publish pour quiconque n'a pas read_private_posts, quoi que la requête, le shortcode ou les réglages du tableau aient demandé. Un statut issu des arguments du shortcode n'est respecté que pour de tels utilisateurs.
Les types de contenu non consultables (coupons, commandes, modèles) sont refusés aux utilisateurs sans edit_posts, sauf si le tableau enregistré a été construit pour ce type de contenu par un administrateur.
Les fenêtres et shortcodes reçoivent un ID de produit du clientwoot_can_read_post() vérifie le statut, la consultabilité et, pour les variations, le parent
Une seule fonction décide si un visiteur peut voir les données d'un article : les articles publiés de types publics sont ouverts, les types non publics exigent des droits d'édition, les autres statuts exigent read_post, et une variation n'est visible que si son parent l'est. Les tableaux de produit unique, de variations, de ventes incitatives et des autres fenêtres, le shortcode de galerie et les extensions l'appellent avant le rendu.
Les noms d'habillage arrivent de plusieurs sources et finissent dans un chemin de fichierbasename() plus un filtre [A-Za-z0-9_-] en un seul point de passage obligé ; ID du tableau filtré avant le CSS
L'habillage peut venir de ?woot_skin=, de shortcodes, d'extensions ou des réglages du tableau, et tous passent par get_theme_css(). Le nom y est réduit avec basename() et un filtre de caractères qui retire points et barres obliques, de sorte qu'il ne peut pas pointer en dehors des dossiers d'habillages. L'ID HTML du tableau, qui est écrit dans le CSS imprimé, est filtré de la même façon pour que des accolades ou des chevrons ne puissent pas sortir du bloc style.
Le point d'accès des fenêtres appelle des hooks et des shortcodes par leur nomSeuls les hooks woot_ sont appelables, call_id est nettoyé, seuls les shortcodes du plugin sont rendus
get_smth() est publique. Sa branche générique appelle apply_filters sur un nom issu de la requête uniquement quand le nom commence par woot_, et le call_id qui l'accompagne est réduit aux lettres, chiffres, soulignés et tirets avant qu'aucune requête en aval ne le voie. La branche shortcodes_set retire chaque shortcode absent de la liste blanche du plugin avant do_shortcode(). Les branches d'export et d'import exigent manage_woocommerce.
Écritures d'administration et SQL construit à partir de noms de colonnesCapacité et nonce à chaque écriture ; identifiants SQL réduits à [A-Za-z0-9_]
Les gestionnaires de tableaux, de colonnes, de méta et de vocabulaire vérifient manage_woocommerce et le woot_settings_nonce avant d'écrire. L'extension des pièces jointes ajoute un contrôle de connexion et des contrôles edit_post au niveau de l'objet.
Les noms de colonnes, les champs ORDER BY et les clés WHERE ne peuvent pas être liés par prepare() ; get_rows() les réduit donc à un jeu de caractères sûr, limite l'ordre à ASC ou DESC et la logique à AND ou OR, et ne lie que les valeurs.
Chiffres
wordpress.org- Installations actives 1 000+ compteur de wordpress.org.
- Avis 18 Moyenne de 4.8 sur 5.
- Années de maintenance 6 Depuis 4 septembre 2020, dernière mise à jour 12 octobre 2026.