Displaying Page as Custom Post type landing Page

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();