¿Cómo funciona el enrutamiento en WordPress?
¿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.

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.

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.

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

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.

¿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)

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

@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.

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.

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)

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.

@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. :)

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.

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.

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

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.

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.

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?

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

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.
