{"id":230208,"date":"2022-11-30T17:21:00","date_gmt":"2022-11-30T14:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230208"},"modified":"2022-11-09T20:36:08","modified_gmt":"2022-11-09T17:36:08","slug":"reglas-de-reescritura-personalizadas-y-plantillas-de-pagina-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/reglas-de-reescritura-personalizadas-y-plantillas-de-pagina-en-wordpress\/","title":{"rendered":"Reglas de reescritura personalizadas y plantillas de p\u00e1gina en WordPress"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">La API de reescritura<\/a><\/strong> de WordPress es una API s\u00f3lida, suponiendo que se sienta c\u00f3modo con las expresiones regulares.<\/p>\n<p>Y, sinceramente, incluso si no lo eres, herramientas como <strong><a href=\"https:\/\/www.phpliveregex.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Live RegEx<\/a><\/strong> hacen que sea realmente f\u00e1cil probar tu c\u00f3digo antes de colocarlo en la <code>add_rewrite_rule<\/code>llamada API.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163543-61e7543bc96ee.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-163543-61e7543bc96ee.png\" alt=\"Reglas de reescritura personalizadas y plantillas de p\u00e1gina en WordPress\" ><\/a><\/p>\n<p>Sin embargo, hay momentos en los que puede encontrarse en una situaci\u00f3n en la que necesita trabajar con reglas de reescritura y plantillas de p\u00e1gina. Y cuando ese es el caso, no siempre es tan sencillo como hacer una simple llamada con una sola expresi\u00f3n regular.<\/p>\n<p>\u00bfLa raz\u00f3n? Si tiene varias p\u00e1ginas que usan la misma plantilla, no siempre tendr\u00e1 la p\u00e1gina ubicada en el mismo \u00edndice en la consulta que se ejecuta en cada p\u00e1gina.<\/p>\n<p>Con ese fin, tenemos que manejarlo de una manera ligeramente diferente a, digamos, simplemente accediendo a un \u00edndice num\u00e9rico de informaci\u00f3n en la consulta global.<\/p>\n<h2>Reglas de reescritura y plantillas de p\u00e1gina<\/h2>\n<p>Primero, supongamos que tenemos dos plantillas (que no est\u00e1n en ning\u00fan orden en particular):<\/p>\n<ol>\n<li>plantilla-alfa.php<\/li>\n<li>plantilla-beta.php<\/li>\n<\/ol>\n<p>Y luego digamos que queremos configurar una URL personalizada para las p\u00e1ginas, cada una de las cuales usa una de estas plantillas.<\/p>\n<p>Esto se dividir\u00eda en los siguientes pasos:<\/p>\n<ol>\n<li>Iterar a trav\u00e9s de las publicaciones en la consulta,<\/li>\n<li>Guarde la publicaci\u00f3n usando la plantilla en su matriz respectiva,<\/li>\n<li>Configure las reglas de reescritura para cada publicaci\u00f3n que tenga una consulta determinada.<\/li>\n<\/ol>\n<p>Para este ejemplo, mantendr\u00e9 las reglas de reescritura bastante simples. Despu\u00e9s de todo, las expresiones regulares pueden ser lo suficientemente dif\u00edciles de seguir, por lo que tratar de seguirlas mientras se trata con el objeto Query, varias matrices y el manejo de las reglas puede ser un poco demasiado.<\/p>\n<p>Dicho esto, aqu\u00ed hay un c\u00f3digo de muestra que se desglosa seg\u00fan los pasos anteriores. Al final de la publicaci\u00f3n, compartir\u00e9 un fragmento que re\u00fane todo en algunas funciones separadas para que pueda ver c\u00f3mo encaja todo esto.<\/p>\n<p>Dicho esto, aqu\u00ed le mostramos c\u00f3mo manejar todo lo anterior.<\/p>\n<h3>1 Adici\u00f3n de reglas de reescritura<\/h3>\n<p>Primero, necesitamos leer alguna informaci\u00f3n del objeto de consulta global de WordPress para encontrar todas las p\u00e1ginas que tienen plantillas aplicadas.<\/p>\n<p>Para hacer esto, podemos leer la informaci\u00f3n <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-00-read-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">del objeto de consulta global en una variable local<\/a><\/strong>. Esto facilita eludir el resto del c\u00f3digo si no hay nada con lo que trabajar.<\/p>\n<pre><code>&lt;?php \n\n$query = $this-&gt;query-&gt;query([\n    'post_type' =&gt; 'page',\n    'meta_key' =&gt; '_wp_page_template',\n    'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n]);\n\nif (!$query) {\n    return;\n}\n\n\/\/ More to come...\n<\/code><\/pre>\n<h3>2 Almacenar informaci\u00f3n relevante en una matriz<\/h3>\n<p>Suponiendo que hay p\u00e1ginas que tienen plantillas, procederemos a <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-001-store-templated-pages-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">almacenar cada una de las p\u00e1ginas<\/a><\/strong> en matrices para que podamos administrar f\u00e1cilmente sus respectivas reglas de reescritura.<\/p>\n<pre><code>&lt;?php\n\nforeach ($query as $post) {\n    $slug = get_page_template_slug($post-&gt;ID);\n\n    if ('template-alpha.php' === $slug) {\n        $this-&gt;alphaPages[] = $post;\n    }\n\n    if ('template-find-a-camp.php' === $slug) {\n        $this-&gt;betaPages[] = $post;\n    }\n}\n<\/code><\/pre>\n<p>Tenga en cuenta que en lo anterior, hago referencia a una matriz global. Suponga que esto simplemente se inicializa como una matriz vac\u00eda en el constructor de la clase.<\/p>\n<h3>3 Configurar las reglas de reescritura<\/h3>\n<p>Ahora que tenemos dos matrices, una para cada plantilla y las p\u00e1ginas que la contienen, podemos iterar a trav\u00e9s de ellas y asignar reglas de reescritura para cada una de esas p\u00e1ginas.<\/p>\n<p>Por ejemplo, digamos que para una plantilla, digamos alfa, queremos configurar reglas de reescritura para los EE. UU. y los estados.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-02-country-state-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Aqu\u00ed est\u00e1 el c\u00f3digo<\/a><\/strong> para<code>template-alpha.php<\/code>:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%country%', '([^&amp;]+)');\nadd_rewrite_tag('%state%', '([^&amp;]+)');\n\nforeach ($this-&gt;alphaPages as $post) {\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n        'top'\n    );\n\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Y <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-03-acme-id-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqu\u00ed est\u00e1 el c\u00f3digo<\/a><\/strong> para <code>template-beta.php<\/code>:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\nforeach ($this-&gt;betaPages as $post) {\n    add_rewrite_rule(\n        '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Por supuesto, las expresiones regulares utilizadas en el c\u00f3digo anterior son simplemente para fines de demostraci\u00f3n. El tuyo ser\u00e1 para lo que sea necesario para tu proyecto.<\/p>\n<h3>4 Todos juntos ahora<\/h3>\n<p>Es importante dividir toda esta funcionalidad en sus propios m\u00e9todos para que todo pueda encapsularse y probarse f\u00e1cilmente, si es necesario.<\/p>\n<p>Con ese fin, as\u00ed es como se ver\u00e1 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-04-final-functions-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el c\u00f3digo completo :<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function addRewriteRules()\n{\n    $query = $this-&gt;query-&gt;query([\n        'post_type' =&gt; 'page',\n        'meta_key' =&gt; '_wp_page_template',\n        'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n    ]);\n\n    if (!$query) {\n        return;\n    }\n\n    $this-&gt;setPageTypes($query);\n    $this-&gt;setAlphaRewriteRules();\n    $this-&gt;setBetaRewriteRules();\n}\n\nprivate function setPageTypes($query)\n{\n    foreach ($query as $post) {\n        $slug = get_page_template_slug($post-&gt;ID);\n\n        if ('template-alpha.php' === $slug) {\n            $this-&gt;alphaPages[] = $post;\n        }\n\n        if ('template-find-a-camp.php' === $slug) {\n            $this-&gt;betaPages[] = $post;\n        }\n    }\n}\n\nprivate function setAlphaRewriteRules()\n{\n    add_rewrite_tag('%country%', '([^&amp;]+)');\n    add_rewrite_tag('%state%', '([^&amp;]+)');\n\n    foreach ($this-&gt;alphaRules as $post) {\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n            'top'\n        );\n\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n            'top'\n        );\n    }\n}\n\nprivate function setBetaRewriteRules()\n{\n    add_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\n    foreach ($this-&gt;betaPages as $post) {\n        add_rewrite_rule(\n            '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n            'top'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Recuerde, sin embargo; esto solo se basa en el c\u00f3digo de demostraci\u00f3n compartido en esta publicaci\u00f3n. Cuando est\u00e9 trabajando en su proyecto, las expresiones regulares, las plantillas, etc. variar\u00e1n.<\/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>Hay momentos en los que puede encontrarse en una situaci\u00f3n en la que necesita trabajar con reglas de reescritura y plantillas de p\u00e1gina.<\/p>\n","protected":false},"author":1,"featured_media":163544,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,840,861],"tags":[1172],"class_list":["post-230208","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230208","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=230208"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230208\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/163544"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}