{"id":233694,"date":"2023-02-21T13:22:00","date_gmt":"2023-02-21T10:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233694"},"modified":"2022-11-11T08:55:16","modified_gmt":"2022-11-11T05:55:16","slug":"tutorial-puntos-finales-de-url-personalizados-con-la-api-de-reescritura-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/tutorial-puntos-finales-de-url-personalizados-con-la-api-de-reescritura-de-wordpress\/","title":{"rendered":"Tutorial: Puntos finales de URL personalizados con la API de reescritura de WordPress"},"content":{"rendered":"\n<p>\u00bfAlguna vez dese\u00f3 poder extender publicaciones individuales, p\u00e1ginas o sus tipos de publicaciones personalizadas con una plantilla personalizada que mantiene su propia estructura de URL? <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Con la API de reescritura<\/a> de WordPress, esto es completamente posible y nada dif\u00edcil.<\/p>\n<p>En este tutorial, veremos c\u00f3mo agregar una vista de tipo de publicaci\u00f3n personalizada \u00fanica con otro slug que cargue una plantilla diferente. En otras palabras, si una sola publicaci\u00f3n de tipo de publicaci\u00f3n personalizada tiene la URL &quot;ejemplo.com\/destino\/venecia\/&quot;, puede agregar reglas de URL para p\u00e1ginas separadas con informaci\u00f3n relacionada con cada destino, por ejemplo, &quot;ejemplo.com\/destino\/venecia&quot;. \/actividades\/&quot; y \u00abejemplo.com\/destino\/venecia\/atracciones\/\u00bb.<\/p>\n<p>Si est\u00e1 interesado en c\u00f3mo agregar puntos finales a la p\u00e1gina &quot;Mi cuenta&quot; de WooCommerce, \u00a1tengo <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-custom-endpoints-to-my-account-page-in-woocommerce\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">otra publicaci\u00f3n<\/a> sobre eso!<\/p>\n<p>La API de reescritura de WordPress tiene muchas funciones \u00fatiles para escribir sus propias reglas de URL personalizadas. Es posible que haya visto la funci\u00f3n m\u00e1s conocida y amplia; <code>add_rewrite_rule()<\/code>. Sin embargo, este tutorial usa el similar <code>add_rewrite_endpoint()<\/code>, que es muy \u00fatil para agregar &quot;puntos finales&quot; de URL (b\u00e1sicamente agregar slugs de URL personalizados despu\u00e9s de algo que ya existe, por ejemplo, despu\u00e9s del final de una sola publicaci\u00f3n o categor\u00eda \u00fanica). Puede lograr el mismo resultado usando <code>add_rewrite_rule()<\/code>pero el proceso de agregar puntos finales es m\u00e1s simple.<\/p>\n<h2>que haremos<\/h2>\n<p>Esta gu\u00eda asumir\u00e1 que hemos creado dos tipos de publicaciones personalizadas; &#8216;pel\u00edcula&#8217; y &#8216;actor&#8217;. La regla de enlace permanente para una sola pel\u00edcula es &quot;example.com\/movie\/fight-club\/&quot; y para un solo actor &quot;example.com\/actor\/brad-pitt\/&quot;. Queremos una p\u00e1gina separada para cada pel\u00edcula que muestre a todos los actores en esa pel\u00edcula, ubicada en &quot;example.com\/movie\/fight-club\/actors\/&quot; y, de manera similar, una p\u00e1gina separada para cada actor que muestre todas las pel\u00edculas en las que ha estado. ubicado en &quot;example.com\/actor\/brad-pitt\/movies\/&quot;.<\/p>\n<p>No entrar\u00e9 en detalles sobre c\u00f3mo agregar estos dos tipos de publicaciones personalizadas; Si necesita ayuda para hacer esta parte, le recomiendo leer mi publicaci\u00f3n sobre <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-post-types-and-custom-taxonomies\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c\u00f3mo agregar tipos de publicaciones personalizadas<\/a>.<\/p>\n<h2>escribiendo el c\u00f3digo<\/h2>\n<p>El primer paso es llamar <code>add_rewrite_endpoint()<\/code>a una funci\u00f3n vinculada a <code>init<\/code>(generalmente todas las funciones en Rewrite API est\u00e1n vinculadas a <code>init<\/code>). para registrar nuestros dos puntos finales deseados; &#8216;pel\u00edculas&#8217; y &#8216;actores&#8217;. La <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\/add_rewrite_endpoint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funci\u00f3n<\/a> toma dos argumentos; primero, el punto final que desea (p. ej., &#8216;pel\u00edculas&#8217;) y, en segundo lugar, una constante para el lugar donde debe &quot;vivir&quot; el punto final (p. ej., p\u00e1ginas, autor, archivos, etc.). Mire la documentaci\u00f3n para saber qu\u00e9 constantes puede usar; en cuanto a este ejemplo el general <code>EP_PERMALINK<\/code>esta bien:<\/p>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('movies', EP_PERMALINK);\n    add_rewrite_endpoint('actors', EP_PERMALINK);\n});<\/code><\/pre>\n<p>NB: si su tipo de publicaci\u00f3n personalizada es jer\u00e1rquica, lo que significa que tiene <code>'hierarchical' =&gt; true<\/code>en su <code>register_post_type()<\/code>, debe cambiar la constante <code>EP_PERMALINK<\/code>con <code>EP_PAGES<\/code>.<\/p>\n<p>Despu\u00e9s de guardar este c\u00f3digo, debe ir a Configuraci\u00f3n&gt; Enlaces permanentes y simplemente hacer clic en el bot\u00f3n Guardar para actualizar los enlaces permanentes. \u00a1Cada vez que agrega o modifica una regla de reescritura, debe actualizar sus enlaces permanentes para que funcione!<\/p>\n<h3>Manejo de las variables de consulta<\/h3>\n<p>La forma en que usted, como desarrollador de temas o complementos, puede determinar si mostrar o no las plantillas para estos puntos finales, es revisando &quot;query vars&quot;; b\u00e1sicamente el objeto de consulta global de WordPress. Hacemos esto llamando <code>get_query_var()<\/code>con la consulta como argumento (&#8216;pel\u00edculas&#8217; o &#8216;actores&#8217;).<\/p>\n<p>Si ha trabajado con <code>add_rewrite_rule()<\/code>o <code>get_query_var()<\/code>antes, es posible que ya sepa que WordPress no agrega autom\u00e1ticamente variables de consulta personalizadas. Por lo general, tendr\u00eda que filtrar <code>query_vars<\/code>y agregar sus variables personalizadas para que WordPress las complete. Sin embargo <code>add_rewrite_endpoint()<\/code>autom\u00e1ticamente hace esto por nosotros.<\/p>\n<p>Sin embargo, si intentamos llamar <code>get_query_var('movies')<\/code>nunca parecer\u00e1 estar configurado. Eso es porque asume que tiene que tener un valor para poder establecerse. Las reglas de punto final asumen que lo que viene despu\u00e9s del punto final es el valor. Por ejemplo, &quot;example.com\/actor\/brad-pitt\/movies\/some-value\/&quot; funcionar\u00eda, porque en esta p\u00e1gina <code>get_query_var('movies')<\/code>devolver\u00eda el valor &#8216;some-value&#8217;. Pero esto no es lo que queremos, queremos que funcione solo con el punto final \u00fanico. Para resolver esto, debemos conectarnos al <code>request<\/code>filtro de WordPress e informar a WordPress que si estamos en nuestros puntos finales, las variables de consulta deben agregar el punto final con alg\u00fan valor (simplemente lo configuramos en <code>true<\/code>).<\/p>\n<pre><code>add_filter('request', function($vars) {\n    if (isset($vars['movies'])) {\n        $vars['movies'] = true;\n    }\n    if (isset($vars['actors'])) {\n        $vars['actors'] = true;\n    }\n    return $vars;\n});<\/code><\/pre>\n<p>Si intenta usar <code>get_query_vars('movies')<\/code>when en &quot;example.com\/actor\/brad-pitt\/movies\/&quot; obtendr\u00e1 el valor <code>true<\/code>(lo importante es que ya se ha configurado).<\/p>\n<h3>Cargando plantilla<\/h3>\n<p>El siguiente paso es decidir qu\u00e9 deber\u00eda suceder en estos dos puntos finales; o en otras palabras, qu\u00e9 plantillas desea cargar. Esta parte depende de usted, puede conectarse, <code>template_redirect<\/code>pero en realidad solo se recomienda si desea realizar una redirecci\u00f3n real. Recomiendo conectarse al <code>template_include<\/code>filtro y simplemente decirle a WordPress qu\u00e9 plantillas usar cuando estemos en nuestros puntos finales personalizados. Supongamos que el tema tiene las plantillas de PHP <code>single-actor-movies.php<\/code>para \u00abexample.com\/actor\/\/movies\/ y <code>single-movie-actors.php<\/code>para \u00abexample.com\/movie\/\/actors\/\u00bb.<\/p>\n<pre><code>add_filter('template_include', function($template) {\n    if (is_singular() &amp;&amp; get_query_var('movies')) {\n        $post = get_queried_object();\n        return locate_template(['single-actor-movies.php']);\n    }\n    if (is_singular() &amp;&amp; get_query_var('actors')) {\n        $post = get_queried_object();\n        return locate_template(['single-movie-actors.php']);\n    }\n    return $template;\n});<\/code><\/pre>\n<p>Con este filtro en su lugar, WordPress deber\u00eda cargar las plantillas proporcionadas para nuestros puntos finales personalizados, y dentro de esas plantillas, el <code>$post<\/code>objeto global ser\u00eda el objeto de publicaci\u00f3n \u00fanico relacionado antes del punto final, por ejemplo, el objeto de publicaci\u00f3n de actor \u00fanico cuando estamos en la plantilla para mostrar todo. pel\u00edculas en las que ha aparecido el actor. Esto nos facilita la consulta de la informaci\u00f3n que queremos mostrar.<\/p>\n<h2>Obtener la URL de su punto final<\/h2>\n<p>Tener nuestros puntos finales y p\u00e1ginas personalizados est\u00e1 bien y es excelente, pero en alg\u00fan lugar necesitar\u00eda vincularlos. Por ejemplo, en la plantilla de una sola pel\u00edcula, le gustar\u00eda un enlace &quot;Ver todos los actores&quot; que vaya a su punto final.<\/p>\n<p>Desafortunadamente, no existe una funci\u00f3n de WordPress tan simple para esto. Deber\u00e1 crear la URL usted mismo. Recomiendo usar <code>[get_site_url](https:\/\/developer.wordpress.org\/reference\/functions\/get_site_url\/)()<\/code>para puntos finales de todo el sitio, o en el caso anterior, se referir\u00eda a una publicaci\u00f3n espec\u00edfica con <code>[get_the_permalink](https:\/\/developer.wordpress.org\/reference\/functions\/get_the_permalink\/)()<\/code>(ya sea dentro del ciclo o proporcionando una ID de publicaci\u00f3n) y agregar\u00eda el punto final despu\u00e9s, as\u00ed:<\/p>\n<pre><code>echo get_the_permalink(). '\/actors';<\/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>Este tutorial le muestra c\u00f3mo ampliar su tipo de publicaci\u00f3n personalizada con una plantilla personalizada que mantiene su propia estructura de URL, utilizando la API de reescritura de WordPress.<\/p>\n","protected":false},"author":1,"featured_media":152349,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,892,716,716,831,1110,831,840,840,861,861],"tags":[1172],"class_list":["post-233694","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-n-a","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233694","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=233694"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233694\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/152349"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}