Pass shortcode variables to template

You can’t just stick a shortcode somewhere and expect it to do something. It’s basically an buffer that will take whatever code it’s told to generate, compile it exactly how you tell it to, and then output it wherever the shortcode is placed.

Take a look at the Shortcode API for more information.

As for your specific example, you don’t actually have anything in your shortcode that says “do something with posts 358 and 328″.

You’ll need to make use of something like WP_Query() or get_posts() inside your shortcode. You may also consider using a more unique name for your function and shortcode than post_link_shortcode and featured_posts to avoid naming conflicts.

Take this for example:

add_shortcode( 'stickers_featured_posts', 'stickers_featured_posts_function');
function stickers_featured_posts_function( $atts ){
    extract( shortcode_atts( array(
        'ids'   => '',
    ), $atts ) );

    // Remove whitespace from IDs
    // ex: '123, 321' => '123,321'
    $ids = preg_replace('/\s+/', '', $ids);

    // Turn string of ID's into array
    // ex: '123,321' => array(123, 321);
    $id_array = explode( ',', $ids );

    $args = array(
        'post__in' => $id_array
    );

    $featured_query = new WP_Query( $args );
    if( $featured_query->have_posts() ){
        echo '<ul>';
        while( $featured_query->have_posts() ){
            $featured_query->the_post();
            echo '<li>' . get_the_title() . '</li>';
        }
        echo '</ul>';
        wp_reset_postdata();
    } else {
        echo 'Post IDs not found';
    }
}

And the usage would be like [stickers_featured_posts ids="123,321"] – The final output would be whatever you put in the while loop, in the case about – a simple list of post titles.