{"id":230829,"date":"2022-12-15T20:37:00","date_gmt":"2022-12-15T17:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230829"},"modified":"2022-12-07T11:39:08","modified_gmt":"2022-12-07T08:39:08","slug":"plantillas-de-archivo-personalizadas-una-breve-guia","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/plantillas-de-archivo-personalizadas-una-breve-guia\/","title":{"rendered":"Plantillas de archivo personalizadas: una breve gu\u00eda"},"content":{"rendered":"\n<p>Siempre que trabaje con plantillas de archivo en WordPress, las publicaciones generalmente se enumeran por fecha en orden descendente. Es decir, las publicaciones m\u00e1s recientes se enumeran en la parte superior y luego contin\u00faa desde all\u00ed.<\/p>\n<p>\u00daltimamente, he estado trabajando en algunos proyectos que se integran con API de terceros. Estas API devuelven fechas, a veces dos fechas, una fecha de inicio y una fecha de finalizaci\u00f3n, para un evento determinado y los clientes desean usar esa informaci\u00f3n para enumerar publicaciones en lugar de la fecha de la publicaci\u00f3n. Es decir, quieren plantillas de archivo personalizadas.<\/p>\n<p>No es demasiado dif\u00edcil hacer esto, pero antes de hacerlo, creo que es importante brindar informaci\u00f3n general sobre c\u00f3mo se construye el proyecto para que haya un poco m\u00e1s de contexto sobre por qu\u00e9, digamos, se necesita una consulta personalizada y por qu\u00e9 puede o puede no es necesario buscar en <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a>.<\/p>\n<p>Sin embargo, comenzar\u00e9 con un TL; DR primero. De esa manera, puedes hacerte una idea antes de leer todo.<\/p>\n<h2>Plantillas de archivo personalizadas<\/h2>\n<p>Entonces, el TL; DR detr\u00e1s de todo esto es este:<\/p>\n<ul>\n<li>la informaci\u00f3n de fecha proporcionada por la API de terceros se mantiene en la tabla de metadatos de la publicaci\u00f3n,<\/li>\n<li>la clave es la fecha de inicio y el valor es la fecha real,<\/li>\n<li>Ordeno el contenido en orden descendente y por el valor meta.<\/li>\n<\/ul>\n<p>La paginaci\u00f3n puede ser un problema, y \u200b\u200bsi usa un tipo de publicaci\u00f3n personalizada, necesitar\u00e1 algunos par\u00e1metros adicionales, pero esa es la idea general.<\/p>\n<p>Ahora para toda la configuraci\u00f3n.<\/p>\n<h3>Tipos de publicaciones personalizadas<\/h3>\n<p>Cuando se trata de interactuar con API de terceros, soy un gran admirador de los tipos de publicaciones personalizadas porque tiendo a pensar en ellos como un h\u00edbrido entre modelos y vistas.<\/p>\n<ul>\n<li>El componente del modelo incluye todo lo que est\u00e1 relacionado tangencialmente y se puede escribir en la base de datos. Esto significa cualquier informaci\u00f3n de taxonom\u00eda o metadatos de publicaciones.<\/li>\n<li>El componente de vista generalmente es cualquier cosa que se incluye en la plantilla que puede aprovechar cualquier etiqueta de plantilla preexistente, es cualquier cosa que deba crearse y que tambi\u00e9n lea informaci\u00f3n de la base de datos.<\/li>\n<\/ul>\n<p>Para esta publicaci\u00f3n, <strong>usar\u00e9 acme-event<\/strong> como el tipo de publicaci\u00f3n personalizada.<\/p>\n<h3>Publicar metadatos<\/h3>\n<p>Establec\u00ed las fechas en los metadatos de la publicaci\u00f3n en lugar de en la publicaci\u00f3n en s\u00ed porque si algo va a suceder en el futuro y los datos se establecen en el registro de la publicaci\u00f3n en s\u00ed, WordPress lo tratar\u00e1 como una publicaci\u00f3n <strong>programada<\/strong> que no est\u00e1 publicada. .<\/p>\n<\/p>\n<p>En cambio, prefiero publicar la publicaci\u00f3n y luego cambiar la forma en que se muestran los metadatos en la plantilla.<\/p>\n<h3>Paginaci\u00f3n<\/h3>\n<p>WordPress hace una distinci\u00f3n sutil con la paginaci\u00f3n en su base de c\u00f3digo. Es decir, la variable de consulta para sitios sin una p\u00e1gina de inicio est\u00e1tica usa <strong>paged<\/strong> y el caso contrario usa <strong>page<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161511-61e724257d2b2.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-161511-61e724257d2b2.png\" alt=\"Plantillas de archivo personalizadas: una breve gu\u00eda\" ><\/a><\/p>\n<p>Esto importa cuando est\u00e1s construyendo los argumentos para la consulta a la que llegar\u00e9 en un momento.<\/p>\n<h3>Solo p\u00e1ginas de archivo<\/h3>\n<p>Recuerde que siempre que est\u00e9 introduciendo la paginaci\u00f3n, solo querr\u00e1 cambiar la consulta siempre que est\u00e9 en la p\u00e1gina de archivo real.<\/p>\n<p>Esto significa que no le importan los casos cuando se encuentra en el \u00e1rea administrativa de WordPress y no desea modificar la consulta de archivos de tipo de publicaci\u00f3n no personalizados. Con ese fin, querr\u00e1 asegurarse de que est\u00e1 configurando la variable de consulta correctamente en la devoluci\u00f3n de llamada pre_get_posts.<\/p>\n<p>Tenga en cuenta que puedo mostrar una funci\u00f3n sobre c\u00f3mo hacer esto, pero debido a c\u00f3mo escribimos c\u00f3digo en WordPress, es decir, algunos escriben c\u00f3digo de procedimiento, otros escriben c\u00f3digo orientado a objetos, simplemente lo mostrar\u00e9 en c\u00f3digo de procedimiento.<\/p>\n<h3>Reuni\u00e9ndolo todo<\/h3>\n<p>Primero, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-00-custom-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">construir\u00e9 la consulta:<\/a><\/p>\n<pre><code>&lt;?php\n\n$eventQuery = new WP_Query([\n    'post_type' =&gt; 'acme-events',\n    'post_status' =&gt; 'publish',\n    'orderby' =&gt; 'meta_value',\n    'order' =&gt; 'desc',\n    'meta_key' =&gt; 'acme-event-start-date-time',\n    'posts_per_archive_page' =&gt; 5,\n    'paged' =&gt; get_query_var('paged')? get_query_var('paged'): 1\n]);<\/code><\/pre>\n<p>Tenga en cuenta que en el c\u00f3digo anterior hay un argumento para <strong>paginado<\/strong>. Hablar\u00e9 sobre el c\u00f3digo para esto moment\u00e1neamente.<\/p>\n<p>Luego, la plantilla incluir\u00e1 cualquier informaci\u00f3n que elija mostrar. Elijo no compartir el c\u00f3digo de mi plantilla en esta publicaci\u00f3n porque es irrelevante para la gran idea que tenemos entre manos.<\/p>\n<p>Adem\u00e1s, tienes todo lo que necesitas para mostrar el contenido.<\/p>\n<p>A continuaci\u00f3n, configurar\u00e9 la paginaci\u00f3n. Primero, necesito hacer esto usando el gancho pre_get_posts para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-01-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">asegurarme de que se establece la variable de consulta adecuada<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('pre_get_posts', 'setCustomQueryVariable');\npublic function setCustomQueryVariable($query)\n{\n    if (is_admin() || !is_archive()) {\n        return;\n    }\n\n    if ($query-&gt;is_archive('acme-events')) {\n        set_query_var('posts_per_page', 5);\n    }\n}<\/code><\/pre>\n<p>Luego <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-02-pagination-links-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implementar\u00e9 la paginaci\u00f3n<\/a> usando la consulta personalizada:<\/p>\n<pre><code>&lt;?php\n\n&lt;a class=\"next page-numbers\" href=\"&lt;?php echo esc_attr(get_next_posts_page_link($eventQuery-&gt;max_num_pages)); ?&gt;\"&gt;\n    Next Page\n&lt;\/a&gt;\n\n&lt;a class=\"prev page-numbers\" href=\"&lt;?php echo esc_attr(get_previous_posts_page_link()); ?&gt;\"&gt;\n    Previous Page\n&lt;\/a&gt;<\/code><\/pre>\n<p>Y despu\u00e9s de eso, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-03-reset-post-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">restablecer\u00e9 la variable global $post<\/a> usando wp_reset_postdata() en caso de que se necesite usar algo de la publicaci\u00f3n original.<\/p>\n<pre><code>&lt;?php wp_reset_postdata(); ?&gt;<\/code><\/pre>\n<p>De todos modos, esto generalmente se considera una buena limpieza cada vez que utiliza una consulta personalizada.<\/p>\n<h3>Enlaces \u00fatiles<\/h3>\n<p>A continuaci\u00f3n hay una lista de funciones, p\u00e1ginas y referencias que pueden resultarle \u00fatiles en relaci\u00f3n con el c\u00f3digo anterior o cualquier trabajo futuro que pueda realizar.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Pagination\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Paginaci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/set_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">set_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">actualizaci\u00f3n_post_meta<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_reset_postdata\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_reset_postdata<\/a><\/li>\n<li>El <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c\u00f3digo completo<\/a> en este post.<\/li>\n<\/ul>\n<p>Si ha estado trabajando con WordPress durante mucho tiempo, algunos de estos pueden parecer redundantes. En otros casos, puede parecer nuevo, o puede arrojar luz sobre \u00e1reas de las API de WordPress que no sab\u00edas que existen (al menos ese fue mi caso).<\/p>\n<h2>\u00bfPor qu\u00e9 molestarse con todo esto?<\/h2>\n<p>Esto puede parecer una publicaci\u00f3n larga para una tarea aparentemente simple, pero la informaci\u00f3n est\u00e1 un poco dispersa por toda la web en lo que respecta a hacer algo como esto.<\/p>\n<p>As\u00ed que quer\u00eda intentar reunirlo todo con explicaciones, c\u00f3digo de ejemplo y enlaces a p\u00e1ginas que pueden ser de inter\u00e9s dependiendo de c\u00f3mo se realice la implementaci\u00f3n.<\/p>\n<p>Despu\u00e9s de todo, muchos de nosotros estamos usando WordPress m\u00e1s all\u00e1 de la gesti\u00f3n b\u00e1sica de contenido en este momento, pero eso no significa que no debamos aprovechar sus funciones y API integradas cuando sea posible.<\/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>Considere esto como un curso acelerado para crear plantillas de archivo personalizadas y toda la funcionalidad que las rodea.<\/p>\n","protected":false},"author":1,"featured_media":236214,"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-230829","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\/230829","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=230829"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230829\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236214"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230829"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230829"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}