This is an answer that depending on how you ultimately configure things – should get you where you want to go.
In your question, you had posts_per_page
as 1. If you only want 1 result, then that’s fine. If not… modify as shown.
You also didn’t initialize the concatenated string $return_string
and finally you put the reset after the return, so it had no effect.
function display_casestudy( $atts ) {
$handlearray = shortcode_atts(
array(
'tag' => '',
),
$atts
);
$cstag = sanitize_text_field( $handlearray['tag'] );
$args = array(
'post_type' => 'case_studies',
'posts_per_page' => -1, // Putting -1 allows all results.
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'post_tag', // Use Your Taxonomy Type Here.
'terms' => $cstag,
'field' => 'slug', // This depends on how your're passing it in the $cstag.
),
),
);
$query = new WP_Query( $args );
$return_string = '';
// The Loop.
while ( $query->have_posts() ) :
$query->the_post();
$return_string .= '<li><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></li>';
endwhile;
wp_reset_postdata(); // Put before Return otherwise it does nothing.
return '<ul>' . $return_string . '</ul>';
}