【问题标题】:Implementing simple dynamic routes in Wordpress在 Wordpress 中实现简单的动态路由
【发布时间】:2016-08-16 17:57:54
【问题描述】:

假设我有一个干净的 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 文件的情况下发布。

感谢您的阅读。

【问题讨论】:

    标签: php wordpress .htaccess iframe url-routing


    【解决方案1】:

    您可以像这样使用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 中加载相应的页面。

    【讨论】:

    • 这不起作用,但你让我朝着正确的方向前进。我会用我找到的解决方案更新我原来的问题。谢谢。
    • 我很确定您使用了我的答案。我永远无法创建您的确切答案,因为我没有您想要创建的所有 URL。我想我至少应该为我的答案投票。
    • 我的最终答案有一些非常显着的差异,当我在我指定的上下文中尝试时,你的代码对我不起作用。如果像我这样的人来到这个页面寻找解决方案,你的简短回复本身是不够的。我相信你让我朝着正确的方向前进。但无论如何,有一点,谁在乎呢。
    【解决方案2】:

    感谢 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。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2020-04-24
      • 2015-10-17
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多