Shortcode with WP_Query more than once on one page

There’s so much going on it the code in your question that it’s hard to follow. Plus, you don’t say what happens when you use the shortcode more than once in a given page/post).

Thus, I can’t be sure, but I think the problem is that you need to call:

wp_reset_postdata () ;

at the end of your shortcode function, since your shortcode results in a Nested Loop.

Edit: with new solution

The problem is the:

include_once( ODWPDP_PATH . '/templates/shortcode-1.phtml' );

That file is, as the PHP func name implies, is only included the first time your odwpdp_add_shortcode_1() shortcode function is call…and since that file is what produces your output you get no output for other than the 1st use of your shortcode.

Thus, what you need to do is the following:

in shortcode-1.phtml

wrap the func def for print_order() is a !function_exists(), as in:

if (!function_exists ('print_order')) :
    function
    print_order ($url, $atrs, $cur)
    {
       // existing code for body of print_order()
    }
endif;

<!-- existing markup here -->

in file that defines odwpdp_add_shortcode_1()

change

include_once( ODWPDP_PATH . '/templates/shortcode-1.phtml' );

to

include ( ODWPDP_PATH . '/templates/shortcode-1.phtml' );

and you should be golden.

Hope this helps.