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.