{"id":233372,"date":"2023-02-11T14:35:00","date_gmt":"2023-02-11T11:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233372"},"modified":"2022-11-10T20:44:10","modified_gmt":"2022-11-10T17:44:10","slug":"adicionar-configuracoes-de-meta-personalizadas-amigaveis-aos-itens-de-menu-do-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/adicionar-configuracoes-de-meta-personalizadas-amigaveis-aos-itens-de-menu-do-wordpress\/","title":{"rendered":"Adicionar configura\u00e7\u00f5es de meta personalizadas amig\u00e1veis \u200b\u200b\u200b\u200baos itens de menu do WordPress"},"content":{"rendered":"\n<p>Em uma atualiza\u00e7\u00e3o recente do WordPress, agora \u00e9 poss\u00edvel e bastante simples adicionar meta campos personalizados aos itens de menu. Nesta postagem, aprenderemos como adicionar nossas configura\u00e7\u00f5es personalizadas aos itens de menu, atualizar suas configura\u00e7\u00f5es e, finalmente, como usar os metadados em uso.<\/p>\n<p>Recentemente, o WordPress <a href=\"https:\/\/make.wordpress.org\/core\/2020\/02\/25\/wordpress-5-4-introduces-new-hooks-to-add-custom-fields-to-menu-items\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">anunciou suporte para adicionar campos personalizados aos itens de menu<\/a> na vers\u00e3o 5.4. Duas novas a\u00e7\u00f5es foram adicionadas que permitem que os desenvolvedores adicionem campos personalizados na p\u00e1gina de administra\u00e7\u00e3o do menu do WordPress e no editor de menus do Customizer. Neste post vamos focar em um deles, o da p\u00e1gina de administra\u00e7\u00e3o do menu WordPress.<\/p>\n<p>Com essa altera\u00e7\u00e3o, n\u00e3o h\u00e1 mais necessidade de for\u00e7ar os usu\u00e1rios do tema ou do plug-in a lembrar e digitar os nomes das classes para ativar as &quot;configura\u00e7\u00f5es&quot; do item de menu. At\u00e9 agora, isso era um processo comum para coisas como fazer um item de menu parecer um bot\u00e3o ou alternar entre diferentes designs de menus suspensos, muitas vezes em combina\u00e7\u00e3o com um menu personalizado.<\/p>\n<p>Tenha em mente que para que este c\u00f3digo funcione \u00e9 necess\u00e1ria a vers\u00e3o m\u00ednima do WordPress 5.4.0.<\/p>\n<h2>O que vamos fazer neste tutorial<\/h2>\n<p>Com o novo gancho para itens de menu e o suporte do WordPress para adicionar metadados a itens de menu, n\u00e3o h\u00e1 limite para o tipo de configura\u00e7\u00e3o que voc\u00ea deseja. O processo depende de qual \u00e9 o seu resultado final. Na maioria dos casos, adicionar uma classe CSS personalizada ao item de menu \u00e9 suficiente.<\/p>\n<p>Para simplificar, neste post adicionaremos uma caixa de sele\u00e7\u00e3o chamada &#8220;Mostrar como bot\u00e3o&quot;. Em nosso tema, temos CSS que estilizar\u00e1 um item de menu para se parecer com um bot\u00e3o (call to action) se o item tiver uma determinada classe. Em vez de for\u00e7ar o usu\u00e1rio do tema a digitar a classe CSS &#8220;menu-item-button&#8221; no campo de classe CSS do item de menu em admin, oferecemos a eles uma caixa de sele\u00e7\u00e3o amig\u00e1vel.<\/p>\n<p>No final deste post voc\u00ea encontrar\u00e1 algumas ideias para outras a\u00e7\u00f5es e filtros para usar se quiser fazer mais do que apenas adicionar uma classe CSS.<\/p>\n<p>Vamos come\u00e7ar!<\/p>\n<h2>Adicionando campos personalizados aos itens de menu<\/h2>\n<p>O novo gancho adicionado recentemente \u00e9 <code>[wp_nav_menu_item_custom_fields](https:\/\/developer.wordpress.org\/reference\/hooks\/wp_nav_menu_item_custom_fields\/)<\/code>. \u00c9 um gancho que dispara logo acima dos bot\u00f5es de movimento de um item de menu;<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e51560662d6.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-153876-61e51560662d6.png\" alt=\"Adicionar configura\u00e7\u00f5es de meta personalizadas amig\u00e1veis \u200b\u200b\u200b\u200baos itens de menu do WordPress\" ><\/a><\/p>\n<p>O gancho vem com nada menos que cinco par\u00e2metros. Neste post vamos fazer coisas que requerem apenas os dois primeiros.<\/p>\n<ul>\n<li><code>item_id<\/code>: O ID do item de menu atual<\/li>\n<li><code>item<\/code>: Objeto de dados do item de menu<\/li>\n<li><code>depth<\/code>: A profundidade do item de menu dentro do menu, representada como um n\u00famero inteiro<\/li>\n<li><code>args<\/code>: Um objeto de argumentos de item de menu<\/li>\n<li><code>nav_id<\/code>: O ID do menu de navega\u00e7\u00e3o<\/li>\n<\/ul>\n<p>Todas as entradas adicionadas neste gancho precisam ter um <code>name<\/code>atributo (j\u00e1 que o editor de menus \u00e9 um formul\u00e1rio). O atributo name pode ser nomeado como voc\u00ea quiser, mas deve ser exclusivo e voc\u00ea deve adicionar o ID do item de menu (primeiro par\u00e2metro) entre colchetes. Ex.: <code>name=\"my-custom-field[&lt;item ID&gt;]<\/code>&#8220;. \u00c9 assim que as outras configura\u00e7\u00f5es de itens de menu padr\u00e3o fazem isso.<\/p>\n<p>Vamos come\u00e7ar com um exemplo de adi\u00e7\u00e3o de uma caixa de sele\u00e7\u00e3o para fazer o item de menu parecer um bot\u00e3o quando o menu \u00e9 colocado como menu principal. Vamos nos conectar <code>wp_nav_menu_item_custom_fields<\/code>com apenas os dois primeiros par\u00e2metros e fazer o seguinte:<\/p>\n<pre><code>add_action('wp_nav_menu_item_custom_fields', function($item_id, $item) {\n    $show_as_button = get_post_meta($item_id, '_show-as-button', true);\n    ?&gt;\n    &lt;p class=\"awp-show-as-button description description-wide\"&gt;\n        &lt;label for=\"awp-menu-item-button-&lt;?php echo $item_id; ?&gt;\" &gt;\n            &lt;input type=\"checkbox\" \n                id=\"awp-menu-item-button-&lt;?php echo $item_id; ?&gt;\" \n                name=\"awp-menu-item-button[&lt;?php echo $item_id; ?&gt;]\" \n                &lt;?php checked($show_as_button, true); ?&gt; \n            \/&gt;&lt;?php _e('Show as a button', 'awp'); ?&gt;\n        &lt;\/label&gt;\n    &lt;\/p&gt;\n    &lt;?php\n}, 10, 2);<\/code><\/pre>\n<p>Na linha <code>#2<\/code>buscamos o valor atual do nosso item de menu meta. Os itens do menu usam o post meta, ent\u00e3o usamos <code>[get_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/)()<\/code>o que voc\u00ea provavelmente j\u00e1 conhece. Armazenamos os metadados do item de menu pela tecla &#8216; <code>_show-as-button<\/code>&#8216;.<\/p>\n<p>Ent\u00e3o \u00e9 uma quest\u00e3o de ecoar um bom HTML. O c\u00f3digo acima usa algumas das classes j\u00e1 usadas para itens de menu para torn\u00e1-lo bonito sem adicionar um estilo personalizado (uma <code>p<\/code>tag com as classes &#8221; <code>description description-wide<\/code>&#8220;).<\/p>\n<p>As partes importantes acontecem na linha <code>#8<\/code>e <code>#9<\/code>. Seguimos a regra do atributo name, adicionando o <code>$item_id<\/code>entre colchetes, e garantimos que o valor salvo atual seja refletido na caixa de sele\u00e7\u00e3o. Voc\u00ea pode adicionar qualquer tipo de entrada e at\u00e9 v\u00e1rias entradas aqui. Apenas lembre-se de fornecer o <code>name<\/code>atributo apropriado e definir seu valor atual corretamente.<\/p>\n<p>Com este c\u00f3digo no c\u00f3digo do seu tema <code>functions.php<\/code>ou plugin, agora voc\u00ea deve obter uma nova caixa de sele\u00e7\u00e3o para todos os itens de menu:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e5156147558.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-153876-61e5156147558.png\" alt=\"Adicionar configura\u00e7\u00f5es de meta personalizadas amig\u00e1veis \u200b\u200b\u200b\u200baos itens de menu do WordPress\" ><\/a><\/p>\n<p>Atualmente n\u00e3o est\u00e1 salvando nosso campo. Esse \u00e9 o pr\u00f3ximo passo.<\/p>\n<h2>Atualizando os campos personalizados<\/h2>\n<p>Para atualizar campos personalizados em itens de menu, usamos o gancho <code>[wp_update_nav_menu_item](https:\/\/developer.wordpress.org\/reference\/hooks\/wp_update_nav_menu_item\/)<\/code>. Ele vem com tr\u00eas argumentos, mas precisamos apenas do segundo que \u00e9 o ID do item de menu.<\/p>\n<p>Como voc\u00ea lida com o salvamento do valor de sua(s) entrada(s) depende de voc\u00ea. Eu escolhi simplesmente salvar &#8216; <code>_show-as-button<\/code>&#8216; como verdadeiro ou falso. Basta usar <code>[update_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/)()<\/code>e\/ou <code>[delete_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/delete_post_meta\/)()<\/code>.<\/p>\n<pre><code>add_action('wp_update_nav_menu_item', function($menu_id, $menu_item_db_id) {\n    $button_value = (isset($_POST['awp-menu-item-button'][$menu_item_db_id]) &amp;&amp; $_POST['awp-menu-item-button'][$menu_item_db_id] == 'on')? true: false;\n    update_post_meta($menu_item_db_id, '_show-as-button', $button_value);\n}, 10, 2);<\/code><\/pre>\n<p>No c\u00f3digo acima eu busco o valor do campo personalizado pelo seu nome no <code>$_POST<\/code>array. Como \u00e9 uma caixa de sele\u00e7\u00e3o, ela n\u00e3o existir\u00e1 na <code>$_POST<\/code>matriz (desmarcada) ou ser\u00e1 retornada como &#8216; <code>on<\/code>&#8216;. Em seguida, atualizo a meta-chave &#8216; <code>_show-as-button<\/code>&#8216; como verdadeira ou falsa.<\/p>\n<p>Com o c\u00f3digo acima voc\u00ea dever\u00e1 ver que seu campo est\u00e1 atualizando corretamente ao salvar o menu.<\/p>\n<p>O pr\u00f3ximo passo \u00e9 fazer algo sobre nossos metadados personalizados. E como voc\u00ea vai fazer isso depende de qual \u00e9 o seu resultado final. Quanto ao nosso exemplo, tudo o que precisamos fazer \u00e9 adicionar uma classe personalizada ao item de menu.<\/p>\n<h2>Atualizar a classe CSS do item de menu<\/h2>\n<p>O WordPress oferece um filtro nas classes do item de menu: <code>[nav_menu_css_class](https:\/\/developer.wordpress.org\/reference\/hooks\/nav_menu_css_class\/)<\/code>. Tudo o que precisamos fazer \u00e9 adicionar uma classe personalizada ao array por esse filtro se nosso meta personalizado for <code>true<\/code>. Usamos <code>[get_post_meta](https:\/\/developer.wordpress.org\/reference\/functions\/get_post_meta\/)()<\/code>para obter o valor de &#8216; <code>_show-as-button<\/code>&#8216; e se for verdadeiro, adicionamos a classe CSS &#8216; <code>menu-item-button<\/code>&#8216;:<\/p>\n<pre><code>add_filter('nav_menu_css_class', function($classes, $menu_item) {\n    $show_as_button = get_post_meta($menu_item-&gt;ID, '_show-as-button', true);\n    if ($show_as_button) {\n        $classes[] = 'menu-item-button';\n    }\n    return $classes;\n}, 10, 2);<\/code><\/pre>\n<p>O <code>nav_menu_css_class<\/code>filtro vem com um total de quatro argumentos, incluindo os argumentos de menu e a profundidade do item de menu. Se necess\u00e1rio, voc\u00ea pode fazer com que os nomes das classes sejam afetados por esses valores. Por exemplo, normalmente n\u00e3o faria sentido transformar um item de menu em um bot\u00e3o, a menos que esteja no n\u00edvel superior (e n\u00e3o dentro de um menu suspenso).<\/p>\n<p>Com o c\u00f3digo acima, voc\u00ea deve ver agora que qualquer item de menu que tenha marcado &#8220;Mostrar como bot\u00e3o&#8221; obter\u00e1 a classe &#8216; <code>menu-item-button<\/code>&#8216;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-153876-61e515621cd00.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-153876-61e515621cd00.png\" alt=\"Adicionar configura\u00e7\u00f5es de meta personalizadas amig\u00e1veis \u200b\u200b\u200b\u200baos itens de menu do WordPress\" ><\/a><\/p>\n<p>Lembre-se: voc\u00ea pode perceber que o <code>nav_menu_css_class<\/code>filtro n\u00e3o \u00e9 aplicado se o menu estiver usando um menu personalizado que, por exemplo, cont\u00e9m o m\u00e9todo <code>start_el()<\/code>. O caminhante deve aplicar o <code>nav_menu_css_class<\/code>filtro nas classes do item de menu (usando <code>apply_filters()<\/code>) para que o filtro acima funcione!<\/p>\n<h2>Outros usos de metacampos personalizados de itens de menu<\/h2>\n<p>Como mencionado, o processo de utiliza\u00e7\u00e3o dos campos personalizados depende do resultado final. \u00c9 dif\u00edcil fazer um post que abranja todas as possibilidades. Mas pelo menos isso deve lhe dar algumas id\u00e9ias. O exemplo acima mostrou como simplesmente adicionar uma classe personalizada ao item de menu.<\/p>\n<p>Em outros casos, voc\u00ea pode querer antecipar os metadados em um menu walker. Na maioria das fun\u00e7\u00f5es em um menu walker, voc\u00ea tem acesso ao ID do item de menu e, portanto, pode buscar facilmente os metadados.<\/p>\n<p>Uma alternativa ao uso de um menu personalizado, voc\u00ea pode usar o filtro <code>[wp_setup_nav_menu_item](https:\/\/developer.wordpress.org\/reference\/functions\/wp_setup_nav_menu_item\/)<\/code>para ter mais controle sobre o objeto de item de menu.<\/p>\n<p>Ou voc\u00ea pode usar o filtro <code>[wp_get_nav_menu_items](https:\/\/developer.wordpress.org\/reference\/functions\/wp_get_nav_menu_items\/)<\/code>para, por exemplo, excluir itens de menu, se sua configura\u00e7\u00e3o for limitar a visibilidade do item de menu.<\/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>Em uma atualiza\u00e7\u00e3o recente do WordPress, agora \u00e9 poss\u00edvel e bastante simples adicionar meta campos personalizados aos itens de menu. Neste post vamos aprender como!<\/p>\n","protected":false},"author":1,"featured_media":223830,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[930,898,898,722,722,837,1110,806,806,837,930,846,846,867,867],"tags":[1170],"class_list":{"0":"post-233372","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-assuntos","8":"category-codigo-2","10":"category-desenvolvedor","12":"category-guia-para-iniciantes","13":"category-n-a","14":"category-php-8","18":"category-tutoriais","20":"category-wordpress-8","22":"tag-affiai-pt-pt"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233372","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=233372"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/233372\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223830"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=233372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=233372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=233372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}