在 Wordpress 中实现简单的动态路由
Implementing simple dynamic routes in Wordpress
假设我有一个干净的 wordpress 安装,带有一个基本的自定义主题。
在那个主题中,我有一个自定义页面模板,它只是一个 iframe,指向不同域上的 webapp。
所以假设我的 wordpress 安装可以在 http://example.com, and my page with the iframe template is located at http://example.com/members/ 到达。
我现在想添加动态路由,让所有到http://example.com/members/login, or http://example.com/members/event/1 (for example) all go to http://example.com/members/的请求都传递路由的第二部分('/login',或'/event/1')到iframe里面.
在不侵入 Wordpress 内部的情况下,最好的方法是什么?
我找到了这个插件:https://wordpress.org/plugins/wp-on-routes/ 但令我沮丧的是,当我尝试使用它时,我发现它完全覆盖了 Wordpress 的内置路由,这意味着我必须手动重新添加每一个URL(据我所知,我在 PHP 方面没有那么成功),这是不行的,因为我的客户仍然需要能够 post 而无需手动编辑 [=29] =] 文件。
感谢阅读。
您可以像这样使用 add_rewrite_rule
挂钩添加路由:
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);
根据您重写的 URL,您可能需要创建多个。然后,您可以使用模板中的 URL 参数在 iframe 中加载适当的页面。
感谢 Fencer04 的建议,我设法找到了解决问题的方法。我找到了这个页面:https://developer.wordpress.org/reference/functions/add_rewrite_rule/ 在那里我找到了一个足够接近我的问题的例子。
所以在 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);
接下来我为新 query_vars 添加了过滤器:
add_filter('query_vars', function($vars) {
$vars[] = "memberspage";
$vars[] = "members_param";
$vars[] = "members_param2";
return $vars;
});
然后在我的模板中-iframe.php,我可以像这样访问这些参数:
<?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 . '/';
}
if(isset($params)){
$iframeURL = $iframeURL . $params . '/';
}
if(isset($params2)){
$iframeURL = $iframeURL . $params2 . '/';
}
?>
<iframe id="iframeLeden" src="<?php echo($iframeURL) ?>" frameborder="0"></iframe>
所以现在如果我去 http://www.domain.com/members/login, it'll show me the correct static WP page, with inside an iframe that shows the page http://members.domain.com/login/ .
假设我有一个干净的 wordpress 安装,带有一个基本的自定义主题。
在那个主题中,我有一个自定义页面模板,它只是一个 iframe,指向不同域上的 webapp。
所以假设我的 wordpress 安装可以在 http://example.com, and my page with the iframe template is located at http://example.com/members/ 到达。
我现在想添加动态路由,让所有到http://example.com/members/login, or http://example.com/members/event/1 (for example) all go to http://example.com/members/的请求都传递路由的第二部分('/login',或'/event/1')到iframe里面.
在不侵入 Wordpress 内部的情况下,最好的方法是什么?
我找到了这个插件:https://wordpress.org/plugins/wp-on-routes/ 但令我沮丧的是,当我尝试使用它时,我发现它完全覆盖了 Wordpress 的内置路由,这意味着我必须手动重新添加每一个URL(据我所知,我在 PHP 方面没有那么成功),这是不行的,因为我的客户仍然需要能够 post 而无需手动编辑 [=29] =] 文件。
感谢阅读。
您可以像这样使用 add_rewrite_rule
挂钩添加路由:
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);
根据您重写的 URL,您可能需要创建多个。然后,您可以使用模板中的 URL 参数在 iframe 中加载适当的页面。
感谢 Fencer04 的建议,我设法找到了解决问题的方法。我找到了这个页面:https://developer.wordpress.org/reference/functions/add_rewrite_rule/ 在那里我找到了一个足够接近我的问题的例子。
所以在 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);
接下来我为新 query_vars 添加了过滤器:
add_filter('query_vars', function($vars) {
$vars[] = "memberspage";
$vars[] = "members_param";
$vars[] = "members_param2";
return $vars;
});
然后在我的模板中-iframe.php,我可以像这样访问这些参数:
<?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 . '/';
}
if(isset($params)){
$iframeURL = $iframeURL . $params . '/';
}
if(isset($params2)){
$iframeURL = $iframeURL . $params2 . '/';
}
?>
<iframe id="iframeLeden" src="<?php echo($iframeURL) ?>" frameborder="0"></iframe>
所以现在如果我去 http://www.domain.com/members/login, it'll show me the correct static WP page, with inside an iframe that shows the page http://members.domain.com/login/ .