{"id":234235,"date":"2023-02-18T15:33:00","date_gmt":"2023-02-18T12:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234235"},"modified":"2022-11-12T01:28:59","modified_gmt":"2022-11-11T22:28:59","slug":"comment-ajouter-des-points-de-terminaison-personnalises-a-la-page-mon-compte-dans-woocommerce","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/comment-ajouter-des-points-de-terminaison-personnalises-a-la-page-mon-compte-dans-woocommerce\/","title":{"rendered":"Comment ajouter des points de terminaison personnalis\u00e9s \u00e0 la page Mon compte dans WooCommerce"},"content":{"rendered":"\n<p>Cet article expliquera comment ajouter des points de terminaison personnalis\u00e9s \u00e0 la page &quot;Mon compte&quot; de <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce. Nous pouvons le rendre accessible de deux mani\u00e8res\u00a0: soit sous la forme d&rsquo;un onglet personnalis\u00e9, soit sous la forme d&rsquo;un bouton pour chaque commande dans l&rsquo;onglet &quot;Commandes&quot;.<\/a><\/p>\n<p>La page &quot;Mon compte&quot; de WooCommerce utilise la fonctionnalit\u00e9 int\u00e9gr\u00e9e de WordPress pour les points de terminaison, ce qui facilite l&rsquo;ajustement ou l&rsquo;ajout de vos propres points de terminaison. Si vous n&rsquo;\u00eates pas familier avec les points de terminaison, je vous recommande de lire mon article qui explique en d\u00e9tail <a href=\"https:\/\/awhitepixel.com\/blog\/adding-custom-url-endpoints-with-wordpress-rewrite-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">comment ajouter des points de terminaison personnalis\u00e9s dans WordPress<\/a>.<\/p>\n<p>La fa\u00e7on dont vous rendez votre point de terminaison personnalis\u00e9 accessible \u00e0 l&rsquo;utilisateur \u00e0 partir de &quot;Mon compte&quot; d\u00e9pend enti\u00e8rement des besoins de votre boutique en ligne. Si vous voulez simplement une page g\u00e9n\u00e9rale pour des informations suppl\u00e9mentaires, vous pouvez ajouter cette page comme son propre onglet. Si vous souhaitez toutefois que votre point de terminaison soit li\u00e9 \u00e0 chaque commande, vous devez ajouter votre point de terminaison \u00e0 chaque ligne de commande dans l&rsquo;onglet &quot;Commandes&quot;. Dans cet article, nous examinerons les deux m\u00e9thodes.<\/p>\n<h2>Ajout d&rsquo;un onglet personnalis\u00e9 et d&rsquo;un point de terminaison \u00e0 &quot;Mon compte&quot;<\/h2>\n<p>Par exemple, supposons que notre boutique en ligne vende des logiciels et que nous ayons besoin d&rsquo;un endroit pour afficher les cl\u00e9s de licence de nos clients dans leur page &quot;Mon compte&quot;. Nous ajouterons un onglet personnalis\u00e9 &quot;Cl\u00e9s de licence&quot; qui devrait afficher toutes les cl\u00e9s de licence valides enregistr\u00e9es pour cet utilisateur.<\/p>\n<h3>Ajouter un point de terminaison personnalis\u00e9<\/h3>\n<p>Dans le code de notre th\u00e8me <code>functions.php<\/code>ou plugin, nous ajoutons d&rsquo;abord notre point de terminaison personnalis\u00e9 en utilisant <code>add_rewrite_endpoint()<\/code>. Comme premier argument, nous fournissons une cl\u00e9 unique. Dans l&rsquo;exemple ci-dessous, j&rsquo;ai appel\u00e9 le point de terminaison &lsquo; <code>license-keys<\/code>&lsquo;.<\/p>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('license-keys', EP_ROOT | EP_PAGES);\n});<\/code><\/pre>\n<p>Gardez \u00e0 l&rsquo;esprit que WordPress ajoute automatiquement notre cl\u00e9 pour interroger les variables lors de l&rsquo;utilisation <code>add_rewrite_endpoint()<\/code>, il n&rsquo;est donc pas n\u00e9cessaire de filtrer <code>query_vars<\/code>.<\/p>\n<p>Si vous rencontrez des erreurs \u00ab\u00a0404 introuvable\u00a0\u00bb, vous devez actualiser vos permaliens. Pour ce faire, allez dans Param\u00e8tres&gt; Permaliens et cliquez simplement sur Enregistrer. Chaque fois que nous apportons des modifications aux permaliens ou aux points de terminaison, nous devons le faire.<\/p>\n<h3>Ajout d&rsquo;un onglet personnalis\u00e9<\/h3>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 ajouter un onglet aux onglets de la page &quot;Mon compte&quot;. Nous faisons cela avec le filtre <code>woocommerce_account_menu_items<\/code>. Le tableau fourni par le filtre contient toutes les touches de tabulation et leur \u00e9tiquette correspondante.<\/p>\n<p>Vous pouvez simplement ajouter votre onglet \u00e0 la fin du tableau, mais si vous voulez plus de contr\u00f4le sur l&rsquo;endroit o\u00f9 votre onglet doit appara\u00eetre, vous devez manipuler le tableau \u00e0 l&rsquo;aide de fonctions PHP. Dans l&rsquo;exemple ci-dessus, je le veux \u00e0 la fin, mais avant l&rsquo;onglet &quot;D\u00e9connexion&quot;. Je retire donc l&rsquo;onglet &quot;D\u00e9connexion&quot;, ins\u00e8re mon onglet, puis remets l&rsquo;onglet &quot;D\u00e9connexion&quot; apr\u00e8s.<\/p>\n<pre><code>add_filter('woocommerce_account_menu_items', function($items) {\n    $logout = $items['customer-logout'];\n    unset($items['customer-logout']);\n    $items['license-keys'] = __('License keys', 'txtdomain');\n    $items['customer-logout'] = $logout;\n    return $items;\n});<\/code><\/pre>\n<p>Si vous actualisez votre page Mon compte maintenant, vous devriez voir votre onglet appara\u00eetre avant &quot;D\u00e9connexion&quot;. En cliquant dessus, vous acc\u00e9dez \u00e0 l&rsquo;URL &quot; <code>&lt;example.com&gt;\/my-account\/license-keys\/<\/code>&quot;. Cependant, vous ne verrez rien changer lorsque vous cliquerez sur l&rsquo;onglet. C&rsquo;est parce que nous n&rsquo;avons pas d\u00e9fini ce qu&rsquo;il faut afficher. C&rsquo;est notre prochaine \u00e9tape.<\/p>\n<h3>Rendu du contenu de l&rsquo;onglet personnalis\u00e9<\/h3>\n<p>WooCommerce offre le crochet <code>woocommerce_account_&lt;endpoint key&gt;_endpoint<\/code>pour produire du contenu dans &quot;Mon compte&quot;, o\u00f9 vous le remplacez par votre cl\u00e9 de point de terminaison personnalis\u00e9e. Dans notre exemple, le crochet correct serait <code>woocommerce_account_license-keys_endpoint<\/code>.<\/p>\n<pre><code>add_action('woocommerce_account_license-keys_endpoint', function() {\n    _e('Your license keys', 'txtdomain');\n});<\/code><\/pre>\n<p>Quant \u00e0 la sortie r\u00e9elle de l&rsquo;onglet, cela d\u00e9pend enti\u00e8rement de vous. Vous pouvez faire une requ\u00eate, r\u00e9cup\u00e9rer des informations, puis les afficher. Cependant, il est recommand\u00e9 d&rsquo;utiliser des mod\u00e8les pour g\u00e9n\u00e9rer du HTML au lieu de g\u00e9n\u00e9rer la sortie HTML compl\u00e8te directement dans notre fonction. WooCommerce offre d&rsquo;excellentes fonctionnalit\u00e9s pour les mod\u00e8les, nous allons donc l&rsquo;utiliser.<\/p>\n<p>En utilisant, <code>wc_get_template()<\/code>nous pouvons fournir un mod\u00e8le personnalis\u00e9 (il n&rsquo;est pas n\u00e9cessaire que ce soit l&rsquo;un des mod\u00e8les de WooCommerce). Comme deuxi\u00e8me argument, nous pouvons d\u00e9finir des variables qui seront transmises au fichier de mod\u00e8le. Suivant la structure \u00e9tablie de WooCommerce, nous cr\u00e9ons un mod\u00e8le WooCommerce personnalis\u00e9 que nous avons <code>call license-keys.php<\/code>dans <code>&lt;theme&gt;\/woocommerce\/myaccount\/<\/code>le dossier.<\/p>\n<pre><code>add_action('woocommerce_account_license-keys_endpoint', function() {\n    $licenses = [];  \/\/ Replace with function to return licenses for current logged in user\n    wc_get_template('myaccount\/license-keys.php', [\n        'licenses' =&gt; $licenses\n    ]);\n});<\/code><\/pre>\n<p>Allez-y et cr\u00e9ez un fichier vide <code>&lt;theme&gt;\/woocommerce\/myaccount\/license-keys.php<\/code>. C&rsquo;est \u00e0 l&rsquo;int\u00e9rieur que vous d\u00e9finissez la sortie de votre onglet personnalis\u00e9. Nous avons \u00e9galement acc\u00e8s \u00e0 toutes les variables que nous avons transmises dans le tableau \u00e0 <code>wc_get_template()<\/code>. Ainsi, dans notre cas, la <code>$licenses<\/code>variable sera disponible et remplie avec les informations que nous avons transmises \u00e0 partir de notre fonction de point de terminaison. Vous pouvez transmettre autant de variables que n\u00e9cessaire.<\/p>\n<h2>Ajout d&rsquo;un point de terminaison et d&rsquo;un bouton personnalis\u00e9 \u00e0 chaque commande dans la page &quot;Mon compte&quot;<\/h2>\n<p>Continuons avec le m\u00eame exemple ci-dessus\u00a0; en supposant que votre boutique en ligne vend des logiciels et que vous deviez montrer les cl\u00e9s de licence du client quelque part. Mais au lieu d&rsquo;ajouter un onglet personnalis\u00e9 pour les afficher tous, peut-\u00eatre pr\u00e9f\u00e9rez-vous afficher les cl\u00e9s de licence li\u00e9es \u00e0 une commande sp\u00e9cifique\u00a0? Nous pourrions ajouter un bouton personnalis\u00e9 \u00e0 c\u00f4t\u00e9 de &quot;Afficher&quot; dans l&rsquo;aper\u00e7u des commandes dans Mon compte\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152793-61e4fade776a4.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152793-61e4fade776a4.png\" alt=\"Comment ajouter des points de terminaison personnalis\u00e9s \u00e0 la page Mon compte dans WooCommerce\" ><\/a><\/p>\n<p>Commen\u00e7ons par faire la m\u00eame chose que ci-dessus\u00a0: enregistrer un point de terminaison personnalis\u00e9\u00a0:<\/p>\n<h3>Enregistrer un point de terminaison personnalis\u00e9<\/h3>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('license-keys', EP_ROOT | EP_PAGES);\n});<\/code><\/pre>\n<p>N&rsquo;oubliez pas de vider les permaliens (allez dans Param\u00e8tres &gt; Permaliens et appuyez sur le bouton Enregistrer)\u00a0!<\/p>\n<h3>Ajouter une action personnalis\u00e9e (et un bouton)<\/h3>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 ajouter le bouton en utilisant le filtre <code>woocommerce_my_account_my_orders_actions<\/code>. Comme deuxi\u00e8me argument de ce filtre, vous obtenez l&rsquo;objet de commande. C&rsquo;est tr\u00e8s utile; nous voulons v\u00e9rifier que la commande est termin\u00e9e et pay\u00e9e, afin de ne pas afficher les cl\u00e9s de licence pour les commandes non pay\u00e9es ou annul\u00e9es. Avec l&rsquo;objet de commande, nous obtenons \u00e9galement l&rsquo;ID de commande qui est probablement n\u00e9cessaire pour demander les cl\u00e9s de licence des produits de cette commande. Dans le code ci-dessous, je v\u00e9rifie simplement si le statut de la commande est termin\u00e9 ou non. Vous devrez probablement ajouter votre propre code pour v\u00e9rifier s&rsquo;il existe ou non des cl\u00e9s de licence \u00e0 afficher par commande.<\/p>\n<p>Afin d&rsquo;ajouter une action personnalis\u00e9e, nous devons fournir une cl\u00e9 unique et un tableau avec des valeurs explicites pour &lsquo; <code>url<\/code>&lsquo; et &lsquo; <code>name<\/code>&lsquo;. En ce qui concerne l&rsquo;URL, nous utilisons la fonction de WordPress pour renvoyer l&rsquo;URL du point de terminaison\u00a0: <code>wc_get_endpoint_url()<\/code>. Comme nous devons \u00e9galement transmettre l&rsquo;ID de commande, nous d\u00e9finissons l&rsquo;ID de commande comme deuxi\u00e8me argument de cette fonction, ce qui donne l&rsquo;URL suivante\u00a0: <code>&lt;example.com&gt;\/my-account\/license-keys\/&lt;order ID&gt;\/<\/code>.<\/p>\n<pre><code>add_filter('woocommerce_my_account_my_orders_actions', function($actions, $order) {\n    if ($order-&gt;get_status() == 'completed') {\n        $actions['view-license-keys'] = [\n            'url' =&gt; wc_get_endpoint_url('license-keys', $order-&gt;get_id()),\n            'name' =&gt; __('View license keys', 'txtdomain')\n        ];\n    }\n    return $actions;\n}, 10, 2);<\/code><\/pre>\n<p>Cela devrait ajouter un nouveau bouton pour chaque commande termin\u00e9e\u00a0:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152793-61e4fadf850fe.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152793-61e4fadf850fe.png\" alt=\"Comment ajouter des points de terminaison personnalis\u00e9s \u00e0 la page Mon compte dans WooCommerce\" ><\/a><\/p>\n<p>Maintenant, tout ce dont nous avons besoin est le mod\u00e8le \u00e0 afficher pour le point de terminaison <code>license-keys<\/code>.<\/p>\n<h3>Rendu du point de terminaison<\/h3>\n<p>La fa\u00e7on dont les points de terminaison fonctionnent dans WordPress est que tout ce qui vient apr\u00e8s le point de terminaison est la valeur de cette variable de requ\u00eate ; ou en d&rsquo;autres termes; lorsque nous visitons par exemple l&rsquo;URL <code>&lt;example.com&gt;\/my-account\/license-keys\/204\/<\/code>que nous pouvons utiliser <code>get_query_var('license-keys')<\/code>pour obtenir l&rsquo;ID de commande\u00a0; 204.<\/p>\n<p>Pour g\u00e9n\u00e9rer du contenu pour notre point de terminaison personnalis\u00e9, nous nous accrochons \u00e0 <code>woocommerce_account_&lt;endpoint key&gt;_endpoint<\/code>qui, dans notre cas, serait <code>woocommerce_account_license-keys_endpoint<\/code>. \u00c0 l&rsquo;int\u00e9rieur de cette fonction, nous pouvons utiliser <code>get_query_var()<\/code>pour obtenir l&rsquo;ID de commande et, avec cette requ\u00eate, la commande de toutes les cl\u00e9s de licence.<\/p>\n<pre><code>add_action('woocommerce_account_license-keys_endpoint', function() {\n    $order_id = get_query_var('license-keys');\n    $licenses = [];  \/\/ Function to return licenses for order ID\n\u00a0\n    wc_get_template('myaccount\/license-keys.php', [\n        'licenses' =&gt; $licenses,\n        'order_id' =&gt; $order_id\n    ]);\n});<\/code><\/pre>\n<p>La sortie HTML r\u00e9elle de votre mod\u00e8le personnalis\u00e9 &quot; <code>myaccount\/license-keys.php<\/code>&quot; d\u00e9pend enti\u00e8rement de vos besoins. Vous auriez probablement utilis\u00e9 l&rsquo;ID de commande pour rassembler les cl\u00e9s de licence dans un tableau et les transmettre au mod\u00e8le pour une belle sortie. Dans le code ci-dessus, je transmets \u00e9galement l&rsquo;ID de commande afin qu&rsquo;il soit accessible comme <code>$order_id<\/code>\u00e0 l&rsquo;int\u00e9rieur du mod\u00e8le (par exemple, pour afficher un joli titre \u00abCl\u00e9s de licence pour la commande n\u00b0 204 \u00bb).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article explique comment ajouter des points de terminaison personnalis\u00e9s \u00e0 \u00ab\u00a0Mon compte\u00a0\u00bb de WooCommerce\u00a0; soit comme un onglet propre, soit comme un bouton pour chaque commande dans l&rsquo;onglet \u00ab\u00a0Commandes\u00a0\u00bb.<\/p>\n","protected":false},"author":1,"featured_media":223696,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[1110,811,811,841,841,852,852,862,862],"tags":[1167],"class_list":{"0":"post-234235","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-n-a","8":"category-plugins-2","10":"category-tutoriels","12":"category-woocommerce-3","14":"category-wordpress-3","16":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234235"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234235\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}