在页面和帖子的固定链接结构中使用作者作者显示名称

时间:2016-05-04 作者:bigmike7801

我需要添加作者姓名作为所有用户帖子和页面的子目录前缀。

例如:

example.com/johndoe/ //The author page for John Doe
example.com/johndoe/category/test-post/ //Test post by user John Doe
example.com/johndoe/test-page/ //Test page by user John Doe
如果我将permalink结构更改为:/%author%/%category%/%postname%/ 这可以很好地显示用户的帖子,但不能显示用户的页面。

但是我不确定我是否能在.htaccessfunctions.php 这样我就可以得到pages 以同样的方式工作。

我知道这可以通过Multisite实现,但是我尽量避免使用它,因为客户端不想使用它。

2 个回复
SO网友:Paul G.

从外观上看,有一个插件可以实现这一点,所以省得你自己动手吧。

插件是:https://wordpress.org/plugins/permalinks-customizer/

我安装它是为了测试它是否符合您的要求。下面是一个屏幕截图,显示了您的操作:

Permalinks Customizer

SO网友:laxandrea

用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;   
}
下一步是更改wprewrite 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;            
}
就这些。。嗯,老实说,这是主要部分,但还需要做一些其他工作,比如更改所有链接到页面的附件/评论/提要/嵌入内容的重写规则,可能是我没有足够时间发现的其他内容。

这是我的第一篇帖子;我希望它能帮助别人,就像其他帮助过我的人一样。

相关推荐

Remove Author Links

我正在尝试删除作者页面以及Divi支持的wordpress网站上的作者页面链接。首先,我使用Yoast插件禁用了作者档案和页面。然后,我使用了一个简短的CSS片段来禁用鼠标指针。它工作正常,但应答器仍然存在。也就是说,搜索引擎机器人在请求文档时得到了301重定向。所以,我在Divi论坛上问了一些人,他们给了我以下片段<script> jQuery(function($){ $(".author a").attr("href&