从多个URL(通配符)访问同一页面

时间:2015-12-28 作者:Ionică Bizău

我想为多个URL提供一个特定的Wordpress页面。基本上,我希望以特定格式将所有URL指向已知页面:

/some-prefix-* => /target-page
和访问/some-prefix-and-here-something 它应该加载/target-page.

如何做到这一点?

注意:我不想重定向用户,但希望能够将现有页面服务于多个URL。

这个.htaccess 如下所示:

# BEGIN s2Member GZIP exclusions
RewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L]
<IfModule rewrite_module>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{QUERY_STRING} (^|\\?|&)s2member_file_download\\=.+ [OR]
    RewriteCond %{QUERY_STRING} (^|\\?|&)no-gzip\\=1
    RewriteRule .* - [E=no-gzip:1]
</IfModule>
# END s2Member GZIP exclusions

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

DirectoryIndex index.php index.html
我想通过添加RewriteEngine On RewriteRule ^prefix-*$ some/path/to/directory-$1 [NC,L] 将提供/prefix-* 从…起some/path/to/directory-$1. 例如:访问时example.com/prefix-foo 应与相同example.com/some/path/to/directory-foo (决定example.com/some/path/to/directory-foo/index.html).

此外,如果已经有一个名为的Wordpress页面prefix-bar, /prefix-bar 不应加载example.com/some/path/to/directory-bar/index.html.

3 个回复
最合适的回答,由SO网友:Rahil Wazir 整理而成

您可以使用template_include, 但在挂接到此筛选器之前,必须执行以下步骤:

创建页面模板。e、 g:page-target.php

<?php
/**
 * Template Name: Page Target
 */
...
手动查询target-page 在…上page-target.php 模板,因为全局$post 将引用您的some-prefix-*

  • (可选):编辑和应用页面模板Page Target 到您的/target-page 从页面属性中,将以下内容添加到functions.php 文件

    add_filter(\'template_include\', function($template) {
        global $post;
    
        $prefix = \'some-prefix-\'; // Your prefix
        $prefixExist = strpos($post->post_name, $prefix) !== false;
    
        if ($prefixExist) {
            return locate_template(\'page-target.php\'); //Your template
        }
    
        return $template;
    });
    
    上述过滤器将用替代模板page-target.php 如果满足条件,否则默认

    编辑:

    我想我已经找到了一个更好的方法来解决这个问题add_rewrite_rule

    function custom_rewrite_basic() {
      $page_id = 123; //Your serve page id
      add_rewrite_rule(\'^some-prefix-.*\', \'index.php?page_id=\' . $page_id, \'top\');
    }
    add_action(\'init\', \'custom_rewrite_basic\');
    
    IMPORTANT: 修改规则后,不要忘记刷新和重新生成重写规则数据库。从WordPress管理屏幕中,选择设置->永久链接,只需单击保存更改而不做任何更改。

  • SO网友:birgire

    Note 搜索引擎可能不喜欢指向同一内容的多条路径!

    在此,我假设您想要,例如:

    example.tld/some/path/to/painting-orange
    example.tld/painting-blue
    example.tld/painting-red
    example.tld/painting-yellow
    
    要表现得像此页面一样:

    example.tld/paintings
    
    但对于以下路径,情况并非如此:

    example.tld/painting-white/painting-brown/large
    example.tld/painting-brown/small
    
    这里的规则是匹配basename( $path ).

    这里有一个小黑客request 筛选器,以检查当前页面名称的前缀是否正确:

    <?php
    /** 
     * Plugin Name: Wildcard Pages
     */
    add_filter( \'request\', function( $qv )
    {
        // Edit to your needs
        $prefix = \'painting-\';
        $target = \'paintings\';
    
        // Check if the current page name is prefixed
        if(    isset( $qv[\'pagename\'] )
            && $prefix === substr( basename( $qv[\'pagename\'] ), 0, strlen( $prefix ) ) 
        )
            $qv[\'pagename\'] = $target;
    
        return $qv;
    } );
    
    根据您的需要进行修改。然后创建插件文件/wp-content/plugins/wpse-wildcard-pages/wpse-wildcard-pages.php 文件并从后端激活插件。

    我们还可以添加一张支票get_page_by_path() 在目标页面上,只是为了确保它存在。我们可能还想将此限制为某些帖子类型。

    SO网友:luukvhoudt

    当当前帖子的slug以前缀开头时,创建一个到init和wp\\u重定向的钩子。

    function wp_init() {
    
        global $post;
        $slug = $post->post_name;
        $prefix = \'foobar\';
        if (substr($slug, 0 strlen($prefix))==$prefix) {
            wp_redirect(123); // your page id
        }
    
    }
    add_action(\'init\', \'wp_init\');
    

    相关推荐

    Pages>max_num_ages不会抛出404

    我在WP管理中创建了一个名为Blog的新页面,并为其创建了自定义页面模板。在模板中,我有一个简单的分页自定义查询。$query = new WP_Query(array( \'post_type\' => \'post\', \'posts_per_page\' => 1, \'paged\' => $paged )); 看起来一切正常,除了我手动键入比url的“/页/”部分后可用的页码更大的页码。页面不会抛出404错误,但会在没有自定义循环的情况下将页面呈现为正常。