I'd recommend using the `template_include` filter as opposed to `template_redirect`, as using this hook means that you don't redirect the user but rather just present them with the template that is requierd.

    add_filter('template_include', 'my_custom_template_redirect', 99);
    function my_custom_template_redirect($template){
    
    	global $post;
        
        if(is_single() && 'campaign' == get_post_type($post)){
    		$page_template = get_page_template();
    		$new_template = locate_template( array( $page_template . '.php' ) );
    	}
    
    	return $new_template;
    	
    }

Ovbiously I'm making the assumption that your `$page_template` variable doesn't have `.php` on the end, but you can ammend that as required.

I'd recommend you have a read of the documentation related to this hook, and the `locate_template` function -

 - `template_include` filter hook - http://codex.wordpress.org/Plugin_API/Filter_Reference/template_include
 - `locate_template()` - http://codex.wordpress.org/Function_Reference/locate_template