I have two custom post types (Authors and Partners). I display their archive page’s in the main navigation and use archive-authors.php and archive-partners.php to make a couple small tweaks to the display of posts in each.
Now, my client would like to display some text before the archive’s post listing. So far I can think of the following ways to do that:
- Save the text as the post type’s description and display that.
- Create a separate page and hard code a custom
WP_Query()
loop for just that page (by ID) above the archive.
- Write a custom loop with
WP_Query()
to produce the CPT archive for each CPT and setup “Author Archive” and “Partner Archive” templates that can be used on static, editable pages.
However, all of these solutions seem suboptimal for one or more of the following reasons:
- They require technical knowledge to update (#1, #2)
- It’s not abstracted (e.g. the solution has to be custom-coded for each archive) (#2, #3)
- Updating the text requires technical knowledge (#1)
- The solution essentially duplicates the template hierarchy (#3).
I’m looking for a solution that’s WordPress friendly, abstracted, and easy-to-update for the client.
One of the easiest (although not the only) of ways to achieve this is by creating a custom options panel in the WP dashboard that will allow your client to create and update information that can be used through out your template files with no technical knowledge being necessary.
You can either paste the following directly into your functions.php file or you can save it in a file i.e. config-menu.php (within your theme directory) and then include it into your functions.php file – the choice is yours however the code is;
// create config menu in dashboard
add_action('admin_menu', 'config_menu');
function config_menu() {
//create a menu in the dashboard
add_menu_page('Website Custom Settings',
'Configure Site',
'administrator',
__FILE__,
'custom_settings_page',
''.get_bloginfo('template_directory').'/images/your_icon.png', 4);
}
//register settings
add_action( 'admin_init', 'register_settings' );
function register_settings() {
register_setting( 'my-settings-group', 'partners');
register_setting( 'my-settings-group', 'authors');
}
function my_settings_page() {
?>
<div class="wrap">
<form method="post" action="options.php">
<?php settings_fields('my-settings-group'); ?>
Enter your Partner description here <br/>
<textarea name="partners"><?php echo get_option('partners');?></textarea>
<br />
Enter your Author description here <br/>
<textarea name="authors"><?php echo get_option('authors');?></textarea>
<input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
</form>
</div>
<?php } ?>
Then in your archive template files for each post type you can do the following;
<?php echo wpautop(get_option('partners');?>
and
<?php echo wpautop(get_option('authorss');?>
This will call the respective values (text entered) into the textarea fields you have created in the dashboard area for the client.
NOTE: The example code above is very rudementary and its stripped down to provide you a basic example. No CSS styling provided which I’ll leave up to you. But this will get the job done.