{"id":230934,"date":"2022-12-08T17:56:00","date_gmt":"2022-12-08T14:56:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230934"},"modified":"2022-12-07T11:57:30","modified_gmt":"2022-12-07T08:57:30","slug":"pagina-de-edicao-de-categoria-personalizada-do-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/pagina-de-edicao-de-categoria-personalizada-do-wordpress\/","title":{"rendered":"P\u00e1gina de edi\u00e7\u00e3o de categoria personalizada do WordPress"},"content":{"rendered":"\n<p>Adicionar meta caixas, campos e outras informa\u00e7\u00f5es adicionais ao WordPress \u00e9 f\u00e1cil se voc\u00ea souber os ganchos certos e as APIs adequadas a seguir. Mas e se voc\u00ea quiser adicionar informa\u00e7\u00f5es a uma p\u00e1gina de taxonomia do WordPress?<\/p>\n<p>Por exemplo, digamos que voc\u00ea queira criar uma p\u00e1gina de edi\u00e7\u00e3o de categoria WordPress personalizada ou, no m\u00ednimo, adicionar algumas informa\u00e7\u00f5es personalizadas a uma p\u00e1gina de taxonomia?<\/p>\n<p>Ainda \u00e9 poss\u00edvel fazer isso, e ainda \u00e9 relativamente f\u00e1cil, mas, novamente, voc\u00ea precisa saber os ganchos certos para usar, e tamb\u00e9m depende se voc\u00ea est\u00e1 trabalhando com as taxonomias internas ou com uma taxonomia personalizada.<\/p>\n<p>Para este post, mostrarei como fazer isso usando uma taxonomia hier\u00e1rquica personalizada (ou, em termos mais simples, uma categoria personalizada).<\/p>\n<h2>P\u00e1gina de edi\u00e7\u00e3o de categoria personalizada do WordPress<\/h2>\n<p>Primeiro, se voc\u00ea optar por trabalhar com uma p\u00e1gina de categoria padr\u00e3o, provavelmente ver\u00e1 algo assim:<\/p>\n<p>E os dois ganchos com os quais voc\u00ea tem que trabalhar s\u00e3o:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/edit_category_form\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">edit_category_form<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/category_edit_form\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">category_edit_form<\/a><\/strong><\/li>\n<\/ul>\n<p>Se voc\u00ea clicou em um dos links, notar\u00e1 que o \u00faltimo n\u00e3o tem nenhuma informa\u00e7\u00e3o, mas o primeiro diz:<\/p>\n<blockquote>\n<p>A a\u00e7\u00e3o\/gancho edit_category_form pode ser usada para executar a\u00e7\u00f5es adicionais na tela de edi\u00e7\u00e3o de categoria. Por exemplo, voc\u00ea pode adicionar campos de formul\u00e1rio para salvar informa\u00e7\u00f5es adicionais para uma categoria espec\u00edfica.<\/p>\n<\/blockquote>\n<p>Para esse fim, geralmente opto por usar esse gancho, pois est\u00e1 bem definido no Codex. Neste post, por\u00e9m, estou preocupado apenas com a renderiza\u00e7\u00e3o de informa\u00e7\u00f5es \u2013 n\u00e3o com a adi\u00e7\u00e3o de campos adicionais que precisam ser salvos.<\/p>\n<h3>Ligando as coisas<\/h3>\n<p>Na forma mais simples, a melhor maneira de come\u00e7ar a adicionar informa\u00e7\u00f5es personalizadas a esse tipo de p\u00e1gina \u00e9 criar uma fun\u00e7\u00e3o e anex\u00e1-la ao gancho listado acima. Em sua forma mais b\u00e1sica, isso se parece <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-00-acme-display-object-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">com isso:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nadd_action('edit_category_form', 'acme_display_object_ids');\n\/**\n * Displays an ordered list of all of the object IDs for a given\n * taxonomy.\n *\/\nfunction acme_display_object_ids()\n{\n  \/\/ Code for displaying the Object IDs goes here.\n}<\/code><\/pre>\n<p>No entanto, se voc\u00ea seguir a rota orientada a objetos, poder\u00e1 optar por ter uma classe que aceite um gancho como argumento no construtor e escute esse evento ser acionado. Se for esse o caso, seu c\u00f3digo pode ficar <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-01-object-id-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\nclass ObjectIdSubscriber\n{\n    \/**\n     * @var string the hook to which this class subscribes\n     *\/\n    private $hook;\n\n    \/**\n     * @param string $hook the hook to which this class is registered with WordPress\n     *\/\n    public function __construct(string $hook)\n    {\n      $this-&gt;hook = $hook;\n    }\n\n    \/**\n     * Renders all of the information for the object IDs.\n     *\/\n    public function load()\n    {\n        \/\/ Code for displaying the Object IDs goes here.\n    }\n}<\/code><\/pre>\n<p>Independentemente disso, o ponto \u00e9 que voc\u00ea precisa ter uma classe ou uma fun\u00e7\u00e3o conectada a um gancho que renderizar\u00e1 informa\u00e7\u00f5es quando a tela for apresentada.<\/p>\n<h3>Exibindo informa\u00e7\u00f5es<\/h3>\n<p>A partir daqui, voc\u00ea vai precisar de algo para renderizar. Eu sou um f\u00e3 de manter minha l\u00f3gica separada, ent\u00e3o eu costumo criar um diret\u00f3rio <strong>View<\/strong> e ent\u00e3o colocar os arquivos parciais para as views nesse diret\u00f3rio.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162303-61e73af3dd69a.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-162303-61e73af3dd69a.png\" alt=\"P\u00e1gina de edi\u00e7\u00e3o de categoria personalizada do WordPress\" ><\/a><\/p>\n<p>Claro, voc\u00ea sempre pode construir a string HTML na fun\u00e7\u00e3o PHP (mas certifique-se de limpar a sa\u00edda usando algo como <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_kses\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_kses<\/a><\/strong> ).<\/p>\n<p>Para este exemplo, vou simplificar: eu s\u00f3 quero puxar uma lista de todos os posts (ou objetos, como voc\u00ea ver\u00e1 momentaneamente) do banco de dados e listar as informa\u00e7\u00f5es na p\u00e1gina. Para fazer isso, precisarei de algumas consultas ao banco de dados e, em seguida, posso percorrer a lista de resultados.<\/p>\n<p>Primeiro, preciso de uma consulta que recupere o <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-02-term-taxonomy-id-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">term_taxonomy_id<\/a><\/strong> da categoria fornecida:<\/p>\n<pre><code>&lt;?php\n\n\/\/ This will retrieve all of the term relationships from where we can get post IDs.\nglobal $wpdb;\n$termTaxonomyId = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT DISTINCT term_taxonomy_id\n        FROM $wpdb-&gt;term_taxonomy\n        WHERE term_id = %s\n        \",\n        $tagId\n    ),\n    ARRAY_A\n);\n$termTaxonomyId = isset($termTaxonomyId[0])? $termTaxonomyId[0]: null;\nif (null === $termTaxonomyId) {\n    return null;\n}<\/code><\/pre>\n<p>Ent\u00e3o eu preciso recuperar uma lista de todos os <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-03-object-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">IDs de objetos<\/a><\/strong> relacionados por este <strong>term_taxonomy_id<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ This will retrieve all of the post IDs.\n$postIds = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT object_id\n        FROM $wpdb-&gt;term_relationships\n        WHERE term_taxonomy_id = %s\n        \",\n        $termTaxonomyId\n    ),\n    ARRAY_A\n);\nif (empty($postIds)) {\n    return null;\n}<\/code><\/pre>\n<p>A partir daqui, posso usar a fun\u00e7\u00e3o (ou classe) original que criei anteriormente para <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-04-render-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">renderizar as informa\u00e7\u00f5es<\/a><\/strong> :<\/p>\n<pre><code>&lt;ul&gt;\n&lt;?php foreach ($postIds as $postId): ?&gt;\n  &lt;li&gt;&lt;?php echo $postId; ?&gt;&lt;\/li&gt;\n&lt;?php endforeach; ?&gt;\n&lt;\/ul&gt;<\/code><\/pre>\n<p>Mas h\u00e1 muitas coisas adicionais que voc\u00ea pode fazer a partir da\u00ed.<\/p>\n<h2>Tem mais<\/h2>\n<p>Conforme observado, isso retorna os IDs dos objetos que s\u00e3o essencialmente IDs de postagem (ou IDs de p\u00e1gina ou IDs de tipo de postagem personalizados ou qualquer outra coisa da tabela <strong>wp_posts<\/strong> ).<\/p>\n<p>Depois de ter essas informa\u00e7\u00f5es, voc\u00ea pode recuperar qualquer informa\u00e7\u00e3o, como t\u00edtulo, conte\u00fado, metadados, v\u00e1rias informa\u00e7\u00f5es de data e assim por diante.<\/p>\n<p>O objetivo do post, no entanto, n\u00e3o \u00e9 mostrar quais informa\u00e7\u00f5es recuperar, mas como recuperar informa\u00e7\u00f5es para uma determinada taxonomia e renderiz\u00e1-las em uma p\u00e1gina de categoria personalizada do WordPress. E esta \u00e9 uma maneira direta de fazer exatamente isso.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O objetivo do post, no entanto, n\u00e3o \u00e9 mostrar quais informa\u00e7\u00f5es recuperar, mas como recuperar informa\u00e7\u00f5es para uma determinada taxonomia e renderiz\u00e1-las em uma p\u00e1gina de categoria personalizada do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":235442,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,806,867],"tags":[1170],"class_list":["post-230934","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230934","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=230934"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230934\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/235442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}