Add URL parameter to all internal links using a specific theme

You can set the $_GET global internally. By saving the parameter passed as user meta and/or a cookie and retrieving it later. This would probably have to be put in your /wp-content/mu-plugins/ folder to work properly (so it is loaded early):

<?php 

    $parameter="theme"; // default for theme test drive
    $savemethod = 'both'; // 'usermeta' (only), 'cookie' (only) or 'both'
    $expires = 7*24*60*60; // cookie length (a week in seconds)

    if (!function_exists('is_user_logged_in')) {require(ABSPATH.WPINC.'/pluggable.php');}
    if (is_user_logged_in()) {global $current_user; wp_get_current_user();}

    if (isset($_GET[$parameter])) {
        // sanitize querystring input (like a theme slug)
        $originalvalue = $_GET[$parameter];
        $value = sanitize_title($_GET[$originalvalue]);
        if (!$value) {$value="";}

        // save parameter as usermeta
        if ( ($savemethod != 'cookie') && (is_user_logged_in()) ) {
            if ($value == '') {delete_user_meta($current_user->ID,$parameter);}
            else {update_user_meta($current_user->ID,$parameter,$value);}
        } 
        // save parameter value as cookie
        if ($savemethod != 'usermeta') {
            if ($value == '') {setCookie($parameter,'',-300);}
            else {setCookie($parameter,$value,time()+$expires);}
        }
    }
    elseif ( ($savemethod != 'cookie') && (is_user_logged_in()) ) {
        // maybe set parameter from usermeta
        $uservalue = get_user_meta($current_user->ID,$parameter,true);
        if ($uservalue != '') {$_GET[$parameter] = $uservalue;}
    }
    elseif ($savemethod != 'usermeta') {
        // maybe set parameter from cookie
        if ( (isset($_COOKIE[$parameter])) && ($_COOKIE[$parameter] != '') ) {
            $_GET[$parameter] = $_COOKIE[$parameter];
        }
     }

    // parameter override debugging
    if ( (isset($_GET[$parameter.'debug'])) && ($_GET[$parameter.'debug'] == '1') ) {
        $debugfile = get_stylesheet_directory()."https://wordpress.stackexchange.com/".$parameter.'-debug.txt';
        $fh = fopen($debugfile,'a'); 
        $debugline = $_SERVER['REQUEST_URI'].'::original:'.$originalvalue;
        $debugline .= '::cookie:'.$_COOKIE[$parameter'].'::usermeta.'.$uservalue;
        $debugline .= '::current:'.$_GET[$parameter].PHP_EOL;
        fwrite ($debugfile,$debugline); fclose($fh);
    }

?>

Usage: This could be used for making Theme Test Drive persistent on a per-user level, currently it only works on a user-role level and/or via non-persistent querystring. However, Theme Test Drive does not allow for site area selection – either the whole theme is switched for the user everywhere or nowhere.