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