✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Tutorial: Puntos finales de URL personalizados con la API de reescritura de WordPress

39

¿Alguna vez deseó poder extender publicaciones individuales, páginas o sus tipos de publicaciones personalizadas con una plantilla personalizada que mantiene su propia estructura de URL? Con la API de reescritura de WordPress, esto es completamente posible y nada difícil.

En este tutorial, veremos cómo agregar una vista de tipo de publicación personalizada única con otro slug que cargue una plantilla diferente. En otras palabras, si una sola publicación de tipo de publicación personalizada tiene la URL "ejemplo.com/destino/venecia/", puede agregar reglas de URL para páginas separadas con información relacionada con cada destino, por ejemplo, "ejemplo.com/destino/venecia". /actividades/" y “ejemplo.com/destino/venecia/atracciones/”.

Si está interesado en cómo agregar puntos finales a la página "Mi cuenta" de WooCommerce, ¡tengo otra publicación sobre eso!

La API de reescritura de WordPress tiene muchas funciones útiles para escribir sus propias reglas de URL personalizadas. Es posible que haya visto la función más conocida y amplia; add_rewrite_rule(). Sin embargo, este tutorial usa el similar add_rewrite_endpoint(), que es muy útil para agregar "puntos finales" de URL (básicamente agregar slugs de URL personalizados después de algo que ya existe, por ejemplo, después del final de una sola publicación o categoría única). Puede lograr el mismo resultado usando add_rewrite_rule()pero el proceso de agregar puntos finales es más simple.

que haremos

Esta guía asumirá que hemos creado dos tipos de publicaciones personalizadas; ‘película’ y ‘actor’. La regla de enlace permanente para una sola película es "example.com/movie/fight-club/" y para un solo actor "example.com/actor/brad-pitt/". Queremos una página separada para cada película que muestre a todos los actores en esa película, ubicada en "example.com/movie/fight-club/actors/" y, de manera similar, una página separada para cada actor que muestre todas las películas en las que ha estado. ubicado en "example.com/actor/brad-pitt/movies/".

No entraré en detalles sobre cómo agregar estos dos tipos de publicaciones personalizadas; Si necesita ayuda para hacer esta parte, le recomiendo leer mi publicación sobre cómo agregar tipos de publicaciones personalizadas.

escribiendo el código

El primer paso es llamar add_rewrite_endpoint()a una función vinculada a init(generalmente todas las funciones en Rewrite API están vinculadas a init). para registrar nuestros dos puntos finales deseados; ‘películas’ y ‘actores’. La función toma dos argumentos; primero, el punto final que desea (p. ej., ‘películas’) y, en segundo lugar, una constante para el lugar donde debe "vivir" el punto final (p. ej., páginas, autor, archivos, etc.). Mire la documentación para saber qué constantes puede usar; en cuanto a este ejemplo el general EP_PERMALINKesta bien:

add_action('init', function() { add_rewrite_endpoint('movies', EP_PERMALINK); add_rewrite_endpoint('actors', EP_PERMALINK); });

NB: si su tipo de publicación personalizada es jerárquica, lo que significa que tiene 'hierarchical' => trueen su register_post_type(), debe cambiar la constante EP_PERMALINKcon EP_PAGES.

Después de guardar este código, debe ir a Configuración> Enlaces permanentes y simplemente hacer clic en el botón Guardar para actualizar los enlaces permanentes. ¡Cada vez que agrega o modifica una regla de reescritura, debe actualizar sus enlaces permanentes para que funcione!

Manejo de las variables de consulta

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 "query vars"; básicamente el objeto de consulta global de WordPress. Hacemos esto llamando get_query_var()con la consulta como argumento (‘películas’ o ‘actores’).

Si ha trabajado con add_rewrite_rule()o get_query_var()antes, es posible que ya sepa que WordPress no agrega automáticamente variables de consulta personalizadas. Por lo general, tendría que filtrar query_varsy agregar sus variables personalizadas para que WordPress las complete. Sin embargo add_rewrite_endpoint()automáticamente hace esto por nosotros.

Sin embargo, si intentamos llamar get_query_var('movies')nunca parecerá 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és del punto final es el valor. Por ejemplo, "example.com/actor/brad-pitt/movies/some-value/" funcionaría, porque en esta página get_query_var('movies')devolvería el valor ‘some-value’. Pero esto no es lo que queremos, queremos que funcione solo con el punto final único. Para resolver esto, debemos conectarnos al requestfiltro de WordPress e informar a WordPress que si estamos en nuestros puntos finales, las variables de consulta deben agregar el punto final con algún valor (simplemente lo configuramos en true).

add_filter('request', function($vars) { if (isset($vars['movies'])) { $vars['movies'] = true; } if (isset($vars['actors'])) { $vars['actors'] = true; } return $vars; });

Si intenta usar get_query_vars('movies')when en "example.com/actor/brad-pitt/movies/" obtendrá el valor true(lo importante es que ya se ha configurado).

Cargando plantilla

El siguiente paso es decidir qué debería suceder en estos dos puntos finales; o en otras palabras, qué plantillas desea cargar. Esta parte depende de usted, puede conectarse, template_redirectpero en realidad solo se recomienda si desea realizar una redirección real. Recomiendo conectarse al template_includefiltro y simplemente decirle a WordPress qué plantillas usar cuando estemos en nuestros puntos finales personalizados. Supongamos que el tema tiene las plantillas de PHP single-actor-movies.phppara “example.com/actor//movies/ y single-movie-actors.phppara “example.com/movie//actors/”.

add_filter('template_include', function($template) { if (is_singular() && get_query_var('movies')) { $post = get_queried_object(); return locate_template(['single-actor-movies.php']); } if (is_singular() && get_query_var('actors')) { $post = get_queried_object(); return locate_template(['single-movie-actors.php']); } return $template; });

Con este filtro en su lugar, WordPress debería cargar las plantillas proporcionadas para nuestros puntos finales personalizados, y dentro de esas plantillas, el $postobjeto global sería el objeto de publicación único relacionado antes del punto final, por ejemplo, el objeto de publicación de actor único cuando estamos en la plantilla para mostrar todo. películas en las que ha aparecido el actor. Esto nos facilita la consulta de la información que queremos mostrar.

Obtener la URL de su punto final

Tener nuestros puntos finales y páginas personalizados está bien y es excelente, pero en algún lugar necesitaría vincularlos. Por ejemplo, en la plantilla de una sola película, le gustaría un enlace "Ver todos los actores" que vaya a su punto final.

Desafortunadamente, no existe una función de WordPress tan simple para esto. Deberá crear la URL usted mismo. Recomiendo usar [get_site_url](https://developer.wordpress.org/reference/functions/get_site_url/)()para puntos finales de todo el sitio, o en el caso anterior, se referiría a una publicación específica con [get_the_permalink](https://developer.wordpress.org/reference/functions/get_the_permalink/)()(ya sea dentro del ciclo o proporcionando una ID de publicación) y agregaría el punto final después, así:

echo get_the_permalink(). '/actors';

Fuente de grabación: awhitepixel.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More