在Wordpress

时间:2016-08-16 17:57:54

标签: php wordpress .htaccess iframe url-routing

假设我有一个干净的wordpress安装,具有基本的自定义主题。

在该主题中,我有一个自定义页面模板,它只是一个iframe,指向不同域上的webapp。

假设我的wordpress安装可以通过http://example.com访问,而我的iframe模板页面位于http://example.com/members/

我现在想要添加动态路由,以便所有http://example.com/members/loginhttp://example.com/members/event/1的请求都转到http://example.com/members/,但会传递路径的第二部分(' / login',或'/ event / 1')到iframe里面。

实现这一目标的最佳方法是什么,而不必侵入Wordpress的内部?

我找到了这个插件:https://wordpress.org/plugins/wp-on-routes/但令我沮丧的是,我发现当我尝试使用它时,它会完全覆盖Wordpress的内置路由,这意味着我必须手动重新添加每个URL(据我所知,我不是用PHP完成的,这是不行,因为我的客户端仍然需要能够发布而无需手动编辑php文件。

感谢您的阅读。

2 个答案:

答案 0 :(得分:2)

您可以使用add_rerwite_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);

您可能需要创建多个,具体取决于您重写的网址。然后,您可以使用模板中的网址参数在iframe中加载相应的页面。

答案 1 :(得分:0)

由于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;
});

然后在我的template-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,它会向我显示正确的静态WP页面,其中包含显示页面http://members.domain.com/login/的iframe。