Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Wordpress中实现简单的动态路由_Php_Wordpress_.htaccess_Iframe_Url Routing - Fatal编程技术网

Php 在Wordpress中实现简单的动态路由

Php 在Wordpress中实现简单的动态路由,php,wordpress,.htaccess,iframe,url-routing,Php,Wordpress,.htaccess,Iframe,Url Routing,假设我有一个干净的wordpress安装,带有一个基本的自定义主题 在这个主题中,我有一个自定义页面模板,它只是一个iframe,指向不同域上的一个webapp 所以,假设我的wordpress安装可以在,我的带有iframe模板的页面位于 现在,我想添加动态路由,以便所有到的请求,或者(例如)所有请求都转到,但将路由的第二部分(“/login”或“/event/1”)传递到内部的iframe 不必侵入Wordpress的内部结构,实现这一点的最佳方式是什么 我发现了这个插件:但令我沮丧的是,当

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

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

所以,假设我的wordpress安装可以在,我的带有iframe模板的页面位于

现在,我想添加动态路由,以便所有到的请求,或者(例如)所有请求都转到,但将路由的第二部分(“/login”或“/event/1”)传递到内部的iframe

不必侵入Wordpress的内部结构,实现这一点的最佳方式是什么

我发现了这个插件:但令我沮丧的是,当我尝试使用它时,它完全覆盖了Wordpress的内置路由,这意味着我必须手动重新添加每个URL(据我所知,我在PHP方面没有那么熟练),这是不可能的,因为我的客户端仍然需要能够在不手动编辑php文件的情况下发布


感谢阅读。

您可以使用钩子添加路由,如下所示:

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。然后,您可以使用模板中的URL参数在iframe中加载相应的页面。

感谢Fencer04的建议,我设法找到了解决问题的方法。我找到了这个页面:在那里我找到了一个与我的问题非常接近的例子

因此,在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);
接下来,我为新的查询变量添加了过滤器:

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>


这没用,但你给了我正确的方向。我将用我找到的解决方案更新我的原始问题。谢谢。我很确定你用了我的答案。我不可能创建您的确切答案,因为我没有您想要创建的所有URL。我想我至少应该对我的答案进行投票。我的最终答案有一些非常显著的差异,当我在我指定的上下文中尝试时,你的代码对我不起作用。如果像我这样的人来到这一页寻找解决方案,你的简短回复本身就不够了。我认为你给了我正确的方向。但有一点无论如何,谁在乎。