¿Cómo funciona el enrutamiento en WordPress?

12 abr 2014, 10:46:59
Vistas: 55.2K
Votos: 24

¿Cómo funciona el enrutamiento central de WordPress? Me está costando entenderlo... En MVC, tu URL se ve como micontrolador/miaccion que se mapea a MiControlador->miaccion()

En Drupal, es index.php?q=mirutapersonalizada/hola que puede ser mapeada a cualquier función que desees que devuelva un contenido que es "tematizado" en el diseño de tu tema.

Pero en WordPress, no tengo idea de cómo se hacen las cosas... es ?p=1 luego ?product=1 ... He buscado documentación sobre el flujo de enrutamiento pero no puedo encontrar ninguna (Google solo devuelve artículos sobre rutas personalizadas)... quiero entender primero los fundamentos del enrutamiento del core.

7
Comentarios

investigando en el código, veo que en cada solicitud llama a query_posts? ¿por qué diablos necesita consultar publicaciones cada vez? ¿no hay casos en los que realmente no quieras mostrar publicaciones?

yeahman yeahman
12 abr 2014 10:49:17

Los contenidos se guardan como publicaciones en WP. Entonces, cuando necesitas mostrar contenidos, debes consultarlos

Sisir Sisir
12 abr 2014 11:36:55

¿Puedo sugerir que leas sobre "el loop", que es el concepto que necesitas entender para saber cómo funciona WordPress? Esencialmente, "el loop" muestra un array de publicaciones que es el resultado de query_posts. Para solicitudes de URL que no son de administrador, WP está diseñado para mostrar solo publicaciones y se requiere programación personalizada para mostrar algo que no sea una publicación. Las solicitudes de URL de administrador son diferentes y estas no usan "el loop", mostrando cosas que no son publicaciones.

User User
12 abr 2014 11:52:01

ok pero este enfoque es un poco raro y no muy flexible para ser honesto

yeahman yeahman
12 abr 2014 13:07:12

digamos que quiero mostrar un formulario de contacto... ¿necesito poner mi html en un tipo de contenido de página? Todavía estoy tratando de encontrar dónde poner la lógica para el envío del formulario... (¿en el page.php del tema? enfoque muy feo)

yeahman yeahman
12 abr 2014 13:08:50

Probablemente no harías que un formulario de contacto almacene nada del formulario en la base de datos, lo codificarías como un plugin y tendrías la lógica para el envío del formulario en el plugin. Para mostrar el código especial del formulario en una Página o Entrada, defines un shortcode.

Otto Otto
12 abr 2014 13:09:59

Alternativamente, si estás creando un tema para ti mismo y no quieres complicarte con la creación de un plugin portable, puedes hacer una "Plantilla de Página" en tu tema, con tu código incluido, luego crear una nueva Página y asignarle esa plantilla especial. Las plantillas son PHP, pueden hacer lo que quieran.

Otto Otto
12 abr 2014 13:14:41
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 1
19
36

En WordPress, las URL no se asignan a rutas. Se asignan a consultas de la base de datos.

Cuando usas WordPress en el modo de enlaces permanentes "por defecto", tienes un conjunto de variables en la consulta principal de la URL, como ?p=1 o ?page=234 y así sucesivamente. También está ?s=busqueda y muchos otros.

Si usas los enlaces permanentes "bonitos", entonces se crea un gran conjunto de reglas llamadas "reglas de reescritura" que mapean directamente varios patrones de URL a este mismo conjunto de parámetros de URL. Así que una URL como /2014/04/12/ejemplo se mapearía a ?year=2014&month=04&day=12&postname=ejemplo o similar. Entonces, lo siguiente aplica también a estos, después de que se realiza este mapeo.

Estas variables esencialmente controlan la instancia principal de la clase WP_Query. La clase WP_Query contiene toda la información que construye la consulta a la base de datos para obtener los "posts" de la misma. Los diversos parámetros que se le pasan controlan qué tipo de consulta construye y qué datos obtiene.

Verás, todo lo que puede ser mostrado por WordPress es esencialmente un "post". Un blog es una serie de posts en orden inverso basado en el tiempo. Una "página" es un post estático con un nombre definido. Un "tipo de post personalizado" es exactamente lo que parece, un "post" con un tipo personalizado que defines. Todas las consultas principales para mostrar algo en WordPress obtienen algún subconjunto de posts de la tabla wp_posts.

WP_Query es lo que hace eso. Y los parámetros de la URL se envían directamente a esa consulta principal y se usan allí.

El tema luego determina qué plantilla usar basándose en lo que devuelve la consulta. Si solicitaste /categoria/ejemplo, entonces eso se convierte en ?category_name=ejemplo, lo que significa que el array principal $wp_query->query_vars obtendrá esa información, y WP_Query extraerá los últimos X posts para la categoría "ejemplo", y establecerá su bandera is_category en verdadero.

El cargador de plantillas se ejecutará después de esto, verá que is_category() devuelve verdadero, y decidirá elegir la plantilla de categoría, por lo que buscará category-ejemplo.php y retrocederá a category.php y así sucesivamente, según la Jerarquía de Plantillas.

Entonces, la pregunta si quieres cambiar cómo funcionan las URL es simple: ¿Quieres cambiar las URL o a qué están mapeadas? Porque las URL no están mapeadas a funciones, están mapeadas a parámetros que controlan la consulta. Si quieres que la URL ajuste esa consulta principal, entonces es un proceso ligeramente diferente a si quieres una URL especial para ejecutar algún otro código especial totalmente diferente.

Y para responder a tu pregunta específica en los comentarios: "¿no hay casos en los que en realidad no quieres mostrar posts?" No, no los hay. Todo es un post. Todo el contenido se almacena en posts. Si quieres almacenar contenido en otro lugar y que sea diferente, entonces puedes hacerlo, pero es más difícil porque, honestamente, generalmente no es necesario. Si tienes contenido especial, crea un tipo de post personalizado, almacena tu contenido como un post con ese tipo, mapea un patrón de URL a él. Fácil.

12 abr 2014 13:08:56
Comentarios

Entiendo que todo debe representarse en una publicación (a través de tipos de contenido personalizados, etc.) de manera muy similar a los tipos personalizados en Drupal 6... pero ¿afecta al rendimiento tener una única tabla de publicaciones para almacenar todo el contenido del sitio? Drupal 7 lo resolvió introduciendo el tipo de entidad para que no tengas que crear un tipo personalizado y almacenar todo en la tabla de nodos, sino en tu propia tabla de entidades que aún puede aprovechar el framework de Drupal. Espero que WordPress introduzca este enfoque en el futuro. Gracias por la explicación detallada.

yeahman yeahman
12 abr 2014 13:14:07

Supongo que si quiero mapear una URL a mi propia función/tema, ¿WP Router ayudaría?

yeahman yeahman
12 abr 2014 13:15:08

Agregar un sistema de enrutamiento completo generalmente no es necesario. Hay formas más simples. La base de WordPress es mostrar contenido generado por usuarios, que se almacena en la tabla de publicaciones. Si deseas mostrar contenido que no es generado por usuarios, generalmente lo haces en el tema o en un plugin. Hay cientos (miles) de ganchos de acción, filtros y otras formas para que el código sobrescriba varias partes del proceso mientras se genera la página. Y con cosas como shortcodes, insertar HTML personalizado en el contenido es relativamente fácil.

Otto Otto
12 abr 2014 13:19:21

¿cómo puedo agregar html/php personalizado en un tipo de publicación que creé? sin tener que modificar el single.php del tema o crear un single-micustompost.php (no es un enfoque muy portable)

yeahman yeahman
12 abr 2014 13:24:26

Shortcodes. http://codex.wordpress.org/Shortcode_API

Otto Otto
12 abr 2014 13:54:11

@yeahman: Más bien no estoy de acuerdo con algunos de tus juicios sobre wordpress - es un poco raro y no muy flexible, enfoque muy feo, no es un enfoque muy portable. Aunque la lógica integrada de wordpress no sería adecuada para todo tipo de sitios web, creo que es mucho más flexible, portable y elegante de lo que puedes apreciar trabajando con él por poco tiempo. Si ganas más experiencia con él creo que encontrarás que puedes hacer mucho más de lo que pareces pensar. Realmente necesitas entender acciones, filtros, shortcodes, widgets, ... antes de poder emitir un juicio justo.

User User
12 abr 2014 16:03:06

Veo en una de tus preguntas anteriores que estás usando el plugin Pods. Este es un buen ejemplo de la flexibilidad de WordPress. Pods no utiliza la lógica integrada de WordPress - consultar posts y mostrarlos usando el loop. Lo reemplaza con su propia lógica personalizada. Puede hacer esto porque las acciones de WordPress permiten modificar fácilmente el comportamiento predeterminado. Y aún así puedes usar todas las capacidades del vasto ecosistema construido alrededor de WordPress.

User User
12 abr 2014 16:31:21

Aún no he usado PODS... la razón por la que consideraba un framework como PODS es que, por defecto, WP no es tan bueno para desarrollo web. Entiendo que WP fue diseñado originalmente solo para blogs pero para la versión 3.0, pensaría que sería más accesible para desarrollo web. Drupal es un buen ejemplo de lo que hablo... comenzó como un CMS y evolucionó a un CMF (content management framework: probablemente el más potente que existe)

yeahman yeahman
12 abr 2014 16:42:24

Si tu sitio web requiere programación personalizada en la mayoría de sus páginas, probablemente WordPress no sea la mejor opción. Personalmente me gusta el enfoque de concrete5 pero encuentro WordPress más viable por su vasto ecosistema - probablemente tiene la mayor colección de plugins (claro que algunos son basura). Ciertamente, la lógica del "loop" muestra sus orígenes como blog pero WordPress ha evolucionado para ser mucho más capaz, aunque no es un framework genérico. Si tus requisitos no coinciden con la lógica del "loop", probablemente sería mejor usar otra cosa.

User User
12 abr 2014 17:36:13

@yeahman: Si crees que Drupal es mejor para un caso específico, entonces usa Drupal. Todo es software libre. Usa lo que mejor se adapte a tus necesidades. A WordPress no le va a doler ni un poco. Quiero decir, si estuvieras haciendo un wiki, tampoco recomendaría WordPress para eso. :)

Otto Otto
12 abr 2014 21:48:43

jaja en realidad estoy trabajando en un proyecto usando WordPress así que nada de Drupal para mí... jaja pero hay algunos plugins complejos construidos para WP como WooCommerce, BuddyPress que son populares y no solo tienen páginas de contenido/entradas... pero al revisar el código de BuddyPress, puedes ver que han hecho muchos hacks para lograr esto. Con suerte, el plugin WP Router resolverá mi problema con el enrutamiento predeterminado de WP.

yeahman yeahman
12 abr 2014 23:04:30

después de más de 1 año trabajando con WordPress ahora... todavía no estoy convencido... el framework no es elegante y bastante feo... Funciona como un blog simple pero si quieres desarrollar otros tipos de sitios web... es como hacer hacks en WordPress para que haga algo para lo que no fue diseñado.

yeahman yeahman
7 nov 2015 19:47:41

y lamentablemente también he experimentado hackeos en 3 sitios de WordPress ya... así que tampoco es muy seguro...

yeahman yeahman
7 nov 2015 19:48:53

Casi todos los hackeos son el resultado de tener un servidor inseguro o código de plugins/temas inseguro. El núcleo de WordPress es perfectamente seguro.

Otto Otto
7 nov 2015 21:31:33

probablemente sí. Pero decir que el núcleo de WordPress es perfectamente seguro es un poco exagerado... Los parches de seguridad y las actualizaciones existen por una razón.

yeahman yeahman
8 nov 2015 10:31:19

Hola @Otto y demás.

Ahora que existe la WP REST API, supongo que hay algún tipo de enrutador. ¿Podrías actualizar tu respuesta para, digamos, la versión 4.7?

MrMesees MrMesees
15 dic 2016 07:23:09

No. ¿Por qué asumirías que las cosas han cambiado? Todavía no existe tal cosa. Es simplemente un endpoint en la URL.

Otto Otto
17 dic 2016 09:38:18

He trabajado más con WordPress desde mi último comentario y tengo múltiples sitios que fueron hackeados; incluso sitios sin plugins de terceros adicionales. Necesité crear scripts para encontrar los archivos hackeados y limpiarlos, e instalar Wordfence Security para monitorearlos.

yeahman yeahman
4 feb 2017 09:47:06

Para aquellos que se pregunten dónde se establece la consulta, busquen wp(); en wp-blog-header.php

8ctopus 8ctopus
2 nov 2023 09:20:00
Mostrar los 14 comentarios restantes