{"id":233630,"date":"2023-02-18T15:34:00","date_gmt":"2023-02-18T12:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233630"},"modified":"2022-11-11T00:44:16","modified_gmt":"2022-11-10T21:44:16","slug":"como-adicionar-endpoints-personalizados-a-pagina-minha-conta-no-woocommerce","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-adicionar-endpoints-personalizados-a-pagina-minha-conta-no-woocommerce\/","title":{"rendered":"Como adicionar endpoints personalizados \u00e0 p\u00e1gina Minha conta no WooCommerce"},"content":{"rendered":"\n<p>Este post mostrar\u00e1 como adicionar endpoints personalizados \u00e0 p\u00e1gina &quot;Minha conta&quot; do <a href=\"https:\/\/woocommerce.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WooCommerce<\/a>. Podemos torn\u00e1-lo acess\u00edvel de duas maneiras; como uma guia personalizada pr\u00f3pria ou como um bot\u00e3o para cada pedido na guia &quot;Pedidos&quot;.<\/p>\n<p>A p\u00e1gina &#8220;Minha conta&quot; do WooCommerce est\u00e1 usando a funcionalidade integrada do WordPress para endpoints, o que facilita o ajuste ou a adi\u00e7\u00e3o de seus pr\u00f3prios endpoints. Se voc\u00ea n\u00e3o estiver familiarizado com endpoints, recomendo ler meu post que detalha <a href=\"https:\/\/awhitepixel.com\/blog\/adding-custom-url-endpoints-with-wordpress-rewrite-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como adicionar endpoints personalizados no WordPress<\/a>.<\/p>\n<p>A forma como voc\u00ea torna seu endpoint personalizado acess\u00edvel para o usu\u00e1rio em &#8220;Minha conta&#8221; depende inteiramente das necessidades de sua loja virtual. Se voc\u00ea simplesmente deseja uma p\u00e1gina geral para obter informa\u00e7\u00f5es adicionais, pode adicionar esta p\u00e1gina como sua pr\u00f3pria guia. No entanto, se voc\u00ea quiser que seu endpoint seja relacionado a cada pedido, ser\u00e1 necess\u00e1rio adicionar seu endpoint a cada linha de pedido na guia &quot;Pedidos&quot;. Neste post, veremos os dois m\u00e9todos.<\/p>\n<h2>Adicionando uma guia personalizada e um endpoint a &#8220;Minha conta&#8221;<\/h2>\n<p>Por exemplo, vamos supor que nossa loja virtual venda software e precisamos de um local para mostrar as chaves de licen\u00e7a de nossos clientes na p\u00e1gina &quot;Minha conta&quot;. Adicionaremos uma guia personalizada &#8220;Chaves de licen\u00e7a&#8221; que deve gerar todas as chaves de licen\u00e7a v\u00e1lidas registradas para esse usu\u00e1rio.<\/p>\n<h3>Adicionando um endpoint personalizado<\/h3>\n<p>No c\u00f3digo do nosso tema <code>functions.php<\/code>ou plugin, primeiro adicionamos nosso endpoint personalizado usando <code>add_rewrite_endpoint()<\/code>. Como primeiro argumento para isso, fornecemos uma chave exclusiva. No exemplo abaixo, chamei o endpoint de &#8216; <code>license-keys<\/code>&#8216;.<\/p>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('license-keys', EP_ROOT | EP_PAGES);\n});<\/code><\/pre>\n<p>Lembre-se de que o WordPress adiciona automaticamente nossa chave para consultar vars ao usar <code>add_rewrite_endpoint()<\/code>, portanto, n\u00e3o h\u00e1 necessidade de filtrar <code>query_vars<\/code>.<\/p>\n<p>Se voc\u00ea encontrar erros &#8220;404 n\u00e3o encontrado&#8221;, ser\u00e1 necess\u00e1rio atualizar seus permalinks. Voc\u00ea faz isso acessando Configura\u00e7\u00f5es &gt; Permalinks e apenas clicando em Salvar. Sempre que fazemos altera\u00e7\u00f5es em links permanentes ou endpoints, precisamos fazer isso.<\/p>\n<h3>Adicionando uma guia personalizada<\/h3>\n<p>A pr\u00f3xima etapa \u00e9 adicionar uma guia \u00e0s guias da p\u00e1gina &quot;Minha conta&quot;. Fazemos isso com o filtro <code>woocommerce_account_menu_items<\/code>. A matriz fornecida pelo filtro cont\u00e9m todas as teclas de tabula\u00e7\u00e3o e seu r\u00f3tulo correspondente.<\/p>\n<p>Voc\u00ea pode simplesmente anexar sua guia no final do array, mas se voc\u00ea quiser mais controle de onde sua guia deve aparecer, voc\u00ea precisa manipular o array usando fun\u00e7\u00f5es PHP. No exemplo acima eu quero no final, mas antes da aba &#8220;Sair&#8221;. Ent\u00e3o eu tiro a guia &#8220;Log out&#8221;, insiro minha guia e, em seguida, coloco de volta a guia &#8220;Log out&#8221; depois.<\/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>Se voc\u00ea atualizar sua p\u00e1gina Minha conta agora, voc\u00ea ver\u00e1 sua guia aparecer antes de &#8220;Sair&#8221;. Clicar nele leva voc\u00ea ao URL &#8221; <code>&lt;example.com&gt;\/my-account\/license-keys\/<\/code>&#8220;. No entanto, voc\u00ea n\u00e3o ver\u00e1 nada mudar ao clicar na guia. Isso porque n\u00e3o definimos o que produzir. Esse \u00e9 o nosso pr\u00f3ximo passo.<\/p>\n<h3>Renderizando o conte\u00fado da guia personalizada<\/h3>\n<p>O WooCommerce oferece o gancho <code>woocommerce_account_&lt;endpoint key&gt;_endpoint<\/code>para a sa\u00edda de conte\u00fado em &#8220;Minha conta&#8221;, onde voc\u00ea substitui por sua chave de endpoint personalizada. Em nosso exemplo, o gancho correto seria <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>Quanto \u00e0 sa\u00edda real da guia, isso depende inteiramente de voc\u00ea. Voc\u00ea pode fazer uma consulta, buscar algumas informa\u00e7\u00f5es e depois produzi-las. No entanto, \u00e9 recomend\u00e1vel usar modelos para gerar HTML em vez de gerar a sa\u00edda HTML completa diretamente dentro de nossa fun\u00e7\u00e3o. O WooCommerce oferece \u00f3timas funcionalidades para modelos, ent\u00e3o vamos usar isso.<\/p>\n<p>Ao usar <code>wc_get_template()<\/code>, podemos fornecer um modelo personalizado (n\u00e3o precisa ser um dos modelos do WooCommerce). Como segundo argumento podemos definir vari\u00e1veis \u200b\u200bque ser\u00e3o passadas para o arquivo template. Seguindo a estrutura estabelecida do WooCommerce, criamos um modelo WooCommerce personalizado que guardamos <code>call license-keys.php<\/code>na <code>&lt;theme&gt;\/woocommerce\/myaccount\/<\/code>pasta.<\/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>V\u00e1 em frente e crie um arquivo vazio <code>&lt;theme&gt;\/woocommerce\/myaccount\/license-keys.php<\/code>. Dentro dele \u00e9 onde voc\u00ea define a sa\u00edda da sua guia personalizada. Tamb\u00e9m temos acesso a todas as vari\u00e1veis \u200b\u200bque passamos no array para <code>wc_get_template()<\/code>. Portanto, no nosso caso, a <code>$licenses<\/code>vari\u00e1vel estar\u00e1 dispon\u00edvel e preenchida com as informa\u00e7\u00f5es que passamos de nossa fun\u00e7\u00e3o de ponto de extremidade. Voc\u00ea pode passar quantas vari\u00e1veis \u200b\u200bprecisar.<\/p>\n<h2>Adicionando um endpoint e um bot\u00e3o personalizado a cada pedido na p\u00e1gina &#8220;Minha conta&#8221;<\/h2>\n<p>Vamos continuar com o mesmo exemplo acima; assumindo que sua loja virtual est\u00e1 vendendo software e voc\u00ea precisa mostrar as chaves de licen\u00e7a do cliente em algum lugar. Mas em vez de adicionar uma guia personalizada para mostrar todos eles, talvez voc\u00ea prefira mostrar as chaves de licen\u00e7a conectadas a um pedido espec\u00edfico? Poder\u00edamos adicionar um bot\u00e3o personalizado ao lado de &#8220;Visualizar&#8221; na vis\u00e3o geral dos pedidos em Minha conta:<\/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=\"Como adicionar endpoints personalizados \u00e0 p\u00e1gina Minha conta no WooCommerce\" ><\/a><\/p>\n<p>Vamos come\u00e7ar fazendo o mesmo que fizemos acima: registrando um endpoint personalizado:<\/p>\n<h3>Registrar um endpoint personalizado<\/h3>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('license-keys', EP_ROOT | EP_PAGES);\n});<\/code><\/pre>\n<p>N\u00e3o se esque\u00e7a de liberar os permalinks (v\u00e1 para Configura\u00e7\u00f5es &gt; Permalinks e aperte o bot\u00e3o Salvar)!<\/p>\n<h3>Adicionar uma a\u00e7\u00e3o personalizada (e um bot\u00e3o)<\/h3>\n<p>O pr\u00f3ximo passo \u00e9 adicionar o bot\u00e3o usando o filtro <code>woocommerce_my_account_my_orders_actions<\/code>. Como segundo argumento para este filtro, voc\u00ea obt\u00e9m o objeto order. Isso \u00e9 muito \u00fatil; queremos verificar se o pedido foi conclu\u00eddo e pago, para que n\u00e3o mostremos as chaves de licen\u00e7a para pedidos n\u00e3o pagos ou cancelados. Com o objeto do pedido, tamb\u00e9m obtemos o ID do pedido que provavelmente \u00e9 necess\u00e1rio para consultar as chaves de licen\u00e7a dos produtos nesse pedido. No c\u00f3digo abaixo eu simplesmente verifico se o status do pedido est\u00e1 ou n\u00e3o conclu\u00eddo. Voc\u00ea provavelmente precisar\u00e1 adicionar seu pr\u00f3prio c\u00f3digo para verificar se h\u00e1 ou n\u00e3o chaves de licen\u00e7a para mostrar por pedido.<\/p>\n<p>Para adicionar uma a\u00e7\u00e3o personalizada, precisamos fornecer uma chave exclusiva e um array com valores autoexplicativos para &#8216; <code>url<\/code>&#8216; e &#8216; <code>name<\/code>&#8216;. Quanto ao URL, usamos a fun\u00e7\u00e3o do WordPress para retornar o URL do endpoint: <code>wc_get_endpoint_url()<\/code>. Como tamb\u00e9m precisamos passar o ID do pedido, definimos o ID do pedido como segundo argumento para essa fun\u00e7\u00e3o, o que resulta na seguinte URL: <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>Isso deve adicionar um novo bot\u00e3o para cada pedido conclu\u00eddo:<\/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=\"Como adicionar endpoints personalizados \u00e0 p\u00e1gina Minha conta no WooCommerce\" ><\/a><\/p>\n<p>Agora tudo o que precisamos \u00e9 o modelo para mostrar para o endpoint <code>license-keys<\/code>.<\/p>\n<h3>Renderizando o endpoint<\/h3>\n<p>A maneira como os endpoints funcionam no WordPress \u00e9 que o que vem depois do endpoint \u00e9 o valor dessa vari\u00e1vel de consulta; ou em outras palavras; quando visitamos, por exemplo, o URL <code>&lt;example.com&gt;\/my-account\/license-keys\/204\/<\/code>que podemos usar <code>get_query_var('license-keys')<\/code>para obter o ID do pedido; 204.<\/p>\n<p>Para gerar conte\u00fado para nosso endpoint personalizado, nos conectamos ao <code>woocommerce_account_&lt;endpoint key&gt;_endpoint<\/code>que, em nosso caso, seria <code>woocommerce_account_license-keys_endpoint<\/code>. Dentro dessa fun\u00e7\u00e3o, podemos usar <code>get_query_var()<\/code>para obter o ID do pedido e, com essa consulta, o pedido de qualquer chave de licen\u00e7a.<\/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>A sa\u00edda HTML real do seu modelo personalizado &#8221; <code>myaccount\/license-keys.php<\/code>&#8221; depende inteiramente de suas necessidades. Presumivelmente, voc\u00ea teria usado o ID do pedido para reunir as chaves de licen\u00e7a em algum array e passar isso para o modelo para uma boa sa\u00edda. No c\u00f3digo acima, tamb\u00e9m estou passando o ID do pedido para que seja acess\u00edvel como <code>$order_id<\/code>dentro do modelo (por exemplo, para gerar um bom t\u00edtulo &#8220;Chaves de licen\u00e7a para o pedido #204&#8221;).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este post explicar\u00e1 como adicionar endpoints personalizados \u00e0 &#8220;Minha conta&#8221; do WooCommerce; como uma guia pr\u00f3pria ou como um bot\u00e3o para cada pedido na guia &#8220;Pedidos&#8221;.<\/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,816,816,846,846,857,857,867,867],"tags":[1170],"class_list":["post-233630","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-n-a","category-plug-ins","category-tutoriais","category-woocommerce-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=233630"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233630\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223696"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233630"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233630"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}