{"id":230544,"date":"2022-12-08T18:14:00","date_gmt":"2022-12-08T15:14:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230544"},"modified":"2022-12-07T11:57:23","modified_gmt":"2022-12-07T08:57:23","slug":"pagina-de-edicion-de-categoria-personalizada-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/pagina-de-edicion-de-categoria-personalizada-de-wordpress\/","title":{"rendered":"P\u00e1gina de edici\u00f3n de categor\u00eda personalizada de WordPress"},"content":{"rendered":"\n<p>Agregar metaboxes, campos y otra informaci\u00f3n adicional a WordPress es f\u00e1cil si conoce los ganchos correctos y las API adecuadas a seguir. Pero, \u00bfqu\u00e9 sucede si desea agregar informaci\u00f3n a una p\u00e1gina de taxonom\u00eda de WordPress?<\/p>\n<p>Por ejemplo, digamos que desea crear una p\u00e1gina personalizada de edici\u00f3n de categor\u00edas de WordPress o, al menos, agregar informaci\u00f3n personalizada a una p\u00e1gina de taxonom\u00eda.<\/p>\n<p>Todav\u00eda es posible hacer eso, y sigue siendo relativamente f\u00e1cil pero, nuevamente, necesita conocer los ganchos correctos para usar, y tambi\u00e9n depende de si est\u00e1 trabajando con las taxonom\u00edas integradas o con una taxonom\u00eda personalizada.<\/p>\n<p>Para esta publicaci\u00f3n, mostrar\u00e9 c\u00f3mo hacer esto usando una taxonom\u00eda jer\u00e1rquica personalizada (o, en t\u00e9rminos m\u00e1s simples, una categor\u00eda personalizada).<\/p>\n<h2>P\u00e1gina de edici\u00f3n de categor\u00eda personalizada de WordPress<\/h2>\n<p>Primero, si opta por trabajar con una p\u00e1gina de categor\u00eda est\u00e1ndar, es probable que vea algo como esto:<\/p>\n<p>Y los dos ganchos con los que tienes que trabajar son:<\/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\">categor\u00eda_editar_formulario<\/a><\/strong><\/li>\n<\/ul>\n<p>Si ha hecho clic en cualquiera de los enlaces, notar\u00e1 que el \u00faltimo no tiene ninguna informaci\u00f3n, pero el primero dice:<\/p>\n<blockquote>\n<p>La acci\u00f3n\/gancho edit_category_form se puede utilizar para realizar acciones adicionales en la pantalla de edici\u00f3n de categor\u00eda. Por ejemplo, puede agregar campos de formulario para guardar informaci\u00f3n adicional para una categor\u00eda en particular.<\/p>\n<\/blockquote>\n<p>Con ese fin, generalmente opto por usar ese gancho ya que est\u00e1 bien definido en el Codex. En esta publicaci\u00f3n, sin embargo, solo me preocupa la representaci\u00f3n de la informaci\u00f3n, no la adici\u00f3n de campos adicionales que deben guardarse.<\/p>\n<h3>Cableando las cosas<\/h3>\n<p>En la forma m\u00e1s simple, la mejor manera de comenzar a agregar informaci\u00f3n personalizada a este tipo de p\u00e1gina es crear una funci\u00f3n y adjuntarla al enlace mencionado anteriormente. En su forma m\u00e1s b\u00e1sica, esto 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\">a esto:<\/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>Sin embargo, si opta por la ruta orientada a objetos, puede optar por tener una clase que acepte un gancho como argumento en el constructor y escuche que se active ese evento. Si ese es el caso, entonces su c\u00f3digo puede verse <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-01-object-id-subscriber-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed:<\/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>Independientemente, el punto es que necesita tener una clase o una funci\u00f3n que est\u00e9 conectada a un gancho que muestre informaci\u00f3n cuando se presente la pantalla.<\/p>\n<h3>Mostrar informaci\u00f3n<\/h3>\n<p>A partir de aqu\u00ed, vas a necesitar algo para renderizar. Soy fan\u00e1tico de mantener mi l\u00f3gica separada, por lo que generalmente creo un directorio de <strong>vista<\/strong> y luego coloco los archivos parciales para las vistas en ese directorio.<\/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 edici\u00f3n de categor\u00eda personalizada de WordPress\" ><\/a><\/p>\n<p>Por supuesto, siempre puede crear la cadena HTML en la funci\u00f3n PHP (pero aseg\u00farese de desinfectar la salida 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 ejemplo, lo mantendr\u00e9 simple: solo quiero obtener una lista de todas las publicaciones (u objetos, como ver\u00e1 en un momento) de la base de datos y enumerar la informaci\u00f3n en la p\u00e1gina. Para hacer esto, necesitar\u00e9 un par de consultas a la base de datos y luego puedo iterar a trav\u00e9s de la lista de resultados.<\/p>\n<p>Primero, necesito una consulta que recupere <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> de la categor\u00eda dada:<\/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>Luego, necesito recuperar una lista de todos los <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c8eb7e636f9cd42f80908a94af7946a6#file-03-object-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ID de objeto<\/a><\/strong> que est\u00e1n relacionados con 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>Desde aqu\u00ed, puedo usar la funci\u00f3n (o clase) original que cre\u00e9 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\">representar la informaci\u00f3n<\/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>Pero hay muchas cosas adicionales que puede hacer desde all\u00ed.<\/p>\n<h2>Hay m\u00e1s<\/h2>\n<p>Como se se\u00f1al\u00f3, esto devuelve las ID de los objetos que son esencialmente ID de publicaci\u00f3n (o ID de p\u00e1gina o ID de tipo de publicaci\u00f3n personalizada o lo que sea de la tabla <strong>wp_posts<\/strong> ).<\/p>\n<p>Una vez que tenga esa informaci\u00f3n, puede recuperar cualquier informaci\u00f3n, como el t\u00edtulo, el contenido, los metadatos, informaci\u00f3n diversa sobre fechas, etc.<\/p>\n<p>Sin embargo, el objetivo de la publicaci\u00f3n no es mostrar qu\u00e9 informaci\u00f3n recuperar, sino c\u00f3mo recuperar informaci\u00f3n para una taxonom\u00eda determinada y luego representarla en una p\u00e1gina de categor\u00eda personalizada de WordPress. Y esta es una forma sencilla de hacer exactamente eso.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sin embargo, el objetivo de la publicaci\u00f3n no es mostrar qu\u00e9 informaci\u00f3n recuperar, sino c\u00f3mo recuperar informaci\u00f3n para una taxonom\u00eda determinada y luego representarla en una p\u00e1gina de categor\u00eda personalizada de 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":[892,716,800,861],"tags":[1172],"class_list":["post-230544","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230544"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230544\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/235442"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}