用Wordpress 5.0.4测试
要解决的第一个问题是共享相同slug的页面的post\\u name值(例如关于我的)。
我找到的更简单的解决方案是添加作者nicename(注意:在我的解决方案中,它不应该包含连字符!)作为slug的第一部分:
关于我john的page post\\u name:john关于我关于我mary的page post\\u name:mary关于我
这可以通过使用wp_insert_post_data 过滤器挂钩(请参见wp includes/post中定义的函数)。php)创建页面时:
// about-me => <author_name>-about-me
add_filter( \'wp_insert_post_data\', \'custom_wp_insert_post_data\', 99, 2);
function custom_wp_insert_post_data($data, $postarr)
{
if(($data["post_type"] == "page") && ($data["post_status"] != "auto-draft"))
{
$author_name = get_the_author_meta( \'user_nicename\', $data["post_author"] );
// insert
if($postarr[\'hidden_post_status\'] == "draft") {
$data["post_name"] = $author_name . "-" . $data["post_name"];
}
// update
else {
list($author, $slug) = explode("-", basename($data["post_name"]), 2 );
// wrong permalink -> prepend the author
if($author != $author_name) {
$data["post_name"] = $author_name . "-" . $data["post_name"];
}
}
}
return $data;
}
下一步是更改wp
rewrite rules 为了反映我们的愿望(您还需要更新永久链接设置):
add_filter(\'page_rewrite_rules\', \'custom_page_rewrite_rules\');
function custom_page_rewrite_rules($page_rewrite)
{
// remove : john/about-me => index.php?pagename=john/about-me
unset($page_rewrite["(.?.+?)(?:/([0-9]+))?/?$"]);
// add: john/about-me => index.php?pagename=john-about-me
$page_rewrite["(.?.+?)/(.+?)/?$"] = "index.php?pagename=\\$matches[1]-\\$matches[2]";
return $page_rewrite;
}
add_filter(\'post_rewrite_rules\', \'custom_post_rewrite_rules\');
// posts have the /%author%/%category%/%postname% permalink structure
function custom_post_rewrite_rules($post_rewrite)
{
// remove: john/about-me => index.php?category_name=about-me&author_name=john
unset($post_rewrite["([^/]+)/(.+?)/?$"]);
return $post_rewrite;
}
最后一步是更改代码要求页面永久对齐时返回的值(例如,在菜单中)<要做到这一点,我们必须使用
page_link 过滤器挂钩(位于wp includes/link模板中定义的get\\u page\\u link()函数中)。php)。。
// http://www.example.com/john-about-me => http://www.example.com/john/about-me
add_filter(\'page_link\', \'custom_page_link\', 99, 3);
function custom_page_link( $link, $ID, $sample )
{
list($author, $slug) = explode("-", basename($link), 2 );
return ( site_url() . "/" . $author . "/" . $slug );
}
。。但如果不将
use_verbose_page_rules 的属性
$wp_rewrite global 例子这将停止parse\\u request()以检查是否存在“错误”匹配的页面路径exits:
add_action(\'init\', \'disable_verbose_page_rule\');
function disable_verbose_page_rule()
{
global $wp_rewrite;
$wp_rewrite->use_verbose_page_rules = false;
}
就这些。。嗯,老实说,这是主要部分,但还需要做一些其他工作,比如更改所有链接到页面的附件/评论/提要/嵌入内容的重写规则,可能是我没有足够时间发现的其他内容。
这是我的第一篇帖子;我希望它能帮助别人,就像其他帮助过我的人一样。