问题描述
我想为多个网址提供特定的 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
) 。
另外,如果已经有名为 prefix-bar
的 Wordpress 页面,/prefix-bar
不应加载 example.com/some/path/to/directory-bar/index.html
。
最佳解决方案
您可以使用 template_include
,但在挂接到此过滤器之前,您必须执行以下步骤:
-
创建页面模板。例如:
page-target.php
<?php /** * Template Name: Page Target */ ...
-
在
page-target.php
模板上手动查询target-page
的内容,因为全局$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: Do not forget to flush and regenerate the rewrite rules database after modifying rules. From WordPress Administration Screens, Select Settings -> Permalinks and just click Save Changes without any changes.
次佳解决方案
请注意,搜索引擎可能不喜欢同一内容的多个路径!
在这里我假设你想要例如:
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()
的支票,以确保它存在。我们也可能会将其限制为某些帖子类型。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。