{"id":233559,"date":"2023-02-17T12:38:00","date_gmt":"2023-02-17T09:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233559"},"modified":"2022-11-11T00:20:59","modified_gmt":"2022-11-10T21:20:59","slug":"cree-tipos-de-publicaciones-personalizadas-y-taxonomias-personalizadas-en-wordpress-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/cree-tipos-de-publicaciones-personalizadas-y-taxonomias-personalizadas-en-wordpress-por-codigo\/","title":{"rendered":"Cree tipos de publicaciones personalizadas y taxonom\u00edas personalizadas en WordPress por c\u00f3digo"},"content":{"rendered":"\n<p>Este es un tutorial sobre c\u00f3mo crear un tipo de publicaci\u00f3n personalizada y una taxonom\u00eda personalizada en WordPress por c\u00f3digo. Veremos las trampas comunes y qu\u00e9 argumentos usar para una creaci\u00f3n m\u00ednima pero suficiente. Ejemplo completo incluido al final.<\/p>\n<h2>D\u00f3nde agregar el c\u00f3digo<\/h2>\n<p>La creaci\u00f3n de tipos de publicaciones personalizadas (CPT) y taxonom\u00edas personalizadas en WordPress se puede realizar dentro del <code>functions.php<\/code>archivo de un tema o dentro de un complemento. Tenga en cuenta que el tipo de publicaci\u00f3n personalizada y la taxonom\u00eda personalizada desaparecer\u00e1n si cambia de tema o desactiva el complemento. Por lo tanto, es seguro eliminar temporalmente el registro de CPT del tema y moverlo a un complemento, siempre que mantenga el mismo tipo de publicaci\u00f3n personalizada o identificador de taxonom\u00eda slug\/ID.<\/p>\n<p>Para crear (y modificar) un CPT o una taxonom\u00eda, <strong>utilice siempre<\/strong> el <code>init<\/code>gancho. Colocarlo en la ra\u00edz de <code>functions.php<\/code>(fuera de un anzuelo) o cualquier otro anzuelo causar\u00e1 problemas.<\/p>\n<h2>Crear un tipo de publicaci\u00f3n personalizada<\/h2>\n<p>Para crear un tipo de publicaci\u00f3n personalizada, use la <code>register_post_type<\/code>funci\u00f3n. Acepta dos par\u00e1metros; primero el identificador de tipo de publicaci\u00f3n y segundo una matriz con todos los argumentos.<\/p>\n<p>El identificador de tipo de publicaci\u00f3n es un nombre de versi\u00f3n slug de su tipo de publicaci\u00f3n. Por ejemplo, los tipos de publicaciones y p\u00e1ginas integradas de WordPress se identifican como &#8216; <code>post<\/code>&#8216; y &#8216; <code>page<\/code>&#8216;. El identificador debe ser \u00fanico, debe seguir un conjunto de reglas (min\u00fasculas, sin espacios, etc.) y no ser uno de los slugs reservados de WordPress.<\/p>\n<p>Esto es lo que he aprendido a ser los argumentos m\u00ednimos pero perfectamente buenos para registrar un tipo de publicaci\u00f3n; teniendo en cuenta que es un CPT p\u00fablico normal y desea anular cualquier etiqueta que diga &quot;publicaci\u00f3n&quot; o &quot;p\u00e1gina&quot; con el nombre real de su CPT:<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n});<\/code><\/pre>\n<h3>Una visi\u00f3n general de los argumentos.<\/h3>\n<p>Tenga en cuenta que algunos de los argumentos heredan valores de otros argumentos. A menos que se establezcan expl\u00edcitamente, pueden tener el mismo valor predeterminado o el opuesto a otro. Varios argumentos heredan el mismo valor o el opuesto del argumento <code>public<\/code>. Lea <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_post_type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentaci\u00f3n<\/a> para ver cu\u00e1l es el valor predeterminado para cada argumento y si necesita anularlo.<\/p>\n<p>Si est\u00e1 de acuerdo con tener textos en el administrador que se refieran a su tipo de publicaci\u00f3n como &quot;publicaci\u00f3n&quot; o &quot;p\u00e1gina&quot;, puede omitir la definici\u00f3n de los argumentos de la etiqueta. Probablemente estar\u00e1 bien con solo <code>label<\/code>(nombre plural) y dentro de la <code>labels<\/code>matriz solo <code>singular_name<\/code>(nombre singular).<\/p>\n<p>Si no establece expl\u00edcitamente <code>show_in_rest<\/code>en verdadero, su tipo de posici\u00f3n personalizada utilizar\u00e1 el antiguo editor cl\u00e1sico. <strong>Si desea utilizar el editor Gutenberg para su tipo de publicaci\u00f3n personalizada, debe establecerlo <code>show_in_rest<\/code>en true<\/strong>.<\/p>\n<p>El <code>supports<\/code>argumento indica qu\u00e9 elementos est\u00e1n disponibles al editar una publicaci\u00f3n en su tipo de publicaci\u00f3n. Como m\u00ednimo, probablemente desee el t\u00edtulo, el editor y la imagen destacada de la publicaci\u00f3n.<\/p>\n<p>El <code>rewrite<\/code>argumento con el m\u00ednimo de elemento de matriz <code>slug<\/code>le dice a WordPress que reescriba todas las publicaciones singulares de su tipo de publicaci\u00f3n para usar este slug de prefijo. En el ejemplo anterior, una publicaci\u00f3n de libro singular obtendr\u00eda una URL como; \u00bb <a href=\"http:\/\/example.com\/book\/i-robot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">http:\/\/ejemplo.com\/libro\/i-robot\/<\/a> \u00ab. Si est\u00e1 interesado en c\u00f3mo agregar una configuraci\u00f3n de regla de enlace permanente en el administrador para permitir que los usuarios del tema decidan este slug por s\u00ed mismos, eche un vistazo a <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-a-custom-permalink-setting-for-your-custom-post-type\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta publicaci\u00f3n<\/a>.<\/p>\n<p>El argumento para el \u00edcono de men\u00fa (<code>menu_icon<\/code>) puede ser cualquiera de los siguientes <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dashicons<\/a>, o puede dejarlo vac\u00edo para mantener el valor predeterminado. El valor predeterminado es el mismo icono que Publicaciones. Sin embargo, es una buena idea separar claramente los tipos de publicaciones personalizadas.<\/p>\n<p>La posici\u00f3n del men\u00fa (<code>menu_position<\/code>) le permite decidir la posici\u00f3n de su tipo de publicaci\u00f3n personalizada en el men\u00fa de administraci\u00f3n. La documentaci\u00f3n enumera todas las posiciones del men\u00fa de administraci\u00f3n, para que pueda ajustar; la posici\u00f3n 5 est\u00e1 justo despu\u00e9s de &#8216;Publicaciones&#8217;.<\/p>\n<p>Hay otro argumento (<code>taxonomies<\/code>) para adjuntar una taxonom\u00eda al tipo de publicaci\u00f3n. Veremos c\u00f3mo agregar una taxonom\u00eda personalizada m\u00e1s adelante en esta publicaci\u00f3n. Para agregar taxonom\u00edas a su tipo de publicaci\u00f3n, agregue este argumento a la matriz anterior;<\/p>\n<pre><code>'taxonomies' =&gt; ['book_author'],<\/code><\/pre>\n<h3>Una nota sobre los enlaces permanentes y los errores 404 no encontrados<\/h3>\n<p>Despu\u00e9s de haber agregado su c\u00f3digo para registrar un tipo de publicaci\u00f3n personalizada, notar\u00e1 que ver una sola publicaci\u00f3n devolver\u00e1 el error &quot;404 no encontrado&quot;. Esto se debe a que necesita &quot;actualizar enlaces permanentes&quot;.<\/p>\n<p>Vaya a Configuraci\u00f3n &gt; Enlaces permanentes y simplemente haga clic en el bot\u00f3n &quot;Guardar cambios&quot; (no es necesario cambiar nada).<\/p>\n<p>Tenga en cuenta que cada vez que cambie el <code>rewrite<\/code>atributo, deber\u00e1 actualizar los enlaces permanentes nuevamente.<\/p>\n<h2>Creaci\u00f3n de una taxonom\u00eda personalizada<\/h2>\n<p>Se puede adjuntar una taxonom\u00eda personalizada a uno de los tipos de publicaciones de WordPress (publicaciones, p\u00e1ginas) o a un tipo de publicaci\u00f3n personalizado. Tambi\u00e9n puede adjuntar varias taxonom\u00edas a un tipo de publicaci\u00f3n. Cuando registra una taxonom\u00eda, debe proporcionar los tipos de publicaci\u00f3n a los que desea que se adjunte.<\/p>\n<p>Una taxonom\u00eda puede ser jer\u00e1rquica (como categor\u00edas de publicaciones en las que puede crear una estructura basada en \u00e1rboles) o basada en etiquetas (como etiquetas de publicaciones). Esta es realmente la \u00fanica consideraci\u00f3n que necesita saber de antemano, con la excepci\u00f3n de su identificador slug. Al igual que con los CPT, el slug de identificaci\u00f3n de una taxonom\u00eda debe ser \u00fanico y seguir un conjunto de reglas.<\/p>\n<p>Para registrar una taxonom\u00eda personalizada, utilice la <code>register_taxonomy<\/code>funci\u00f3n. Acepta el <code>register_taxonomy<\/code>slug del identificador \u00fanico de taxonom\u00eda como primer argumento, una matriz de tipos de publicaciones para adjuntarla como segundo argumento y, finalmente, una matriz con el resto de los argumentos. Hay muchos argumentos, pero esto es lo que he experimentado como m\u00ednimo pero suficiente para registrar una taxonom\u00eda personalizada (esto agrega una taxonom\u00eda de tipo etiqueta\/no jer\u00e1rquica):<\/p>\n<pre><code>add_action('init', function() {\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n});<\/code><\/pre>\n<p>Se recomienda agregar una llamada de funci\u00f3n justo despu\u00e9s del <code>register_taxonomy<\/code>, para asegurarse de que se &quot;adjunte&quot; correctamente al CPT: <code>register_taxonomy_for_object_type<\/code>. Defina su taxonom\u00eda como primer argumento y el CPT como segundo:<\/p>\n<pre><code>register_taxonomy_for_object_type('book_author', 'book');<\/code><\/pre>\n<p>De manera similar al tipo de publicaci\u00f3n anterior, <code>register_taxonomy<\/code>acepta muchos m\u00e1s argumentos, y muchos de ellos heredan o dependen del valor de otros argumentos. Lea <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_taxonomy\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentaci\u00f3n<\/a> para ver cu\u00e1l es el valor predeterminado para cada argumento y si necesita anularlo.<\/p>\n<h3>Una visi\u00f3n general de los argumentos.<\/h3>\n<p>Si est\u00e1 de acuerdo con tener textos que se refieran a su taxonom\u00eda como &quot;etiqueta&quot; (si jer\u00e1rquico es falso) o &quot;categor\u00eda&quot; (si jer\u00e1rquico es verdadero), probablemente pueda omitir toda la <code>labels<\/code>matriz con la excepci\u00f3n de quiz\u00e1s <code>singular_name<\/code>.<\/p>\n<p>Es <code>show_admin_column<\/code>\u00fatil para agregar una columna que muestre los t\u00e9rminos asociados en su taxonom\u00eda en la pantalla de administraci\u00f3n de CPT. Al igual que en Publicaciones, ver\u00e1 una columna que muestra las categor\u00edas asociadas. Este argumento est\u00e1 configurado de forma predeterminada en <code>false<\/code>(no mostrar columna), por lo que me gusta anularlo.<\/p>\n<p>La configuraci\u00f3n <code>show_in_rest<\/code>en verdadero es necesaria para que su taxonom\u00eda sea visible en la edici\u00f3n posterior en el editor de Gutenberg, ya que Gutenberg se basa en la API REST.<\/p>\n<p>Del mismo modo que con los tipos de publicaciones personalizadas, probablemente obtendr\u00e1 errores &quot;404 no encontrado&quot; en su taxonom\u00eda personalizada. Vaya a Configuraci\u00f3n &gt; Enlaces permanentes y simplemente haga clic en el bot\u00f3n &quot;Guardar cambios&quot;.<\/p>\n<h2>C\u00f3digo de ejemplo completo<\/h2>\n<p>Aqu\u00ed hay un ejemplo completo de c\u00f3mo crear un CPT para libros y adjuntar dos taxonom\u00edas personalizadas; g\u00e9nero (jer\u00e1rquico) y autor del libro (etiqueta).<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_author', 'book_genre'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n\u00a0\n    register_taxonomy('book_genre', ['book'], [\n        'label' =&gt; __('Genres', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-genre'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Genre', 'txtdomain'),\n            'all_items' =&gt; __('All Genres', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Genre', 'txtdomain'),\n            'view_item' =&gt; __('View Genre', 'txtdomain'),\n            'update_item' =&gt; __('Update Genre', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Genre', 'txtdomain'),\n            'new_item_name' =&gt; __('New Genre Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Genres', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Genre', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Genre:', 'txtdomain'),\n            'not_found' =&gt; __('No Genres found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_genre', 'book');\n\u00a0\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used Authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_author', 'book');\n});<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una gu\u00eda para crear tipos de publicaciones personalizadas y taxonom\u00edas personalizadas en WordPress por c\u00f3digo. Cubre los argumentos a utilizar para la creaci\u00f3n m\u00ednima pero suficiente.<\/p>\n","protected":false},"author":1,"featured_media":152888,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[924,892,892,716,716,914,1110,914,800,800,924,840,840,861,861],"tags":[1172],"class_list":{"0":"post-233559","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-asignaturas","8":"category-codigo","10":"category-desarrollador","12":"category-otro","13":"category-n-a","15":"category-php-2","18":"category-tutoriales","20":"category-wordpress-2","22":"tag-affiai-es"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233559","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=233559"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233559\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/152888"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}