解释 `get_author_posts_url()` 函数的源码,它如何根据作者 ID 生成文章列表页的链接。

各位观众老爷,晚上好! 今天咱们来聊聊 WordPress 里面一个挺有用的函数:get_author_posts_url()。 别看名字长,其实干的活儿挺实在,就是帮你生成某个作者的文章列表页面的 URL。 就像你去某个博客,想看看某个作者都写了些啥,点击作者名字或者头像,就会跳转到这个作者的所有文章页面。 这个函数就是帮你把这个链接搞定的。

1. 函数原型和基本用法

首先,我们来看看这个函数的原型:

<?php
get_author_posts_url( int $author_id, string $author_nicename = '' ) : string
?>
  • $author_id (必选): 作者的 ID。 这个 ID 是数据库里 wp_users 表的 ID 字段, 也就是每个作者在 WordPress 里的唯一身份证号码。
  • $author_nicename (可选): 作者的别名 (nicename)。 这个参数通常不用传,因为函数会自动获取。 但如果你想优化一下性能,或者明确指定别名,也可以手动传。 这个别名是 URL 里面显示作者名字的部分,比如 example.com/author/john-doe/ 里面的 john-doe
  • 返回值: 返回一个字符串,就是作者文章列表页面的 URL。 如果找不到作者,或者发生其他错误,可能会返回空字符串。

简单例子:

<?php
$author_id = 5; // 假设作者 ID 是 5
$author_url = get_author_posts_url( $author_id );

echo '<a href="' . esc_url( $author_url ) . '">查看作者的所有文章</a>';
?>

这段代码会生成一个链接,指向 ID 为 5 的作者的文章列表页面。 esc_url() 函数是用来转义 URL 的,防止出现安全问题,是个好习惯。

2. 源码剖析

咱们来深入了解一下 get_author_posts_url() 到底是怎么工作的。 以下是简化版的源码,去掉了部分错误处理和兼容性代码,方便理解:

<?php
function get_author_posts_url( $author_id, $author_nicename = '' ) {
    global $wp_rewrite;

    $author = get_userdata( $author_id ); // 从数据库获取作者信息

    if ( ! $author ) {
        return ''; // 如果找不到作者,返回空字符串
    }

    if ( empty( $author_nicename ) ) {
        $author_nicename = $author->user_nicename; // 如果没有提供别名,从作者信息里获取
    }

    $author_nicename = sanitize_title( $author_nicename );  // 对别名进行安全处理

    if ( $wp_rewrite->using_permalinks() ) { // 如果启用了固定链接

        if ( $wp_rewrite->author_base ) { // 如果设置了作者别名的前缀
            $author_base = $wp_rewrite->author_base;
        } else {
            $author_base = 'author'; // 默认的作者别名前缀
        }

        $author_url = home_url( user_trailingslashit( $author_base . '/' . $author_nicename, 'author' ) ); // 生成固定链接 URL
    } else { // 如果没有启用固定链接
        $author_url = home_url( '?author=' . $author_id ); // 生成带参数的 URL
    }

    return apply_filters( 'author_link', $author_url, $author_id, $author_nicename ); // 应用过滤器,允许修改 URL
}
?>

咱们一行一行来解读:

  1. global $wp_rewrite;: 声明全局变量 $wp_rewrite。 这个变量包含了 WordPress 的固定链接设置,决定了 URL 的生成方式。
  2. $author = get_userdata( $author_id );: 通过作者 ID,从数据库获取作者的详细信息,包括姓名、别名、邮箱等等。 get_userdata() 函数会返回一个 WP_User 对象,包含了作者的所有数据。
  3. if ( ! $author ) { return ''; }: 如果 get_userdata() 找不到对应的作者,说明提供的 $author_id 是个无效的 ID,函数直接返回空字符串。
  4. if ( empty( $author_nicename ) ) { $author_nicename = $author->user_nicename; }: 如果调用函数的时候没有提供 $author_nicename 参数,就从 $author 对象里获取作者的别名。$author->user_nicename 就是作者在 WordPress 后台设置的别名。
  5. $author_nicename = sanitize_title( $author_nicename );: 对作者别名进行安全处理。 sanitize_title() 函数会把别名转换成适合 URL 的格式,比如把空格替换成连字符,移除特殊字符等等。 这是为了防止 URL 出现问题,也是一个安全措施。
  6. if ( $wp_rewrite->using_permalinks() ) { ... } else { ... }: 这是整个函数的核心部分。 它根据 WordPress 是否启用了固定链接,采用不同的方式生成 URL。
    • 如果启用了固定链接:
      • if ( $wp_rewrite->author_base ) { ... } else { ... }: 检查是否设置了自定义的作者别名前缀。 可以在 WordPress 后台的固定链接设置里面修改这个前缀。 如果没有设置,就使用默认的 author 作为前缀。
      • $author_url = home_url( user_trailingslashit( $author_base . '/' . $author_nicename, 'author' ) );: 使用 home_url() 函数生成完整的 URL。 home_url() 函数返回 WordPress 的网站根 URL, user_trailingslashit() 函数则根据设置,在 URL 后面添加斜杠。
    • 如果没有启用固定链接:
      • $author_url = home_url( '?author=' . $author_id );: 生成一个带参数的 URL。 这种 URL 的格式是 example.com/?author=5, 通过 author 参数来指定作者 ID。
  7. return apply_filters( 'author_link', $author_url, $author_id, $author_nicename );: 最后,使用 apply_filters() 函数应用 author_link 过滤器。 这个过滤器允许开发者修改最终生成的 URL。 这提供了一个扩展点,可以根据自己的需求,定制作者文章列表页面的链接。

3. 举例说明

为了更清楚地理解,咱们来举几个例子:

例1: 启用固定链接,作者别名为 "john-doe",作者别名前缀为默认的 "author"

在这种情况下,生成的 URL 可能是:https://example.com/author/john-doe/

例2: 启用固定链接,作者别名为 "john-doe",作者别名前缀设置为 "writer"

在这种情况下,生成的 URL 可能是:https://example.com/writer/john-doe/

例3: 没有启用固定链接,作者 ID 为 5

在这种情况下,生成的 URL 可能是:https://example.com/?author=5

4. 实际应用场景

get_author_posts_url() 函数在 WordPress 主题开发中有很多应用场景:

  • 显示作者信息: 在文章页面的作者信息区域,可以使用这个函数生成作者文章列表页面的链接。
  • 作者列表页面: 可以创建一个作者列表页面,列出所有作者,并使用这个函数为每个作者生成链接。
  • 自定义查询: 如果需要自定义文章查询,可以根据作者 ID 来筛选文章,并使用这个函数生成作者文章列表页面的链接。

5. 注意事项

  • 安全性: 在使用 get_author_posts_url() 函数生成 URL 的时候,一定要使用 esc_url() 函数进行转义,防止出现安全问题。
  • 缓存: get_userdata() 函数会缓存作者信息,所以不用担心多次调用会影响性能。
  • 过滤器: 可以利用 author_link 过滤器来修改生成的 URL,实现更高级的功能。

6. 代码示例:自定义作者列表页面

下面是一个简单的例子,展示如何创建一个自定义的作者列表页面:

<?php
/**
 * Template Name: 作者列表
 */

get_header();

$authors = get_users( array(
    'orderby' => 'post_count',
    'order'   => 'DESC',
    'who'     => 'authors'
) );

?>

<div id="primary" class="content-area">
    <main id="main" class="site-main">

        <h1>作者列表</h1>

        <ul>
            <?php foreach ( $authors as $author ) : ?>
                <li>
                    <a href="<?php echo esc_url( get_author_posts_url( $author->ID ) ); ?>">
                        <?php echo esc_html( $author->display_name ); ?>
                    </a> (<?php echo count_user_posts( $author->ID ); ?>)
                </li>
            <?php endforeach; ?>
        </ul>

    </main><!-- #main -->
</div><!-- #primary -->

<?php
get_sidebar();
get_footer();
?>

这段代码创建了一个名为 "作者列表" 的页面模板,它会列出所有作者,并显示每个作者的文章数量,以及指向作者文章列表页面的链接。

7. 总结

get_author_posts_url() 函数是一个非常方便的工具,可以帮助你快速生成作者文章列表页面的 URL。 理解它的工作原理,可以让你更好地定制 WordPress 主题,并实现更高级的功能。 记住要进行安全转义,并善用过滤器,让你的代码更加健壮和灵活。

一些补充说明,表格形式展示可能遇到的问题和解决方案

问题 可能原因 解决方案
生成的URL不正确 1. 固定链接设置错误; 2. 作者别名不正确; 3. author_base 设置错误 1. 检查固定链接设置; 2. 检查作者信息; 3. 检查主题或插件是否修改了 author_base ; 使用 author_link 过滤器调试
点击链接后出现 404 错误 1. 固定链接未刷新; 2. author_base 设置错误; 3. .htaccess 文件问题 1. 刷新固定链接(在 WordPress 后台保存一下固定链接设置); 2. 检查 author_base 设置; 3. 检查 .htaccess 文件
作者页面显示空白 1. 主题缺少 author.php 模板; 2. 查询参数错误 1. 创建或修改 author.php 模板; 2. 检查查询参数是否正确
作者文章列表页面显示所有文章 查询参数错误 检查查询参数是否正确,确保只显示指定作者的文章
如何自定义作者文章列表页面的显示方式 使用 pre_get_posts 过滤器 使用 pre_get_posts 过滤器,修改查询参数,自定义文章排序、分页等

希望今天的讲解对你有所帮助。 记住,理解源码是成为 WordPress 大神的必经之路! 咱们下期再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注