You can hook in a widget area for content before any type of loop.
You can do this from your functions file using a hook like loop_start and include a conditional tag after the function otherwise you can register the widget in functions and add the template tag directly to a template.
register_sidebar(array(
'name' => __( 'Intro Widget', 'theme_text_domain' ),
'id' => 'intro-widget',
'before_widget' => '<div class=intro-widget">',
'after_widget' => '</div>',
));
add_action( 'loop_start', 'intro_widget' );
function intro_widget() {
if ( is_post_type_archive() && is_active_sidebar( 'intro-widget' ) ) {
dynamic_sidebar('intro-widget', array(
'before' => '<div class="intro-widget">',
'after' => '</div>',
) );
}
}
You might need to change the conditional tag.
If you call the sidebar directly from your template file, you won’t need the hook.
<?php if ( is_post_type_archive() && is_active_sidebar( 'intro-widget' ) ) : ?>
<ul id="sidebar">
<?php dynamic_sidebar( 'intro-widget' ); ?>
</ul>
<?php endif; ?>
Here’s a complete custom post type archive file which includes the widget before the loop.
<?php
/**
* Adds the Full Width Custom Post Type Archive Page
*/
get_header(); ?>
<section id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php if ( is_post_type_archive() && is_active_sidebar( 'intro-widget' ) ) : ?>
<ul id="sidebar">
<?php dynamic_sidebar( 'intro-widget' ); ?>
</ul>
<?php endif; ?>
<?php if ( have_posts() ) : ?>
<header class="archive-header">
<h1 class="archive-title"><?php printf( __( 'Portfolio Archives %s', 'wpsites' ), single_cat_title( '', false ) ); ?></h1>
<?php
// Show an optional term description.
$term_description = term_description();
if ( ! empty( $term_description ) ) :
printf( '<div class="taxonomy-description">%s</div>', $term_description );
endif;
?>
</header><!-- .archive-header -->
<?php
// Start the Loop.
while ( have_posts() ) : the_post();
get_template_part( 'content', get_post_format() );
endwhile;
wpsites_page_nav();
else :
// If no content, include the "No posts found" template.
get_template_part( 'content', 'none' );
endif;
?>
</div><!-- #content -->
</section><!-- #primary -->
<?php
get_footer();