Create a Custom Archive Page Programmatically

p align=”justify”>If you go through the list of default page types in WordPress, you will realize that you hardly use the archive page. It is not popular as it does not offer user friendliness. Did you know you could customize the archive page programmatically? Let’s see how it’s done. But, before getting started with the customization, let’s try and understand the archive page.

The Default Archive Page

Here is a directory of all the default pages that come with your WordPress theme

  • 404 error page
  • Archive page
  • Image attachment page
  • Index page
  • Default page template
  • Search result page
  • Single post and attachment page

All the pages that have been listed as part of this default directory have the same ensemble structure that offers no creativity to the users. Header at the top can be attributed as the only difference between the index and archive page. The archive page offers a classic archive of all the posts, but is just an extension of the index page as far as intuitiveness and structure is concerned. As of now, the only way to introduce archives to your website is by including the widgets. This simply means eating up into the space of your website. If you want to avoid that, you can add the archive page using code.

Creating the Archive Page: Getting Started

The custom archive page that you will be creating here will include a custom welcome message. It will also include a configurable list of the posts (15 being the default number) along with author and monthly archives. The whole page will be responsive and will change itself to match the theme being used. The whole custom archive page will base itself on the custom page template. So, let’s begin!

You can start creating the custom archive page using the page.php file in your theme folder. This file is optimized in order to display custom content, and it has a simple yet intuitive structure.

You will need to call the tmpl_archives.php to get started with programmatically creating the archive page.

Now, replace

<?php get_template_part( ‘content’, ‘page’ ); ?>

With

<?php get_template_part( ‘content’, ‘tmpl_archives’ ); ?>

With this, the content file that needs to be archived will be fetched

You will need to keep the HTML contents that are responsible for the archive in the file.

You have a default custom template declaration comment. Replace it with

<?php

/* Template Name: Archive Page Custom */

?>

This is the file structure that you get at the end of all the replacements

<?php

/* Template Name: Archive Page Custom */

get_header(); ?>

<div class=”clear”></div>

</header> <!– / END HOME SECTION –>

<div id=”content” class=”site-content”>

<div class=”container”>

<div class=”content-left-wrap col-md-9″>

<div id=”primary” class=”content-area”>

<main id=”main” class=”site-main” role=”main”>

<?php while ( have_posts() ) : the_post(); // standard WordPress loop. ?>

<?php get_template_part( ‘content’, ‘tmpl_archives’ ); // loading our custom file. ?>

<?php endwhile; // end of the loop. ?>

</main><!– #main –>

</div><!– #primary –>

</div>

<div class=”sidebar-wrap col-md-3 content-left-wrap”>

<?php get_sidebar(); ?>

</div>

</div><!– .container –>

<?php get_footer();

You will now need to create the custom content file. Use the content-page.php, make a copy and rename it to content-tmpl_archives.php. Now, keep only the elements that are required to form the structure.

<?php

/**

* The template used to display archive content

*/

?>

<article id=”post-<?php the_ID(); ?>” <?php post_class(); ?>>

<header class=”entry-header”>

<h1 class=”entry-title”><?php the_title(); ?></h1>

</header><!– .entry-header –>

<div class=”entry-content”>

<?php the_content(); ?>

<!– THIS IS WHERE THE FUN PART GOES –>

</div><!– .entry-content –>

</article><!– #post-## –>

The Custom Welcome Message

It’s time to add the custom welcome message to your archive’s page

<?php the_content(); ?>

With this single line code, your job’s done!

Adding Widget Areas

You can create a new widget area using the standard process. Create a new file archives-page-functions.php, and place it within the theme’s main directory. You can register the new widget areas here.

if(!function_exists(‘archives_page_widgets_init’)) :

function archives_page_widgets_init() {

/* First archive page widget, displayed to the LEFT. */

register_sidebar(array(

‘name’ => __(‘Archives page widget LEFT’, ‘zerif-lite’),

‘description’ => __(‘This widget will be shown on the left side of your archive page.’, ‘zerif-lite’),

‘id’ => ‘archives-left’,

‘before_widget’ => ‘<div class=”archives-widget-left”>’,

‘after_widget’ => ‘</div>’,

‘before_title’ => ‘<h1 class=”widget-title”>’,

‘after_title’ => ‘</h1>’,

));

/* Second archive page widget, displayed to the RIGHT. */

register_sidebar(array(

‘name’ => __(‘Archives page widget RIGHT’, ‘zerif-lite’),

‘description’ => __(‘This widget will be shown on the right side of your archive page.’, ‘zerif-lite’),

‘id’ => ‘archives-right’,

‘before_widget’ => ‘<div class=”archives-widget-right”>’,

‘after_widget’ => ‘</div>’,

‘before_title’ => ‘<h1 class=”widget-title”>’,

‘after_title’ => ‘</h1>’,

));

}

endif;

add_action(‘widgets_init’, ‘archives_page_widgets_init’);

You will need to style the CSS page. Here is a stylesheet that you can incorporate into the theme folder

if(!function_exists(‘archives_page_styles’)) :

function archives_page_styles() {

if(is_page_template(‘tmpl_archives.php’)) {

wp_enqueue_style(‘archives-page-style’, get_template_directory_uri() . ‘/archives-page-style.css’); // standard way of adding style sheets in WP.

}

}

endif;

add_action(‘wp_enqueue_scripts’, ‘archives_page_styles’);

You will need to activate the archives-page-functions.php file. Add the following code at the end of functions.php file

require get_template_directory() . ‘/archives-page-functions.php’;

To call the content, you will need to place the following content in the content-tmpl_archives.php file

<?php /* Enabling the widget areas for the archive page. */ ?>

<?php if(is_active_sidebar(‘archives-left’)) dynamic_sidebar(‘archives-left’); ?>

<?php if(is_active_sidebar(‘archives-right’)) dynamic_sidebar(‘archives-right’); ?>

<div style=”clear: both; margin-bottom: 30px;”></div><!– clears the floating –>

Listing the Posts

You will need to list the 15 posts. You can easily achieve this by using the necessary widgets, but let’s try and perform some coding to achieve this. Using the archived-posts-no custom field, you can set the number of posts. Always keep the default number at 15

Add the below code to content-tmpl_archives.php file

<?php

$how_many_last_posts = intval(get_post_meta($post->ID, ‘archived-posts-no’, true));

/* Here, we’re making sure that the number fetched is reasonable. In case it’s higher than 200 or lower than 2, we’re just resetting it to the default value of 15. */

if($how_many_last_posts > 200 || $how_many_last_posts < 2) $how_many_last_posts = 15;

$my_query = new WP_Query(‘post_type=post&nopaging=1’);

if($my_query->have_posts()) {

echo ‘<h1 class=”widget-title”>Last ‘.$how_many_last_posts.’ Posts <i class=”fa fa-bullhorn” style=”vertical-align: baseline;”></i></h1> ‘;

echo ‘<div class=”archives-latest-section”><ol>’;

$counter = 1;

while($my_query->have_posts() && $counter <= $how_many_last_posts) {

$my_query->the_post();

?>

<li><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”Permanent Link to <?php the_title_attribute(); ?>”><?php the_title(); ?></a></li>

<?php

$counter++;

}

echo ‘</ol></div>’;

wp_reset_postdata();

}

?>

Linking to Author Archives and Monthly Archives

Following code will help achieve link to author archives

<h1 class=”widget-title”>Our Authors <i class=”fa fa-user” style=”vertical-align: baseline;”></i></h1>

<div class=”archives-authors-section”>

<ul>

<?php wp_list_authors(‘exclude_admin=0&optioncount=1’); ?>

</ul>

</div>

Following code will help achieve link to monthly archives

<h1 class=”widget-title”>By Month <i class=”fa fa-calendar” style=”vertical-align: baseline;”></i></h1>

<div class=”archives-by-month-section”>

<p><?php wp_get_archives(‘type=monthly&format=custom&after= |’); ?></p>

</div>

Archive Page Template

The custom archive will be displayed using the archive page template. Here’s how the structure of that template looks

<?php

/**

* The template used to display archive content

*/

?>

<article id=”post-<?php the_ID(); ?>” <?php post_class(); ?>>

<header class=”entry-header”>

<h1 class=”entry-title”><?php the_title(); ?></h1>

</header><!– .entry-header –>

<div class=”entry-content”>

<?php the_content(); ?>

<?php if(is_active_sidebar(‘archives-left’)) dynamic_sidebar(‘archives-left’); ?>

<?php if(is_active_sidebar(‘archives-right’)) dynamic_sidebar(‘archives-right’); ?>

<div style=”clear: both; margin-bottom: 30px;”></div><!– clears the floating –>

<?php

$how_many_last_posts = intval(get_post_meta($post->ID, ‘archived-posts-no’, true));

if($how_many_last_posts > 200 || $how_many_last_posts < 2) $how_many_last_posts = 15;

$my_query = new WP_Query(‘post_type=post&nopaging=1’);

if($my_query->have_posts()) {

echo ‘<h1 class=”widget-title”>Last ‘.$how_many_last_posts.’ Posts <i class=”fa fa-bullhorn” style=”vertical-align: baseline;”></i></h1> ‘;

echo ‘<div class=”archives-latest-section”><ol>’;

$counter = 1;

while($my_query->have_posts() && $counter <= $how_many_last_posts) {

$my_query->the_post();

?>

<li><a href=”<?php the_permalink() ?>” rel=”bookmark” title=”Permanent Link to <?php the_title_attribute(); ?>”><?php the_title(); ?></a></li>

<?php

$counter++;

}

echo ‘</ol></div>’;

wp_reset_postdata();

}

?>

<h1 class=”widget-title”>Our Authors <i class=”fa fa-user” style=”vertical-align: baseline;”></i></h1>

<div class=”archives-authors-section”>

<ul>

<?php wp_list_authors(‘exclude_admin=0&optioncount=1’); ?>

</ul>

</div>

<h1 class=”widget-title”>By Month <i class=”fa fa-calendar” style=”vertical-align: baseline;”></i></h1>

<div class=”archives-by-month-section”>

<p><?php wp_get_archives(‘type=monthly&format=custom&after= |’); ?></p>

</div>

</div><!– .entry-content –>

</article><!– #post-## –>

Coding the Style Sheet

The style sheet is an important part of your custom archive page design. Here’s how the stylesheet would appear

.archives-widget-left {

float: left;

width: 50%;

}

.archives-widget-right {

float: left;

padding-left: 4%;

width: 46%;

}

.archives-latest-section { }

.archives-latest-section ol {

font-style: italic;

font-size: 20px;

padding: 10px 0;

}

.archives-latest-section ol li {

padding-left: 8px;

}

.archives-authors-section { }

.archives-authors-section ul {

list-style: none;

text-align: center;

border-top: 1px dotted #888;

border-bottom: 1px dotted #888;

padding: 10px 0;

font-size: 20px;

margin: 0 0 20px 0;

}

.archives-authors-section ul li {

display: inline;

padding: 0 10px;

}

.archives-authors-section ul li a {

text-decoration:none;

}

.archives-by-month-section {

ext-align: center;

word-spacing: 5px;

}

.archives-by-month-section p {

border-top: 1px dotted #888;

border-bottom: 1px dotted #888;

padding: 15px 0;

}

.archives-by-month-section p a {

text-decoration:none;

}

@media only screen and (max-width: 600px) {

.archives-widget-left {

width: 100%;

}

.archives-widget-right {

width: 100%;

}

}

The code mostly involves all typography related elements, maintaining distance from the structural elements.

Integrating into a Theme

Let’s say you decide to change the theme for your WordPress website. In that case, you will need to integrate the custom archive page also. Here’s how you can achieve this task.

You will need to copy the archives-page-style.css and archives-page-functions.php files that you created and paste it to the theme’s main directory. Add the line require get_template_directory() . ‘/archives-page-functions.php’; at the end of the functions.php file in your theme folder

Now, you will need to copy page.php, rename it, modify the get_template_part() function call by replacing it with get_template_part( ‘content’, ‘tmpl_archives’ ); Finally, add the main declaration comment at the beginning /* Template Name: Archive Page Custom */. Finally, you will need to use the content-page.php file within the theme, create a copy, rename the copy to content-tmpl_archives.php and paste the custom blocks you have just created below the_content(); function.

Once you have performed all these tasks, you are ready to get started with the custom archive page on a new theme. You can always integrate your custom archive page to the new themes.

Deepa is a passionate blogger associated with Semaphore Software. A leading Offshore WordPress development India. She loves sharing information regarding WordPress tips & tricks. If you are looking for Hire WordPress Programmers then just get in touch with her.

About deeparanganathan