Implementando rutas dinámicas simples en WordPress

4 minutos de lectura

avatar de usuario de gillesv
gillesv

Supongamos que tengo una instalación limpia de wordpress, con un tema personalizado básico.

En ese tema, tengo una plantilla de página personalizada que es solo un iframe, que apunta a una aplicación web en un dominio diferente.

Así que supongamos que se puede acceder a mi instalación de wordpress en http://ejemplo.comy mi página con la plantilla de iframe se encuentra en http://ejemplo.com/miembros/.

Ahora quiero agregar rutas dinámicas, para que todas las solicitudes a http://ejemplo.com/miembros/iniciar sesióno http://ejemplo.com/miembros/evento/1 (por ejemplo) todos van a http://ejemplo.com/miembros/ pero pase la segunda parte de la ruta (‘/login’, o ‘/event/1’) al iframe interior.

¿Cuál sería la mejor manera de lograr esto, sin tener que piratear las partes internas de WordPress?

Encontré este complemento: https://wordpress.org/plugins/wp-on-routes/ pero para mi consternación, descubrí que cuando intenté usarlo, sobrescribía por completo el enrutamiento incorporado de WordPress, lo que significaba que tendría que volver a agregar manualmente todas y cada una de las URL (según tengo entendido, no soy tan hábil en PHP ), lo cual es imposible ya que mi cliente aún necesita poder publicar sin editar manualmente los archivos php.

Gracias por leer.

Avatar de usuario de Fencer04
esgrimista04

Puede agregar enrutamiento usando el add_rewrite_rule gancho así:

function custom_rewrite_rule() {
  add_rewrite_rule('members/([^/]+)/([^/]+)/?$',
    'index.php?memberspage=$matches[1]&event_id=$matches[2]',
    'top');
}

add_action('init', 'custom_rewrite_rule', 10, 0);

Es posible que deba crear varios según las URL que reescriba. Luego puede usar los parámetros de URL en su plantilla para cargar la página apropiada en su iframe.

  • Esto no funcionó, pero me pusiste en la dirección correcta. Actualizaré mi pregunta original con la solución que encontré. Gracias.

    – gillesv

    18 de agosto de 2016 a las 9:32

  • Estoy bastante seguro de que usaste mi respuesta. Nunca podría haber creado su respuesta exacta ya que no tenía todas las URL que quería crear. Creo que al menos debería obtener un voto por mi respuesta.

    – Esgrimista04

    18 de agosto de 2016 a las 21:12

  • Hay algunas diferencias bastante significativas en mi respuesta final, y su código simplemente no funcionó para mí cuando lo probé en el contexto que especifiqué. Si alguien como yo viniera a esta página en busca de una solución, su breve respuesta por sí sola no habría sido suficiente. Y te di crédito por ponerme en la dirección correcta. Pero ten un punto de todos modos, a quién le importa.

    – gillesv

    20 de agosto de 2016 a las 8:23

Logré encontrar una solución a mi problema, gracias a la sugerencia de Fencer04. Encontré esta página: https://developer.wordpress.org/reference/functions/add_rewrite_rule/ donde encontré un ejemplo que estaba lo suficientemente cerca de mi problema para trabajar.

Entonces en functions.php:

function custom_rewrite_rule(){
    $page_id = 318; // replace this ID with the page with the iFrame template 

    $page_data = get_post($page_id);

    if(!is_object($page_data)){
        return; // all other pages don't have to support custom deeplinks
    }

    // catches deeplinks 1 level deep, i.e.: /members/profile
    add_rewrite_rule(
        $page_data->post_name . '/([^/]+)/?$',
        'index.php?pagename=" . $page_data->post_name . "&memberspage=$matches[1]',
        'top'
    );

    // catches deeplinks 2 levels deep, i.e.: /members/profile/edit
    add_rewrite_rule(
        $page_data->post_name . '/([^/]+)/([^/]+)/?$',
        'index.php?pagename=" . $page_data->post_name . "&memberspage=$matches[1]&members_param=$matches[2]',
        'top'
    );

    // catches 3 levels deep, i.e. /members/profile/edit/confirm
    add_rewrite_rule(
        $page_data->post_name . '/([^/]+)/([^/]+)/([^/]+)/?$',
        'index.php?pagename=" . $page_data->post_name . "&memberspage=$matches[1]&members_param=$matches[2]&members_param2=$matches[3]',
        'top'
    );

}

add_action('init', custom_rewrite_rule);

A continuación, agregué filtros para los nuevos query_vars:

add_filter('query_vars', function($vars) {
    $vars[] = "memberspage";
    $vars[] = "members_param";
    $vars[] = "members_param2";
    return $vars;
});

Y luego en mi template-iframe.php, puedo acceder a estos parámetros así:

<?php 

    // get query strings 
    global $wp_query;

    $page = $wp_query->query_vars['memberspage'];
    $params = $wp_query->query_vars['members_param'];
    $params2 = $wp_query->query_vars['members_param2'];

    $membersBaseURL = 'http://members.domain.com/';
    $iframeURL = $membersBaseURL;

    if(isset($page)){
        $iframeURL = $iframeURL . $page . "https://stackoverflow.com/";
    }

    if(isset($params)){
        $iframeURL = $iframeURL . $params . "https://stackoverflow.com/";
    }

    if(isset($params2)){
        $iframeURL = $iframeURL . $params2 . "https://stackoverflow.com/";
    }
?>

<iframe id="iframeLeden" src="https://stackoverflow.com/questions/38981506/<?php echo($iframeURL) ?>" frameborder="0"></iframe>

Así que ahora si voy a http://www.dominio.com/miembros/iniciar sesiónme mostrará la página de WP estática correcta, dentro de un iframe que muestra la página http://miembros.dominio.com/login/ .

¿Ha sido útil esta solución?