【问题标题】:Wordpress URL Routing, Multiple permalinks with different templatesWordpress URL 路由,具有不同模板的多个永久链接
【发布时间】:2015-04-04 09:50:35
【问题描述】:

此问题基于Wordpress Development 中的一个未得到回答的问题,该问题尚未得到可靠的答案。

我有一个列出酒店的 wordpress 网站。单个酒店的网址如下所示:

/hotels/the-marriot-hotel

我还有一个 Locations 的自定义分类,它允许我浏览不同位置的酒店,效果很好,网址如下:

/Locations/Liverpool

对于像 /hotels/* 这样的 URL,我想使用一个自定义模板,我已经完成并且工作正常。

问题

我还希望能够深入研究 Locations 分类,创建一个面包屑类型的 URL,并为酒店页面使用不同的模板。

例如,如果用户正在浏览 /Locations/Liverpool 并点击万豪酒店,我希望它点击到 /Locations/Liverpool/the-marriot-hotel 而不是 /hotels/the-marriot-hotel 并且还使用稍微不同的模板,该模板也可以加载不同的侧边栏并推荐该地区的其他酒店,具体到 URL 中的位置 slug

所以基本上我想要两条通往单个帖子的路线,并根据使用的路线使用不同的模板。

我将如何实现这一点?

我尝试了什么?

我尝试添加一个新页面并使用重写规则将其指向位置酒店页面。

我尝试在 /Locations/{location-slug} 网址的末尾添加一个 slug 并在页面模板中阅读它并加载酒店帖子而不是列表它似乎不起作用但也无论如何感觉就像一个可怕的黑客攻击

我的一个想法是向酒店/{slug} 页面添加重写,并使用代码检测使用的 URL 并动态切换模板,但我不确定这是最好的方法

【问题讨论】:

    标签: php wordpress url permalinks


    【解决方案1】:

    我已经设法使用上面提到的第二种方法来完成这项工作(向位置登录页面添加重写并检查 query_var)。

    我将在下面发布我使用的代码,但尽管它有效并且看起来效果很好,但感觉并不是最好的方法。如果有人知道这样做的更好方法,请发布答案。

    我用这个online post作为参考。

    注意:列表页面在侧面下方的侧栏中显示分类中的酒店列表,并在主要内容区域显示当前选择或随机选择的酒店。这将解释我如何使用下面的循环。

    function prefix_locations_rewrite_rule() {
        add_rewrite_rule( 'Locations/([^/]+)/([^/]+)', 'index.php?locations=$matches[1]&hotel=$matches[2]', 'top' );
    }
    
    function prefix_register_query_var( $vars ) {
        $vars[] = 'hotel';
    
        return $vars;
    }
    
    function prefix_url_rewrite_templates() {
    
        if ( get_query_var( 'hotel' ) && is_singular( 'hotel' ) ) {
            add_filter( 'template_include', function() {
                return get_template_directory() . '/taxonomy-locations.php';
            });
        }
    }
    
    add_action( 'template_redirect', 'prefix_url_rewrite_templates' );
    add_filter( 'query_vars', 'prefix_register_query_var' );
    add_action( 'init', 'prefix_locations_rewrite_rule' );
    

    在我的酒店登录页面模板文件中:

    $hotelSlug = get_query_var( 'hotel', false);
    
    if ( have_posts() ) {
        while (have_posts()) : the_post();
    
            if ($post->post_name == $hotelSlug) {
                break;
            }
    
        endwhile;
    }
    

    这段代码将遍历帖子,如果酒店 slug 与查询变量匹配,它将在那里中断,以便当前帖子是我们想要的。

    我们可以在这里只使用一个查询,但由于我已经在分类法中有一个帖子列表,所以我想我只需对其进行迭代。在此下方,我检查是否已选择特定酒店,否则我会从列表中随机显示一家。

    我仍在为这段代码添加额外的逻辑和错误处理,我希望它可以帮助有类似问题的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多