A professional WordPress footer provides valuable content and navigation while maintaining site consistency. Theme Settings Free Version gives you complete control over footer content including branding, menus, latest posts, and copyright information—all without touching code after initial setup.

This tutorial shows you how to build a three-column footer with a bottom copyright section. The footer includes logo/about text, menu selection, category-filtered posts, and customizable copyright—all managed through a clean admin interface.

We’ll build a footer with two distinct sections:

Main Footer (3 Columns):

  • Column 1: Logo, About text, Social icons
  • Column 2: Selected menu display
  • Column 3: Latest posts from selected category

Bottom Section:

  • Centered copyright text

Final Structure:

┌──────────────────────────────────────────────────┐
│ Column 1          Column 2          Column 3     │
│ [Logo]            Menu Links        Recent Posts │
│ About text        • Link 1          • Post Title │
│ [Social Icons]    • Link 2          • Post Title │
│                   • Link 3          • Post Title │
├──────────────────────────────────────────────────┤
│            © 2024 Your Company Name              │
└──────────────────────────────────────────────────┘

This footer is SEO-friendly, widget-free, and fully customizable through Theme Settings.

Step 1: Configure Theme Settings Fields

Add footer configuration fields to your settings-config.php file.

'footer_settings' => [
    'title' => 'Footer Settings',
    'icon'  => 'bi-layout-text-sidebar-reverse',
    'sections' => [
        
        // Column 1: Branding & About
        'footer_branding' => [
            'title'  => 'Footer Branding (Column 1)',
            'desc'   => 'Logo, about text, and social links',
            'fields' => [
                'footer_logo' => [
                    'type'  => 'media',
                    'label' => 'Footer Logo',
                    'desc'  => 'Leave empty to use site title',
                ],
                'footer_about' => [
                    'type'        => 'textarea',
                    'label'       => 'About Text',
                    'placeholder' => 'Brief description about your company...',
                    'rows'        => 4,
                    'desc'        => 'Short description displayed in footer',
                ],
                'footer_facebook' => [
                    'type'        => 'url',
                    'label'       => 'Facebook URL',
                    'placeholder' => 'https://facebook.com/yourpage',
                ],
                'footer_twitter' => [
                    'type'        => 'url',
                    'label'       => 'Twitter URL',
                    'placeholder' => 'https://twitter.com/yourhandle',
                ],
                'footer_instagram' => [
                    'type'        => 'url',
                    'label'       => 'Instagram URL',
                    'placeholder' => 'https://instagram.com/yourprofile',
                ],
                'footer_linkedin' => [
                    'type'        => 'url',
                    'label'       => 'LinkedIn URL',
                    'placeholder' => 'https://linkedin.com/company/yourcompany',
                ],
            ],
        ],
        
        // Column 2: Menu Selection
        'footer_menu' => [
            'title'  => 'Footer Menu (Column 2)',
            'desc'   => 'Select which menu to display in footer',
            'fields' => [
                'footer_menu_select' => [
                    'type'        => 'menu_select',
                    'label'       => 'Select Footer Menu',
                    'placeholder' => 'Choose a menu...',
                    'desc'        => 'Select registered menu to display',
                ],
                'footer_menu_title' => [
                    'type'        => 'text',
                    'label'       => 'Menu Column Title',
                    'default'     => 'Quick Links',
                    'placeholder' => 'Quick Links',
                ],
            ],
        ],
        
        // Column 3: Latest Posts
        'footer_posts' => [
            'title'  => 'Latest Posts (Column 3)',
            'desc'   => 'Display recent posts from selected category',
            'fields' => [
                'footer_posts_category' => [
                    'type'        => 'category_select',
                    'label'       => 'Select Category',
                    'placeholder' => 'All Categories',
                    'desc'        => 'Choose category for latest posts',
                ],
                'footer_posts_count' => [
                    'type'    => 'number',
                    'label'   => 'Number of Posts',
                    'default' => 3,
                    'min'     => 1,
                    'max'     => 10,
                ],
                'footer_posts_title' => [
                    'type'        => 'text',
                    'label'       => 'Posts Column Title',
                    'default'     => 'Latest Posts',
                    'placeholder' => 'Latest Posts',
                ],
            ],
        ],
        
        // Copyright Section
        'copyright' => [
            'title'  => 'Copyright Section',
            'desc'   => 'Bottom footer copyright text',
            'fields' => [
                'copyright_text' => [
                    'type'        => 'text',
                    'label'       => 'Copyright Text',
                    'default'     => '© 2024 Your Company. All rights reserved.',
                    'placeholder' => '© 2024 Your Company. All rights reserved.',
                ],
            ],
        ],
        
    ],
],

What These Fields Do:

  • footer_logo - Optional logo for footer
  • footer_about - About text description
  • social_links - 4 social media URLs
  • footer_menu_select - Choose which menu to display
  • footer_posts_category - Select category for posts
  • footer_posts_count - How many posts to show
  • copyright_text - Customizable copyright message

Create or edit your footer.php file with the three-column structure.

<?php
/**
 * Footer template
 */
?>

    </div><!-- #page -->

    <footer class="site-footer">
        
        <!-- Main Footer (3 Columns) -->
        <?php get_template_part('template-parts/footer/footer-main'); ?>
        
        <!-- Bottom/Copyright Section -->
        <?php get_template_part('template-parts/footer/footer-bottom'); ?>
        
    </footer>

    <?php wp_footer(); ?>
</body>
</html>

Create template-parts/footer/footer-main.php:

<?php
/**
 * Template part: Footer Main
 * Three-column footer layout
 */
?>

<div class="footer-main">
    <div class="container">
        <div class="footer-columns">
            
            <!-- Column 1: Branding & About -->
            <div class="footer-column footer-column-1">
                <?php
                // Logo or Site Title
                $footer_logo = ts_get_option('footer_logo');
                $site_name = get_bloginfo('name');
                
                if ($footer_logo) :
                ?>
                    <div class="footer-logo">
                        <img src="<?php echo esc_url($footer_logo); ?>" 
                             alt="<?php echo esc_attr($site_name); ?>"
                             width="150">
                    </div>
                <?php else : ?>
                    <div class="footer-title">
                        <h3><?php echo esc_html($site_name); ?></h3>
                    </div>
                <?php endif; ?>
                
                <!-- About Text -->
                <?php
                $about_text = ts_get_option('footer_about');
                if ($about_text) :
                ?>
                    <div class="footer-about">
                        <p><?php echo esc_html($about_text); ?></p>
                    </div>
                <?php endif; ?>
                
                <!-- Social Icons -->
                <?php
                $facebook = ts_get_option('footer_facebook');
                $twitter = ts_get_option('footer_twitter');
                $instagram = ts_get_option('footer_instagram');
                $linkedin = ts_get_option('footer_linkedin');
                
                if ($facebook || $twitter || $instagram || $linkedin) :
                ?>
                    <div class="footer-social">
                        <?php if ($facebook) : ?>
                            <a href="<?php echo esc_url($facebook); ?>" 
                               target="_blank" 
                               rel="noopener noreferrer"
                               aria-label="Facebook">
                                <i class="bi bi-facebook"></i>
                            </a>
                        <?php endif; ?>
                        
                        <?php if ($twitter) : ?>
                            <a href="<?php echo esc_url($twitter); ?>" 
                               target="_blank" 
                               rel="noopener noreferrer"
                               aria-label="Twitter">
                                <i class="bi bi-twitter"></i>
                            </a>
                        <?php endif; ?>
                        
                        <?php if ($instagram) : ?>
                            <a href="<?php echo esc_url($instagram); ?>" 
                               target="_blank" 
                               rel="noopener noreferrer"
                               aria-label="Instagram">
                                <i class="bi bi-instagram"></i>
                            </a>
                        <?php endif; ?>
                        
                        <?php if ($linkedin) : ?>
                            <a href="<?php echo esc_url($linkedin); ?>" 
                               target="_blank" 
                               rel="noopener noreferrer"
                               aria-label="LinkedIn">
                                <i class="bi bi-linkedin"></i>
                            </a>
                        <?php endif; ?>
                    </div>
                <?php endif; ?>
            </div>
            
            <!-- Column 2: Menu -->
            <div class="footer-column footer-column-2">
                <?php
                $menu_title = ts_get_option('footer_menu_title', 'Quick Links');
                $selected_menu = ts_get_option('footer_menu_select');
                
                if ($menu_title) :
                ?>
                    <h3 class="footer-column-title"><?php echo esc_html($menu_title); ?></h3>
                <?php endif; ?>
                
                <?php
                if ($selected_menu) :
                    wp_nav_menu([
                        'menu'           => $selected_menu,
                        'container'      => 'nav',
                        'container_class' => 'footer-menu',
                        'menu_class'     => 'footer-menu-list',
                        'fallback_cb'    => false,
                        'depth'          => 1,
                    ]);
                endif;
                ?>
            </div>
            
            <!-- Column 3: Latest Posts -->
            <div class="footer-column footer-column-3">
                <?php
                $posts_title = ts_get_option('footer_posts_title', 'Latest Posts');
                $posts_category = ts_get_option('footer_posts_category');
                $posts_count = ts_get_option('footer_posts_count', 3);
                
                if ($posts_title) :
                ?>
                    <h3 class="footer-column-title"><?php echo esc_html($posts_title); ?></h3>
                <?php endif; ?>
                
                <?php
                // Query latest posts
                $args = [
                    'posts_per_page' => $posts_count,
                    'post_status'    => 'publish',
                    'no_found_rows'  => true,
                ];
                
                // Add category filter if selected
                if ($posts_category) {
                    $args['cat'] = $posts_category;
                }
                
                $footer_posts = new WP_Query($args);
                
                if ($footer_posts->have_posts()) :
                ?>
                    <div class="footer-posts">
                        <?php while ($footer_posts->have_posts()) : $footer_posts->the_post(); ?>
                            <article class="footer-post-item">
                                <?php if (has_post_thumbnail()) : ?>
                                    <div class="footer-post-thumbnail">
                                        <a href="<?php the_permalink(); ?>">
                                            <?php the_post_thumbnail('thumbnail'); ?>
                                        </a>
                                    </div>
                                <?php endif; ?>
                                
                                <div class="footer-post-content">
                                    <h4 class="footer-post-title">
                                        <a href="<?php the_permalink(); ?>">
                                            <?php the_title(); ?>
                                        </a>
                                    </h4>
                                    <time class="footer-post-date" datetime="<?php echo get_the_date('c'); ?>">
                                        <i class="bi bi-calendar"></i>
                                        <?php echo get_the_date(); ?>
                                    </time>
                                </div>
                            </article>
                        <?php endwhile; ?>
                    </div>
                <?php
                    wp_reset_postdata();
                endif;
                ?>
            </div>
            
        </div>
    </div>
</div>

Key Features:

  • Column 1 - Logo fallback to site title, about text, conditional social icons
  • Column 2 - Dynamic menu from admin selection
  • Column 3 - Category-filtered posts with thumbnail and date
  • Semantic HTML - Proper article, nav, time tags
  • Accessibility - ARIA labels, proper links
  • Performance - no_found_rows for faster queries

Create template-parts/footer/footer-bottom.php:

<?php
/**
 * Template part: Footer Bottom
 * Copyright section
 */

$copyright = ts_get_option('copyright_text', '© ' . date('Y') . ' ' . get_bloginfo('name') . '. All rights reserved.');
?>

<div class="footer-bottom">
    <div class="container">
        <div class="footer-copyright">
            <p><?php echo esc_html($copyright); ?></p>
        </div>
    </div>
</div>

Features:

  • Dynamic year - Uses current year if not specified
  • Site name fallback - Uses bloginfo if not set
  • Simple markup - Clean, centered text

Add menu registration to your functions.php:

/**
 * Register navigation menus
 */
function mytheme_register_menus() {
    register_nav_menus([
        'primary' => __('Primary Menu', 'mytheme'),
        'footer'  => __('Footer Menu', 'mytheme'),
    ]);
}
add_action('after_setup_theme', 'mytheme_register_menus');

Then create a footer menu:

  1. Go to Appearance → Menus
  2. Create a new menu named “Footer Menu”
  3. Add your pages/links
  4. Assign to “Footer Menu” location
  5. The menu will now appear in Theme Settings menu selector

Step 4: Enable Post Thumbnails

Ensure thumbnails are enabled for footer posts display:

/**
 * Add theme support for post thumbnails
 */
function mytheme_theme_support() {
    add_theme_support('post-thumbnails');
    
    // Add custom image size for footer posts
    add_image_size('footer-post-thumbnail', 80, 80, true);
}
add_action('after_setup_theme', 'mytheme_theme_support');

Use in footer template:

<?php the_post_thumbnail('footer-post-thumbnail'); ?>

Step 5: Admin Configuration Guide

For End Users - How to Configure:

  1. Go to WordPress Admin → Theme Settings
  2. Click Footer Settings tab
  3. Navigate to Footer Branding section
  4. Upload Footer Logo (optional):
    • Click “Upload Logo”
    • Choose from Media Library or upload new
    • Recommended size: 150x50px
  5. Add About Text:
    • Enter brief company description
    • Keep it under 150 characters for best display
  6. Add Social Media Links:
    • Enter full URLs for each platform
    • Leave blank for platforms you don’t use
  7. Click Save Changes
  1. In Footer Settings tab
  2. Go to Footer Menu section
  3. Select Footer Menu:
    • Choose from dropdown (shows registered menus)
    • Menu must be created first in Appearance → Menus
  4. Set Menu Title:
    • Default: “Quick Links”
    • Customize as needed
  5. Click Save Changes

Setting Up Latest Posts (Column 3)

  1. In Footer Settings tab
  2. Go to Latest Posts section
  3. Select Category (optional):
    • Choose specific category
    • Leave empty to show all posts
  4. Set Number of Posts:
    • Default: 3 posts
    • Range: 1-10 posts
  5. Set Column Title:
    • Default: “Latest Posts”
    • Customize as needed
  6. Click Save Changes
  1. In Footer Settings tab
  2. Go to Copyright Section
  3. Enter Copyright Text:
    • Example: © 2024 Your Company. All rights reserved.
    • Use {year} for auto-update (if implemented)
    • Use {sitename} for site name (if implemented)
  4. Click Save Changes

Complete Example Output

When properly configured, your footer will output clean HTML like this:

<footer class="site-footer">
    
    <!-- Main Footer -->
    <div class="footer-main">
        <div class="container">
            <div class="footer-columns">
                
                <!-- Column 1 -->
                <div class="footer-column footer-column-1">
                    <div class="footer-logo">
                        <img src="logo.png" alt="Site Name" width="150">
                    </div>
                    <div class="footer-about">
                        <p>We create amazing WordPress themes...</p>
                    </div>
                    <div class="footer-social">
                        <a href="https://facebook.com/page"><i class="bi bi-facebook"></i></a>
                        <a href="https://twitter.com/handle"><i class="bi bi-twitter"></i></a>
                    </div>
                </div>
                
                <!-- Column 2 -->
                <div class="footer-column footer-column-2">
                    <h3>Quick Links</h3>
                    <nav class="footer-menu">
                        <ul>
                            <li><a href="/about">About</a></li>
                            <li><a href="/services">Services</a></li>
                            <li><a href="/contact">Contact</a></li>
                        </ul>
                    </nav>
                </div>
                
                <!-- Column 3 -->
                <div class="footer-column footer-column-3">
                    <h3>Latest Posts</h3>
                    <div class="footer-posts">
                        <article class="footer-post-item">
                            <div class="footer-post-thumbnail">
                                <img src="thumb.jpg" alt="Post">
                            </div>
                            <div class="footer-post-content">
                                <h4><a href="/post">Post Title</a></h4>
                                <time>January 15, 2024</time>
                            </div>
                        </article>
                        <!-- More posts... -->
                    </div>
                </div>
                
            </div>
        </div>
    </div>
    
    <!-- Bottom Section -->
    <div class="footer-bottom">
        <div class="container">
            <div class="footer-copyright">
                <p>© 2024 Your Company. All rights reserved.</p>
            </div>
        </div>
    </div>
    
</footer>

Template Hierarchy Best Practices

Organize footer components properly:

your-theme/
├── footer.php                          (main footer file)
├── template-parts/
│   └── footer/
│       ├── footer-main.php            (3-column footer)
│       └── footer-bottom.php          (copyright section)
└── themesettings/
    └── settings-config.php            (field configuration)

Benefits:

  • Modular - Each section isolated
  • Maintainable - Easy to update
  • Reusable - Can use parts elsewhere
  • Clean code - Better organization

Advanced Features (Optional)

Update copyright text to support dynamic year:

// functions.php
function mytheme_process_copyright_shortcodes($text) {
    $text = str_replace('{year}', date('Y'), $text);
    $text = str_replace('{sitename}', get_bloginfo('name'), $text);
    return $text;
}

// footer-bottom.php
$copyright = ts_get_option('copyright_text', '© {year} {sitename}. All rights reserved.');
$copyright = mytheme_process_copyright_shortcodes($copyright);
echo esc_html($copyright);

Users can now use:

  • {year} → Current year (2024)
  • {sitename} → Site name

Post Excerpt in Footer

Add excerpt to footer posts:

// In footer-main.php, inside the loop
<div class="footer-post-excerpt">
    <?php echo wp_trim_words(get_the_excerpt(), 12, '...'); ?>
</div>

Footer Post Categories

Display post category in footer:

// In footer-main.php
<div class="footer-post-meta">
    <?php
    $categories = get_the_category();
    if (!empty($categories)) :
    ?>
        <span class="footer-post-category">
            <i class="bi bi-folder"></i>
            <?php echo esc_html($categories[0]->name); ?>
        </span>
    <?php endif; ?>
</div>

Troubleshooting Common Issues

IssueCauseSolution
Logo not showingWrong media IDRe-upload logo in Theme Settings
Menu not displayingMenu not selectedChoose menu in Footer Menu section
Posts not showingNo posts in categoryCheck category has published posts
Social icons missingBootstrap Icons not loadedVerify icons CSS enqueued
Copyright emptyNo text enteredAdd default in settings config
Thumbnail missingThumbnails not enabledAdd theme support in functions.php

Implementation Checklist

Theme Settings Configuration:

  • ✅ Add footer fields to settings-config.php
  • ✅ Configure branding fields (logo, about, social)
  • ✅ Add menu selector field
  • ✅ Configure posts settings (category, count)
  • ✅ Add copyright text field

Template Files:

  • ✅ Update footer.php main structure
  • ✅ Create footer-main.php (3 columns)
  • ✅ Create footer-bottom.php (copyright)
  • ✅ Register footer menu location
  • ✅ Enable post thumbnails support

Admin Setup:

  • ✅ Upload footer logo (optional)
  • ✅ Enter about text
  • ✅ Add social media URLs
  • ✅ Create and assign footer menu
  • ✅ Select post category (optional)
  • ✅ Enter copyright text

Testing:

  • ✅ Verify all 3 columns display
  • ✅ Check logo/title fallback works
  • ✅ Test social links open correctly
  • ✅ Confirm menu displays selected items
  • ✅ Verify posts from correct category
  • ✅ Check copyright text centered
  • ✅ Test with no settings (defaults)

Performance Optimization

Query Optimization:

// In footer-main.php
$args = [
    'posts_per_page' => $posts_count,
    'post_status'    => 'publish',
    'no_found_rows'  => true,        // Faster query
    'update_post_meta_cache' => false, // Don't load meta
    'update_post_term_cache' => false, // Don't load terms
];

Cache Footer Content:

// functions.php
function mytheme_get_footer_posts($category, $count) {
    $cache_key = 'footer_posts_' . $category . '_' . $count;
    $posts = get_transient($cache_key);
    
    if (false === $posts) {
        // Query posts...
        set_transient($cache_key, $posts, HOUR_IN_SECONDS);
    }
    
    return $posts;
}

Conclusion

With Theme Settings Free Version, building a professional three-column WordPress footer is straightforward and fully customizable. Users can manage branding, menus, content, and copyright text through an intuitive admin interface.

What You’ve Achieved:

  • ✅ Three-column footer layout
  • ✅ Dynamic logo and about section
  • ✅ Flexible menu selection
  • ✅ Category-filtered latest posts
  • ✅ Customizable copyright
  • ✅ Social media integration
  • ✅ Clean, semantic HTML
  • ✅ User-friendly admin controls

This footer structure is scalable, SEO-friendly, and fully manageable without code. Users update content through Theme Settings, and changes appear instantly on the frontend.

“A great footer completes the user experience—
make it functional, informative, and easy to manage.”


Next Steps:

  • Add basic CSS for layout and styling
  • Implement responsive column stacking
  • Add widget areas for more flexibility
  • Create footer variations for different pages
  • Explore Theme Settings Pro for repeater-based widgets