WordPress Author Page Customization in 2025

Table of Contents show

As a professional WordPress developer, I’ve helped countless clients transform their bland author pages into powerful platforms that showcase writer expertise, build credibility, and enhance the overall user experience. In today’s digital landscape, well-crafted author pages aren’t just a nice-to-have feature—they’re essential for establishing E-E-A-T (Experience, Expertise, Authoritativeness, and Trustworthiness) and improving your site’s SEO performance.

In this expert guide, I’ll walk you through everything you need to know about customizing WordPress author pages, from basic modifications to advanced techniques that will make your authors shine.

Why Author Pages Matter for WordPress Sites

Before diving into customization techniques, it’s important to understand why author pages deserve your attention:

1. Enhanced E-E-A-T for SEO

Google’s Quality Rater Guidelines place significant emphasis on E-E-A-T factors. Well-designed author pages that highlight credentials, expertise, and experience directly contribute to these signals. This is especially crucial for YMYL (Your Money or Your Life) sites covering health, finance, or legal topics.

2. Improved User Experience

Readers often want to know who’s behind the content they’re consuming. A thoughtfully designed author page helps build trust and connection with your audience, potentially increasing engagement and return visits.

3. Professional Branding

For multi-author blogs, magazines, and news sites, customized author pages create a consistent, professional presentation that elevates your brand image.

4. Content Discovery

Author pages serve as content hubs where readers can discover more articles by writers they enjoy, increasing page views and reducing bounce rates.

5. Networking Opportunities

For authors, a well-designed profile page can serve as a portfolio, potentially leading to networking and professional opportunities.

Understanding the Default WordPress Author Page

Guide to WordPress Author Page Customization in 2025
Guide to WordPress Author Page Customization in 2025

By default, WordPress author pages are quite basic. They typically include:

  • The author’s display name as a heading
  • A simple list of posts by that author (often just titles and excerpts)
  • Basic pagination if there are multiple pages of content

This minimal presentation lacks personality and fails to leverage the full potential of author pages. The good news is that WordPress provides multiple ways to enhance these pages, from simple tweaks to complete redesigns.

Essential Elements of an Effective Author Page

Before implementing customizations, let’s identify the key components that make up an effective author page:

1. Professional Author Bio

A compelling, concise biography that establishes the author’s expertise, experience, and unique perspective.

2. Professional Headshot or Avatar

A high-quality, professional image that helps readers connect with the author.

3. Credentials and Qualifications

Relevant degrees, certifications, or experience that establishes authority in the subject matter.

4. Social Media Links

Connections to the author’s professional social profiles to extend the relationship beyond your website.

5. Featured or Recent Articles

A curated selection of the author’s best or most recent work, ideally with visual elements.

6. Contact Information

A way for readers or potential clients to reach the author (often through a contact form).

7. Author-Specific Metrics

Statistics like article count, comments received, or reader engagement metrics.

Methods for Customizing WordPress Author Pages

Wordpress Author Page Customization in 2025
WordPress Author Page Customization in 2025

Now, let’s explore the different approaches to customizing author pages, starting with the simplest methods and progressing to more advanced techniques.

Method 1: Using Author Bio Plugins

For beginners or those with limited development experience, plugins offer the easiest path to enhanced author pages.

Simple Author Box

Simple Author Box is a lightweight plugin that adds a responsive, customizable author bio box to your posts and author pages.

Key Features:

  • Clean, responsive design
  • Social media icon integration
  • Custom color schemes
  • Simple configuration

Implementation Steps:

  1. Install and activate the Simple Author Box plugin
  2. Go to Settings → Simple Author Box
  3. Configure the general appearance settings
  4. Edit user profiles to add social media links and author bios
  5. The plugin automatically enhances both post-level author boxes and author archive pages

This plugin offers a quick win for sites looking to improve author presentation without diving into code.

Author Bio Box by WP Bullet

This plugin focuses specifically on the author biography area with a clean, customizable design.

Key Features:

  • Minimal design approach
  • Lightweight code
  • Multiple display options
  • Social media integration

Implementation Steps:

  1. Install and activate the Author Bio Box plugin
  2. Configure display settings under Settings → Author Bio Box
  3. Update author profiles with detailed information
  4. Adjust styling through the plugin settings

Method 2: Using Theme Customizer Options

Many modern WordPress themes include author page customization options in the Theme Customizer. This approach requires no coding but is limited by what your specific theme offers.

Implementation Steps:

  1. Go to Appearance → Customize in your WordPress dashboard
  2. Look for sections like “Archive Pages,” “Author Pages,” or “Content Settings”
  3. Configure available options for author display
  4. Preview changes in real-time
  5. Save and publish your customizations

Popular themes like Astra, GeneratePress, and many free WordPress themes for blogs include author page customization options in their customizer settings.

Method 3: Creating a Custom Author Template

For more control over your author pages, creating a custom author template allows you to completely redesign the layout and functionality.

Step 1: Create an author.php Template

In your child theme (always use a child theme for customizations), create a file named author.php. This will override the default template used for author pages.

Here’s a basic example of a custom author.php template:

<?php get_header(); ?>

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

<header class="author-header">
<div class="author-avatar">
<?php echo get_avatar( get_the_author_meta( 'ID' ), 150 ); ?>
</div>

<div class="author-info">
<h1 class="author-title"><?php the_author(); ?></h1>

<?php if ( get_the_author_meta( 'description' ) ) : ?>
<div class="author-bio">
<?php echo wpautop( get_the_author_meta( 'description' ) ); ?>
</div>
<?php endif; ?>

<div class="author-meta">
<?php if ( get_the_author_meta( 'user_email' ) ) : ?>
<span class="author-email">
<i class="fas fa-envelope"></i>
<a href="mailto:<?php echo esc_attr( get_the_author_meta( 'user_email' ) ); ?>">
<?php echo esc_html( get_the_author_meta( 'user_email' ) ); ?>
</a>
</span>
<?php endif; ?>

<?php if ( get_the_author_meta( 'user_url' ) ) : ?>
<span class="author-website">
<i class="fas fa-globe"></i>
<a href="<?php echo esc_url( get_the_author_meta( 'user_url' ) ); ?>" target="_blank">
<?php echo esc_html( get_the_author_meta( 'user_url' ) ); ?>
</a>
</span>
<?php endif; ?>
</div>

<div class="author-social">
<?php
// Display social media links if available
$social_profiles = array(
'twitter' => array(
'label' => 'Twitter',
'icon' => 'fab fa-twitter',
),
'facebook' => array(
'label' => 'Facebook',
'icon' => 'fab fa-facebook-f',
),
'linkedin' => array(
'label' => 'LinkedIn',
'icon' => 'fab fa-linkedin-in',
),
'instagram' => array(
'label' => 'Instagram',
'icon' => 'fab fa-instagram',
),
);

foreach ( $social_profiles as $key => $network ) {
$profile_url = get_the_author_meta( $key );
if ( $profile_url ) {
echo '<a href="' . esc_url( $profile_url ) . '" class="author-social-link ' . esc_attr( $key ) . '" target="_blank">';
echo '<i class="' . esc_attr( $network['icon'] ) . '"></i>';
echo '</a>';
}
}
?>
</div>
</div>
</header>

<div class="author-posts">
<h2 class="author-posts-title">
<?php printf( esc_html__( 'Articles by %s', 'your-theme-textdomain' ), get_the_author() ); ?>
</h2>

<?php if ( have_posts() ) : ?>
<div class="author-post-grid">
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class( 'author-post-item' ); ?>>
<?php if ( has_post_thumbnail() ) : ?>
<div class="post-thumbnail">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( 'medium' ); ?>
</a>
</div>
<?php endif; ?>

<header class="entry-header">
<?php the_title( '<h3 class="entry-title"><a href="' . esc_url( get_permalink() ) . '">', '</a></h3>' ); ?>

<div class="entry-meta">
<span class="posted-on">
<?php echo get_the_date(); ?>
</span>

<span class="comments-link">
<?php comments_popup_link( 'No Comments', '1 Comment', '% Comments' ); ?>
</span>
</div>
</header>

<div class="entry-summary">
<?php the_excerpt(); ?>
</div>
</article>
<?php endwhile; ?>
</div>

<?php the_posts_pagination(); ?>

<?php else : ?>
<p><?php esc_html_e( 'No posts found for this author.', 'your-theme-textdomain' ); ?></p>
<?php endif; ?>
</div>

</main>
</div>

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

Step 2: Add Custom CSS

Add these styles to your child theme’s style.css file to enhance the appearance:

/* Author Page Styles */
.author-header {
display: flex;
flex-wrap: wrap;
margin-bottom: 40px;
padding: 30px;
background-color: #f9f9f9;
border-radius: 5px;
}

.author-avatar {
flex: 0 0 150px;
margin-right: 30px;
}

.author-avatar img {
border-radius: 50%;
border: 3px solid #fff;
box-shadow: 0 0 15px rgba(0,0,0,0.1);
}

.author-info {
flex: 1;
}

.author-title {
margin-top: 0;
margin-bottom: 15px;
font-size: 28px;
}

.author-bio {
margin-bottom: 20px;
line-height: 1.6;
color: #555;
}

.author-meta {
margin-bottom: 15px;
}

.author-meta span {
display: inline-block;
margin-right: 20px;
margin-bottom: 5px;
color: #666;
}

.author-meta i {
margin-right: 5px;
color: #333;
}

.author-social {
margin-top: 15px;
}

.author-social-link {
display: inline-block;
margin-right: 15px;
width: 36px;
height: 36px;
line-height: 36px;
text-align: center;
background-color: #eee;
color: #333;
border-radius: 50%;
transition: all 0.3s ease;
}

.author-social-link:hover {
background-color: #333;
color: #fff;
}

.author-social-link.twitter:hover {
background-color: #1DA1F2;
}

.author-social-link.facebook:hover {
background-color: #1877F2;
}

.author-social-link.linkedin:hover {
background-color: #0A66C2;
}

.author-social-link.instagram:hover {
background-color: #E4405F;
}

.author-posts-title {
margin-bottom: 30px;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}

.author-post-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 30px;
}

.author-post-item {
border: 1px solid #eee;
border-radius: 5px;
overflow: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.author-post-item:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
}

.post-thumbnail img {
width: 100%;
height: auto;
display: block;
}

.entry-header {
padding: 20px 20px 10px;
}

.entry-title {
margin-top: 0;
margin-bottom: 10px;
font-size: 18px;
line-height: 1.4;
}

.entry-meta {
font-size: 13px;
color: #777;
margin-bottom: 10px;
}

.entry-meta span {
margin-right: 15px;
}

.entry-summary {
padding: 0 20px 20px;
color: #666;
}

/* Responsive adjustments */
@media (max-width: 768px) {
.author-header {
flex-direction: column;
text-align: center;
}

.author-avatar {
margin: 0 auto 20px;
}

.author-post-grid {
grid-template-columns: 1fr;
}
}

Step 3: Add Font Awesome for Icons

To use the social icons in the template, add Font Awesome to your theme by including this in your child theme’s functions.php:

function author_page_enqueue_scripts() {
wp_enqueue_style( 'font-awesome', 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css' );
}
add_action( 'wp_enqueue_scripts', 'author_page_enqueue_scripts' );

Method 4: Using Page Builders for Author Pages

If you’re using WordPress page builders like Elementor, Divi, or Beaver Builder, you can create highly customized author page templates with drag-and-drop ease.

Example: Using Elementor Theme Builder

  1. Install and activate Elementor Pro
  2. Go to Templates → Theme Builder
  3. Click “Add New” and select “Author Archive”
  4. Design your template using Elementor’s widgets and dynamic content features
  5. Set display conditions to apply the template to all author pages
  6. Publish your template

This approach offers incredible flexibility without requiring code knowledge, allowing you to create sophisticated layouts with dynamic author information.

Advanced Author Page Customization Techniques

For those seeking more powerful customizations, these advanced techniques can transform your author pages into truly unique experiences.

Adding Custom Author Profile Fields

WordPress allows you to add custom user profile fields to store additional author information:

// Add custom author profile fields
function custom_author_profile_fields( $user ) {
?>
<h3><?php _e( 'Additional Profile Information', 'your-theme-textdomain' ); ?></h3>

<table class="form-table">
<tr>
<th><label for="job_title"><?php _e( 'Job Title', 'your-theme-textdomain' ); ?></label></th>
<td>
<input type="text" name="job_title" id="job_title" value="<?php echo esc_attr( get_the_author_meta( 'job_title', $user->ID ) ); ?>" class="regular-text" />
<span class="description"><?php _e( 'Your professional title', 'your-theme-textdomain' ); ?></span>
</td>
</tr>
<tr>
<th><label for="expertise"><?php _e( 'Areas of Expertise', 'your-theme-textdomain' ); ?></label></th>
<td>
<textarea name="expertise" id="expertise" rows="3" class="regular-text"><?php echo esc_textarea( get_the_author_meta( 'expertise', $user->ID ) ); ?></textarea>
<span class="description"><?php _e( 'List your areas of expertise (comma separated)', 'your-theme-textdomain' ); ?></span>
</td>
</tr>
<tr>
<th><label for="twitter"><?php _e( 'Twitter Profile', 'your-theme-textdomain' ); ?></label></th>
<td>
<input type="url" name="twitter" id="twitter" value="<?php echo esc_url( get_the_author_meta( 'twitter', $user->ID ) ); ?>" class="regular-text" />
<span class="description"><?php _e( 'Your Twitter profile URL', 'your-theme-textdomain' ); ?></span>
</td>
</tr>
<tr>
<th><label for="linkedin"><?php _e( 'LinkedIn Profile', 'your-theme-textdomain' ); ?></label></th>
<td>
<input type="url" name="linkedin" id="linkedin" value="<?php echo esc_url( get_the_author_meta( 'linkedin', $user->ID ) ); ?>" class="regular-text" />
<span class="description"><?php _e( 'Your LinkedIn profile URL', 'your-theme-textdomain' ); ?></span>
</td>
</tr>
<tr>
<th><label for="featured_post"><?php _e( 'Featured Post ID', 'your-theme-textdomain' ); ?></label></th>
<td>
<input type="text" name="featured_post" id="featured_post" value="<?php echo esc_attr( get_the_author_meta( 'featured_post', $user->ID ) ); ?>" class="regular-text" />
<span class="description"><?php _e( 'ID of your featured post to highlight on your author page', 'your-theme-textdomain' ); ?></span>
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'custom_author_profile_fields' );
add_action( 'edit_user_profile', 'custom_author_profile_fields' );

// Save custom author profile fields
function save_custom_author_profile_fields( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) ) {
return false;
}

update_user_meta( $user_id, 'job_title', sanitize_text_field( $_POST['job_title'] ) );
update_user_meta( $user_id, 'expertise', sanitize_textarea_field( $_POST['expertise'] ) );
update_user_meta( $user_id, 'twitter', esc_url_raw( $_POST['twitter'] ) );
update_user_meta( $user_id, 'linkedin', esc_url_raw( $_POST['linkedin'] ) );
update_user_meta( $user_id, 'featured_post', absint( $_POST['featured_post'] ) );
}
add_action( 'personal_options_update', 'save_custom_author_profile_fields' );
add_action( 'edit_user_profile_update', 'save_custom_author_profile_fields' );

Then, update your author.php template to display these custom fields:

<div class="author-info">
<h1 class="author-title"><?php the_author(); ?></h1>

<?php if ( get_the_author_meta( 'job_title' ) ) : ?>
<div class="author-job-title"><?php echo esc_html( get_the_author_meta( 'job_title' ) ); ?></div>
<?php endif; ?>

<?php if ( get_the_author_meta( 'description' ) ) : ?>
<div class="author-bio">
<?php echo wpautop( get_the_author_meta( 'description' ) ); ?>
</div>
<?php endif; ?>

<?php if ( get_the_author_meta( 'expertise' ) ) : ?>
<div class="author-expertise">
<h4><?php _e( 'Expertise', 'your-theme-textdomain' ); ?></h4>
<div class="expertise-tags">
<?php
$expertise = get_the_author_meta( 'expertise' );
$expertise_array = array_map( 'trim', explode( ',', $expertise ) );

foreach ( $expertise_array as $skill ) {
echo '<span class="expertise-tag">' . esc_html( $skill ) . '</span>';
}
?>
</div>
</div>
<?php endif; ?>

<!-- Rest of the author info... -->
</div>

Displaying Author Post Statistics

Add valuable context by showing statistics about the author’s contributions:

<div class="author-statistics">
<?php
$author_id = get_the_author_meta( 'ID' );
$post_count = count_user_posts( $author_id, 'post', true );
$comment_count = get_comments( array(
'user_id' => $author_id,
'count' => true
) );

// Get total post views if you have a post views tracking system
global $wpdb;
$total_views = $wpdb->get_var( $wpdb->prepare(
"SELECT SUM(meta_value) FROM $wpdb->postmeta
WHERE meta_key = 'post_views_count'
AND post_id IN (
SELECT ID FROM $wpdb->posts
WHERE post_author = %d
AND post_status = 'publish'
AND post_type = 'post'
)",
$author_id
) );
$total_views = $total_views ? number_format( $total_views ) : 0;
?>

<div class="stat-item">
<span class="stat-number"><?php echo number_format( $post_count ); ?></span>
<span class="stat-label"><?php echo _n( 'Article', 'Articles', $post_count, 'your-theme-textdomain' ); ?></span>
</div>

<div class="stat-item">
<span class="stat-number"><?php echo number_format( $comment_count ); ?></span>
<span class="stat-label"><?php echo _n( 'Comment', 'Comments', $comment_count, 'your-theme-textdomain' ); ?></span>
</div>

<div class="stat-item">
<span class="stat-number"><?php echo $total_views; ?></span>
<span class="stat-label"><?php _e( 'Article Views', 'your-theme-textdomain' ); ?></span>
</div>
</div>

Add these styles to your CSS:

.author-statistics {
display: flex;
margin: 20px 0;
text-align: center;
}

.stat-item {
flex: 1;
padding: 15px;
background-color: #f5f5f5;
border-radius: 5px;
margin-right: 10px;
}

.stat-item:last-child {
margin-right: 0;
}

.stat-number {
display: block;
font-size: 24px;
font-weight: bold;
color: #333;
}

.stat-label {
display: block;
font-size: 14px;
color: #666;
margin-top: 5px;
}

Featuring Top Posts by the Author

Highlight an author’s best work with a featured posts section:

<div class="author-featured-posts">
<h3><?php _e( 'Featured Articles', 'your-theme-textdomain' ); ?></h3>

<div class="featured-posts-grid">
<?php
// Check if the author has specified a featured post
$featured_post_id = get_the_author_meta( 'featured_post' );
$featured_posts_args = array(
'author' => get_the_author_meta( 'ID' ),
'posts_per_page' => 3,
'post_status' => 'publish',
'ignore_sticky_posts' => 1,
'orderby' => 'meta_value_num',
'meta_key' => 'post_views_count', // Assumes you track post views
'order' => 'DESC'
);

// If there's a specified featured post, include it
if ( $featured_post_id && get_post_status( $featured_post_id ) === 'publish' ) {
$featured_posts_args['post__in'] = array( $featured_post_id );
$featured_posts_args['posts_per_page'] = 1;
}

$featured_posts = new WP_Query( $featured_posts_args );

if ( $featured_posts->have_posts() ) {
while ( $featured_posts->have_posts() ) {
$featured_posts->the_post();
?>
<article class="featured-post">
<?php if ( has_post_thumbnail() ) : ?>
<div class="featured-thumbnail">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( 'medium_large' ); ?>
</a>
</div>
<?php endif; ?>

<div class="featured-content">
<?php the_title( '<h4 class="featured-title"><a href="' . esc_url( get_permalink() ) . '">', '</a></h4>' ); ?>

<div class="featured-meta">
<span class="featured-date"><?php echo get_the_date(); ?></span>

<?php if ( function_exists( 'get_post_views' ) ) : ?>
<span class="featured-views">
<i class="fas fa-eye"></i> <?php echo number_format( get_post_views( get_the_ID() ) ); ?>
</span>
<?php endif; ?>
</div>

<div class="featured-excerpt">
<?php the_excerpt(); ?>
</div>
</div>
</article>
<?php
}
wp_reset_postdata();
}
?>
</div>
</div>

Adding Author Post Filtering

Enhance usability by allowing visitors to filter an author’s posts by category or tag:

<?php
$author_id = get_the_author_meta( 'ID' );

// Get categories this author has used
$author_categories = get_categories( array(
'hide_empty' => 1,
'object_ids' => get_posts( array(
'author' => $author_id,
'posts_per_page' => -1,
'fields' => 'ids',
) ),
) );

// Get tags this author has used
$author_tags = get_tags( array(
'hide_empty' => 1,
'object_ids' => get_posts( array(
'author' => $author_id,
'posts_per_page' => -1,
'fields' => 'ids',
) ),
) );

// Only show filters if we have categories or tags
if ( !empty( $author_categories ) || !empty( $author_tags ) ) :
?>
<div class="author-post-filters">
<h3><?php _e( 'Filter Articles', 'your-theme-textdomain' ); ?></h3>

<?php if ( !empty( $author_categories ) ) : ?>
<div class="filter-section categories-filter">
<h4><?php _e( 'By Category', 'your-theme-textdomain' ); ?></h4>
<div class="filter-options">
<?php foreach ( $author_categories as $category ) : ?>
<a href="<?php echo esc_url( add_query_arg( 'category', $category->slug ) ); ?>" class="filter-option <?php echo isset( $_GET['category'] ) && $_GET['category'] === $category->slug ? 'active' : ''; ?>">
<?php echo esc_html( $category->name ); ?>
<span class="count">(<?php echo esc_html( $category->count ); ?>)</span>
</a>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>

<?php if ( !empty( $author_tags ) ) : ?>
<div class="filter-section tags-filter">
<h4><?php _e( 'By Tag', 'your-theme-textdomain' ); ?></h4>
<div class="filter-options">
<?php foreach ( $author_tags as $tag ) : ?>
<a href="<?php echo esc_url( add_query_arg( 'tag', $tag->slug ) ); ?>" class="filter-option <?php echo isset( $_GET['tag'] ) && $_GET['tag'] === $tag->slug ? 'active' : ''; ?>">
<?php echo esc_html( $tag->name ); ?>
<span class="count">(<?php echo esc_html( $tag->count ); ?>)</span>
</a>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>

<?php if ( isset( $_GET['category'] ) || isset( $_GET['tag'] ) ) : ?>
<a href="<?php echo esc_url( get_author_posts_url( $author_id ) ); ?>" class="clear-filters">
<?php _e( 'Clear Filters', 'your-theme-textdomain' ); ?>
</a>
<?php endif; ?>
</div>
<?php endif; ?>

<?php
// Modify the main query to respect our filters
function modify_author_query( $query ) {
if ( !is_admin() && query->is_author() && query->is_main_query() ) {
// Filter by category if requested
if ( isset( _GET['category'] ) && !empty( _GET['category'] ) ) {
query−>set(′categoryn​ame′,sanitizet​extf​ield(_GET['category'] ) );
}

// Filter by tag if requested
if ( isset( _GET['tag'] ) && !empty( _GET['tag'] ) ) {
query−>set(′tag′,sanitizet​extf​ield(_GET['tag'] ) );
}
}
}
add_action( 'pre_get_posts', 'modify_author_query' );
?>
Add these styles for the filters:

```css
.author-post-filters {
margin: 30px 0;
padding: 20px;
background-color: #f9f9f9;
border-radius: 5px;
}

.author-post-filters h3 {
margin-top: 0;
margin-bottom: 15px;
}

.filter-section {
margin-bottom: 20px;
}

.filter-section h4 {
margin-top: 0;
margin-bottom: 10px;
font-size: 16px;
}

.filter-options {
display: flex;
flex-wrap: wrap;
gap: 10px;
}

.filter-option {
display: inline-block;
padding: 6px 12px;
background-color: #eee;
border-radius: 20px;
font-size: 14px;
color: #555;
text-decoration: none;
transition: all 0.2s ease;
}

.filter-option:hover {
background-color: #ddd;
color: #333;
}

.filter-option.active {
background-color: #2271b1;
color: #fff;
}

.filter-option .count {
font-size: 12px;
opacity: 0.7;
}

.clear-filters {
display: inline-block;
margin-top: 10px;
font-size: 14px;
color: #d63638;
}

.clear-filters:hover {
text-decoration: underline;
}

Specialized Author Page Customizations for Different Site Types

Wordpress Author Page Customization in 2025
WordPress Author Page Customization in 2025

Different types of WordPress sites have unique requirements for author pages. Let’s explore some specialized customizations:

For Magazine and News Sites

Magazine and news sites using magazine WordPress themes often need to highlight journalist credentials and categorize content by beat:

<div class="journalist-credentials">
<h3><?php _e( 'About the Journalist', 'your-theme-textdomain' ); ?></h3>

<?php if ( get_the_author_meta( 'journalist_since' ) ) : ?>
<div class="credential-item">
<span class="credential-label"><?php _e( 'Journalist Since:', 'your-theme-textdomain' ); ?></span>
<span class="credential-value"><?php echo esc_html( get_the_author_meta( 'journalist_since' ) ); ?></span>
</div>
<?php endif; ?>

<?php if ( get_the_author_meta( 'beats' ) ) : ?>
<div class="credential-item">
<span class="credential-label"><?php _e( 'Beats:', 'your-theme-textdomain' ); ?></span>
<span class="credential-value"><?php echo esc_html( get_the_author_meta( 'beats' ) ); ?></span>
</div>
<?php endif; ?>

<?php if ( get_the_author_meta( 'awards' ) ) : ?>
<div class="credential-item">
<span class="credential-label"><?php _e( 'Awards:', 'your-theme-textdomain' ); ?></span>
<span class="credential-value"><?php echo esc_html( get_the_author_meta( 'awards' ) ); ?></span>
</div>
<?php endif; ?>
</div>

<div class="journalist-recent-stories">
<h3><?php _e( 'Recent Stories by Beat', 'your-theme-textdomain' ); ?></h3>

<?php
// Display stories grouped by category/beat
$categories = get_categories( array(
'hide_empty' => 1,
'object_ids' => get_posts( array(
'author' => get_the_author_meta( 'ID' ),
'posts_per_page' => -1,
'fields' => 'ids',
) ),
) );

foreach ( $categories as $category ) :
// Get the latest 3 posts by this author in this category
$category_posts = new WP_Query( array(
'author' => get_the_author_meta( 'ID' ),
'cat' => $category->term_id,
'posts_per_page' => 3,
) );

if ( $category_posts->have_posts() ) :
?>
<div class="beat-section">
<h4 class="beat-title"><?php echo esc_html( $category->name ); ?></h4>

<div class="beat-stories">
<?php while ( $category_posts->have_posts() ) : $category_posts->the_post(); ?>
<article class="beat-story">
<h5>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h5>
<span class="story-date"><?php echo get_the_date(); ?></span>
</article>
<?php endwhile; wp_reset_postdata(); ?>
</div>

<a href="<?php echo esc_url( add_query_arg( 'category', $category->slug ) ); ?>" class="view-all-link">
<?php _e( 'View all stories in this beat', 'your-theme-textdomain' ); ?>
</a>
</div>
<?php
endif;
endforeach;
?>
</div>

For E-commerce and Review Sites

For e-commerce WordPress sites or review WordPress themes, highlight product expertise and review metrics:

<div class="reviewer-metrics">
<h3><?php _e( 'Review Metrics', 'your-theme-textdomain' ); ?></h3>

<?php
$author_id = get_the_author_meta( 'ID' );

// Get review posts by this author
$review_posts = get_posts( array(
'author' => $author_id,
'posts_per_page' => -1,
'post_type' => 'review', // Assuming you have a review post type
'fields' => 'ids',
) );

// Calculate average rating if you store ratings as post meta
$total_rating = 0;
$review_count = count( $review_posts );

foreach ( $review_posts as $review_id ) {
$rating = get_post_meta( $review_id, 'review_rating', true );
if ( $rating ) {
$total_rating += floatval( $rating );
}
}

$average_rating = $review_count > 0 ? round( $total_rating / $review_count, 1 ) : 0;
?>

<div class="metrics-grid">
<div class="metric-item">
<div class="metric-value"><?php echo number_format( $review_count ); ?></div>
<div class="metric-label"><?php _e( 'Products Reviewed', 'your-theme-textdomain' ); ?></div>
</div>

<div class="metric-item">
<div class="metric-value"><?php echo number_format( $average_rating, 1 ); ?>/5</div>
<div class="metric-label"><?php _e( 'Average Rating', 'your-theme-textdomain' ); ?></div>
</div>

<?php if ( get_the_author_meta( 'product_expertise' ) ) : ?>
<div class="metric-item expertise">
<div class="metric-value"><?php echo esc_html( get_the_author_meta( 'product_expertise' ) ); ?></div>
<div class="metric-label"><?php _e( 'Expertise', 'your-theme-textdomain' ); ?></div>
</div>
<?php endif; ?>
</div>
</div>

<div class="top-reviewed-products">
<h3><?php _e( 'Top Rated Products', 'your-theme-textdomain' ); ?></h3>

<?php
// Get top-rated products reviewed by this author
$top_reviews = get_posts( array(
'author' => $author_id,
'posts_per_page' => 3,
'post_type' => 'review',
'meta_key' => 'review_rating',
'orderby' => 'meta_value_num',
'order' => 'DESC',
) );

if ( $top_reviews ) :
?>
<div class="products-grid">
<?php foreach ( $top_reviews as $review ) : ?>
<div class="product-item">
<?php if ( has_post_thumbnail( $review->ID ) ) : ?>
<div class="product-image">
<a href="<?php echo get_permalink( $review->ID ); ?>">
<?php echo get_the_post_thumbnail( $review->ID, 'medium' ); ?>
</a>
</div>
<?php endif; ?>

<div class="product-info">
<h4 class="product-title">
<a href="<?php echo get_permalink( $review->ID ); ?>">
<?php echo get_the_title( $review->ID ); ?>
</a>
</h4>

<?php
$rating = get_post_meta( $review->ID, 'review_rating', true );
if ( $rating ) :
?>
<div class="product-rating">
<?php
// Display star rating
$rating = floatval( $rating );
for ( $i = 1; $i <= 5; $i++ ) {
if ( $i <= $rating ) {
echo '<span class="star full"><i class="fas fa-star"></i></span>';
} elseif ( $i - 0.5 <= $rating ) {
echo '<span class="star half"><i class="fas fa-star-half-alt"></i></span>';
} else {
echo '<span class="star empty"><i class="far fa-star"></i></span>';
}
}
?>
<span class="rating-value"><?php echo number_format( $rating, 1 ); ?>/5</span>
</div>
<?php endif; ?>

<div class="product-excerpt">
<?php echo wp_trim_words( $review->post_excerpt ? $review->post_excerpt : $review->post_content, 20 ); ?>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>

For Portfolio and Creative Sites

For creative professionals using portfolio WordPress themes, showcase projects and skills:

<div class="creative-profile">
<div class="profile-header">
<div class="profile-image">
<?php echo get_avatar( get_the_author_meta( 'ID' ), 200 ); ?>
</div>

<div class="profile-intro">
<h1 class="profile-name"><?php the_author(); ?></h1>

<?php if ( get_the_author_meta( 'creative_title' ) ) : ?>
<div class="profile-title"><?php echo esc_html( get_the_author_meta( 'creative_title' ) ); ?></div>
<?php endif; ?>

<?php if ( get_the_author_meta( 'description' ) ) : ?>
<div class="profile-bio">
<?php echo wpautop( get_the_author_meta( 'description' ) ); ?>
</div>
<?php endif; ?>

<div class="profile-social">
<?php
$social_profiles = array(
'behance' => array('label' => 'Behance', 'icon' => 'fab fa-behance'),
'dribbble' => array('label' => 'Dribbble', 'icon' => 'fab fa-dribbble'),
'instagram' => array('label' => 'Instagram', 'icon' => 'fab fa-instagram'),
'linkedin' => array('label' => 'LinkedIn', 'icon' => 'fab fa-linkedin-in'),
);

foreach ( $social_profiles as $key => $network ) {
$profile_url = get_the_author_meta( $key );
if ( $profile_url ) {
echo '<a href="' . esc_url( $profile_url ) . '" class="social-link ' . esc_attr( $key ) . '" target="_blank">';
echo '<i class="' . esc_attr( $network['icon'] ) . '"></i>';
echo '</a>';
}
}
?>
</div>
</div>
</div>

<?php if ( get_the_author_meta( 'skills' ) ) : ?>
<div class="creative-skills">
<h3><?php _e( 'Skills & Expertise', 'your-theme-textdomain' ); ?></h3>

<div class="skills-list">
<?php
$skills = get_the_author_meta( 'skills' );
$skills_array = array_map( 'trim', explode( ',', $skills ) );

foreach ( $skills_array as $skill ) {
echo '<span class="skill-tag">' . esc_html( $skill ) . '</span>';
}
?>
</div>
</div>
<?php endif; ?>

<div class="creative-projects">
<h3><?php _e( 'Featured Projects', 'your-theme-textdomain' ); ?></h3>

<?php
// Get portfolio projects by this author
// Assumes you have a 'portfolio' custom post type
$projects = new WP_Query( array(
'author' => get_the_author_meta( 'ID' ),
'post_type' => 'portfolio',
'posts_per_page' => 6,
'orderby' => 'date',
'order' => 'DESC',
) );

if ( $projects->have_posts() ) :
?>
<div class="projects-grid">
<?php while ( $projects->have_posts() ) : $projects->the_post(); ?>
<div class="project-item">
<?php if ( has_post_thumbnail() ) : ?>
<div class="project-thumbnail">
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( 'large' ); ?>
</a>
<div class="project-overlay">
<h4 class="project-title"><?php the_title(); ?></h4>

<?php
// Get project categories
$project_cats = get_the_terms( get_the_ID(), 'portfolio_category' );
if ( $project_cats && !is_wp_error( $project_cats ) ) :
?>
<div class="project-categories">
<?php
$cat_names = array();
foreach ( $project_cats as $cat ) {
$cat_names[] = $cat->name;
}
echo esc_html( implode( ', ', $cat_names ) );
?>
</div>
<?php endif; ?>
</div>
</div>
<?php endif; ?>
</div>
<?php endwhile; wp_reset_postdata(); ?>
</div>

<a href="<?php echo esc_url( get_post_type_archive_link( 'portfolio' ) . '?author=' . get_the_author_meta( 'ID' ) ); ?>" class="view-all-projects">
<?php _e( 'View All Projects', 'your-theme-textdomain' ); ?>
</a>
<?php else : ?>
<p><?php _e( 'No portfolio projects found.', 'your-theme-textdomain' ); ?></p>
<?php endif; ?>
</div>
</div>

Integrating Author Pages with Social Media and External Platforms

Enhance your author pages by integrating with social media and other platforms:

Displaying Twitter Feed

<?php
// Make sure you've added Twitter handle to user profile
$twitter_handle = get_the_author_meta( 'twitter_username' );

if ( $twitter_handle ) :
// Remove @ if present
$twitter_handle = str_replace( '@', '', $twitter_handle );
?>
<div class="author-twitter-feed">
<h3><?php _e( 'Latest Tweets', 'your-theme-textdomain' ); ?></h3>

<a class="twitter-timeline"
data-height="400"
data-theme="light"
data-tweet-limit="3"
href="https://twitter.com/<?php echo esc_attr( $twitter_handle ); ?>">
<?php printf( __( 'Tweets by @%s', 'your-theme-textdomain' ), esc_html( $twitter_handle ) ); ?>
</a>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div>
<?php endif; ?>

Adding Author’s YouTube Videos

<?php
// Make sure you've added YouTube channel ID to user profile
$youtube_channel = get_the_author_meta( 'youtube_channel' );

if ( $youtube_channel ) :
?>
<div class="author-youtube-videos">
<h3><?php _e( 'Latest Videos', 'your-theme-textdomain' ); ?></h3>

<div class="youtube-container">
<iframe
width="100%"
height="315"
src="https://www.youtube.com/embed?listType=user_uploads&list=<?php echo esc_attr( $youtube_channel ); ?>"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen>
</iframe>
</div>

<a href="https://www.youtube.com/channel/<?php echo esc_attr( $youtube_channel ); ?>" class="youtube-link" target="_blank">
<?php _e( 'View YouTube Channel', 'your-theme-textdomain' ); ?>
</a>
</div>
<?php endif; ?>

Integrating with Medium or External Blogs

<?php
// Make sure you've added Medium username to user profile
$medium_username = get_the_author_meta( 'medium_username' );

if ( $medium_username ) :
// Fetch the RSS feed from Medium
include_once( ABSPATH . WPINC . '/feed.php' );
$medium_feed = fetch_feed( 'https://medium.com/feed/@' . $medium_username );

if ( !is_wp_error( $medium_feed ) ) :
$max_items = $medium_feed->get_item_quantity( 3 );
$medium_items = $medium_feed->get_items( 0, $max_items );
?>
<div class="author-medium-posts">
<h3><?php _e( 'Articles on Medium', 'your-theme-textdomain' ); ?></h3>

<?php if ( $max_items == 0 ) : ?>
<p><?php _e( 'No posts found on Medium.', 'your-theme-textdomain' ); ?></p>
<?php else : ?>
<div class="medium-posts-list">
<?php foreach ( $medium_items as $item ) : ?>
<div class="medium-post">
<h4 class="medium-title">
<a href="<?php echo esc_url( $item->get_permalink() ); ?>" target="_blank">
<?php echo esc_html( $item->get_title() ); ?>
</a>
</h4>

<div class="medium-date">
<?php echo $item->get_date( 'F j, Y' ); ?>
</div>

<div class="medium-excerpt">
<?php echo wp_trim_words( $item->get_description(), 25, '...' ); ?>
</div>
</div>
<?php endforeach; ?>
</div>

<a href="https://medium.com/@<?php echo esc_attr( $medium_username ); ?>" class="medium-profile-link" target="_blank">
<?php _e( 'View Full Medium Profile', 'your-theme-textdomain' ); ?>
</a>
<?php endif; ?>
</div>
<?php
endif;
endif;
?>

SEO Optimization for Author Pages

Properly optimized author pages can significantly boost your site’s E-E-A-T signals. Here are some key techniques:

Adding Schema.org Markup

Add this function to your functions.php file:

function author_page_schema_markup() {
if ( is_author() ) {
$author = get_queried_object();

// Build the schema array
$schema = array(
'@context' => 'https://schema.org',
'@type' => 'Person',
'name' => $author->display_name,
'description' => $author->description,
);

// Add image if available
$avatar_url = get_avatar_url( $author->ID, array( 'size' => 300 ) );
if ( $avatar_url ) {
$schema['image'] = $avatar_url;
}

// Add social profiles
$social_profiles = array();

$social_fields = array(
'twitter' => 'twitter',
'facebook' => 'facebook',
'linkedin' => 'linkedin',
'instagram' => 'instagram',
'youtube_channel' => 'youtube',
);

foreach ( $social_fields as $field => $network ) {
$url = get_the_author_meta( $field, $author->ID );
if ( $url ) {
$social_profiles[] = $url;
}
}

if ( !empty( $social_profiles ) ) {
$schema['sameAs'] = $social_profiles;
}

// Add job title if available
$job_title = get_the_author_meta( 'job_title', $author->ID );
if ( $job_title ) {
$schema['jobTitle'] = $job_title;
}

// Add organization if available
$organization = get_the_author_meta( 'organization', $author->ID );
if ( $organization ) {
$schema['worksFor'] = array(
'@type' => 'Organization',
'name' => $organization
);
}

// Output the schema
echo '<script type="application/ld+json">' . wp_json_encode( $schema ) . '</script>';
}
}
add_action( 'wp_head', 'author_page_schema_markup' );

Optimizing Meta Titles and Descriptions

Customize meta information for author pages:

function author_page_meta_tags( $title ) {
if ( is_author() ) {
$author = get_queried_object();

// Customize title
$title['title'] = sprintf(
__( 'Articles by %s - Expert %s', 'your-theme-textdomain' ),
$author->display_name,
get_the_author_meta( 'expertise', $author->ID ) ? get_the_author_meta( 'expertise', $author->ID ) : __( 'Writer', 'your-theme-textdomain' )
);
}

return $title;
}
add_filter( 'document_title_parts', 'author_page_meta_tags' );

function author_page_meta_description() {
if ( is_author() ) {
$author = get_queried_object();
$description = get_the_author_meta( 'description', $author->ID );

if ( $description ) {
// Limit to 160 characters
$description = wp_trim_words( $description, 25, '...' );
echo '<meta name="description" content="' . esc_attr( $description ) . '" />';
}
}
}
add_action( 'wp_head', 'author_page_meta_description' );

Adding Canonical URLs

Ensure proper canonical URLs for author pages:

function author_page_canonical_url() {
if ( is_author() ) {
$author_id = get_queried_object_id();
echo '<link rel="canonical" href="' . esc_url( get_author_posts_url( $author_id ) ) . '" />';
}
}
add_action( 'wp_head', 'author_page_canonical_url', 1 );

Performance Considerations for Author Pages

As you add features to your author pages, be mindful of performance impacts:

Implement Lazy Loading for Media

Use WordPress lazy loading for images and embedded content:

function add_lazy_loading_to_author_content( $content ) {
if ( is_author() ) {
// Add loading="lazy" to images
$content = preg_replace( '/<img(.*?)>/', '<img$1 loading="lazy">', $content );

// Add loading="lazy" to iframes
$content = preg_replace( '/<iframe(.*?)>/', '<iframe$1 loading="lazy">', $content );
}

return $content;
}
add_filter( 'the_content', 'add_lazy_loading_to_author_content' );

Optimize Database Queries

Minimize database queries on author pages:

function optimize_author_page_queries( $query ) {
if ( !is_admin() && $query->is_author() && $query->is_main_query() ) {
// Limit fields returned
$query->set( 'fields', 'ids' );

// Only get necessary post data
add_filter( 'posts_fields', 'custom_author_posts_fields' );

// Limit to 10 posts per page for better performance
$query->set( 'posts_per_page', 10 );
}
}
add_action( 'pre_get_posts', 'optimize_author_page_queries' );

function custom_author_posts_fields( $fields ) {
global $wpdb;
return "{$wpdb->posts}.ID, {$wpdb->posts}.post_title, {$wpdb->posts}.post_excerpt, {$wpdb->posts}.post_date, {$wpdb->posts}.post_name";
}

Cache Author Page Elements

Implement caching for resource-intensive elements:

function get_author_statistics( $author_id ) {
// Check for cached data first
$cache_key = 'author_stats_' . $author_id;
$cached_stats = get_transient( $cache_key );

if ( false !== $cached_stats ) {
return $cached_stats;
}

// Calculate statistics
$post_count = count_user_posts( $author_id, 'post', true );
$comment_count = get_comments( array(
'user_id' => $author_id,
'count' => true
) );

// Get total views if you track them
global $wpdb;
$total_views = $wpdb->get_var( $wpdb->prepare(
"SELECT SUM(meta_value) FROM $wpdb->postmeta
WHERE meta_key = 'post_views_count'
AND post_id IN (
SELECT ID FROM $wpdb->posts
WHERE post_author = %d
AND post_status = 'publish'
AND post_type = 'post'
)",
$author_id
) );

$stats = array(
'post_count' => $post_count,
'comment_count' => $comment_count,
'total_views' => $total_views ? $total_views : 0
);

// Cache for 12 hours
set_transient( $cache_key, $stats, 12 * HOUR_IN_SECONDS );

return $stats;
}

// Clear cache when new content is published
function clear_author_stats_cache( $post_id, $post ) {
delete_transient( 'author_stats_' . $post->post_author );
}
add_action( 'save_post', 'clear_author_stats_cache', 10, 2 );

Conclusion: Creating Author Pages That Truly Stand Out

Well-designed author pages are a powerful asset for multi-author WordPress sites. They not only showcase your contributors’ expertise but also enhance your site’s E-E-A-T signals, improve content discovery, and create a more engaging user experience.

By implementing the techniques covered in this guide, you can transform basic WordPress author pages into compelling, informative profiles that benefit both your authors and your readers.

Remember that the best author pages balance information with performance. Start with the essentials—professional bio, headshot, social links, and featured content—then gradually add more advanced features based on your specific needs.

Whether you’re running a news site, a multi-author blog, or an online magazine, investing time in your author pages will pay dividends in terms of user engagement, SEO benefits, and overall site quality.

If you need help implementing these customizations or want a completely custom author page design, consider working with a WordPress expert who specializes in theme customization and development.

By following the techniques in this guide, you’ll create author pages.

Leave a Comment