Добавить параметр URL во все внутренние ссылки, используя определенную тему

Я застрял с некоторыми изменениями, и, может быть, кто-то может мне помочь.

Что я делаю

Я использую плагин с несколькими темами для переключения тем для моего проекта WordPress. Для переключения между темами добавляется URL-адрес параметра www.mydomain/?parameter=XYZ . Пока все отлично работает.

Где проблема?

Проблема заключается в том, что когда я нажимаю на внутренние ссылки внутри страницы, меня отправляют обратно на основную тему, поскольку ссылки и URL-адреса на веб-сайте не содержат добавленного параметра URL.

Обратите внимание, что я знаю, что плагин имеет липкую функцию, которая добавляет параметр к большинству URL-адресов, но не работает для всех URL-адресов, и особенно не для тех, которые загружаются с помощью AJAX. Также мне по-прежнему нужно иметь доступ к основной теме через обычный URL без параметров.

То, что я пытаюсь сделать

В functions.php конкретной темы я пытаюсь добавить функцию, которая добавляет необходимый параметр ко всем URL-адресам, которые создает WordPress.

Основываясь на этой информации :
Я нахожусь в положении, чтобы хотя бы повторить правильный URL

 //Add partner parameter echo add_query_arg( 'partner', 'XYZ', get_permalink()); 

К сожалению, я не имею в виду, как я могу превратить это в функцию, чтобы все URL-адреса в загруженной веб-странице добавляли параметр? У кого-нибудь есть идея?

Что я уже проверил

Я хочу добавить параметр URL ко всем URL-адресам

Поскольку это перенаправление, а не переписывание URL-адреса, я не могу получить доступ к обычным URL-адресам без параметра.

Ладно, это один безумно длинный ответ, но, к счастью, я работал над тестированием плагина Theme Test Drive с моей темой. Я полагал, что могу также улучшить его совместимость с несколькими темами, а также устранить проблему с правами администратора …

Итак, вот код, который я придумал, который обрабатывает оба. Опять же, поместите его в папку /wp-content/mu-plugins/ (хотя, вероятно, это тоже хорошо, что и плагин). Я помещаю ее в свою тему, чтобы поддерживать переключение Child Theme в любом случае, но она должна загружаться раньше, чем это для поддержки переключения родительской темы.

Я добавлю несколько других заметок позже, потому что теперь стоит упомянуть, что вы не хотите использовать «липкую» опцию «Несколько тем», так как это вызовет конфликты, потому что если у вас есть две темы на одном сайте, открытые в разных окнах, persistant cookie переопределит соответствующие вызовы администратора, и именно поэтому я закодировал это решение – чтобы преодолеть эту проблему.

В основном это позволяет Multiple Themes выполнять работу по определению того, какую таблицу стилей / шаблонов использовать, как обычно, и сохраняет список URL-адресов с разными темами по умолчанию при их загрузке, а затем сопоставляется с ними, используя строку-реферер администратора AJAX (поддерживаются как admin-ajax.php, так и admin-post.php.)

Что касается Theme Test Drive, я обнаружил, что он уже загружается в admin, если у вас включен постоянный поток тем, отлично. Но для тестового диска querystring я использовал совершенно другой подход с сопоставлением файлов cookie и переходных процессов.

Во всяком случае, этого достаточно, прочитайте комментарии к коду для большего (если вы посмеете). В противном случае, я протестировал его довольно тщательно, чтобы вы могли просто отдать ему … 🙂

 add_action('init','muscle_theme_switch_admin_fix'); if (!function_exists('muscle_theme_switch_admin_fix')) { function muscle_theme_switch_admin_fix() { $multiplethemes = false; $themetestdrive = false; $debug = false; $expires = 24*60*60; // transient time for temporary theme test drive (querystring) // maybe reset cookie and URL data by user request if ( (isset($_GET['resetthemes'])) && ($_GET['resetthemes'] == '1') ) { if ($debug) {echo "<!-- THEME SWITCH DATA RESET -->";} if ($themetestdrive) {setCookie('theme_test_drive','',-300);} delete_option('theme_switch_request_urls'); return; } // maybe set debug switch if ( (isset($_GET['debug'])) && ($_GET['debug'] == '1') ) {$debug = true;} elseif (defined('THEMEDEBUG')) {$debug = THEMEDEBUG;} // check for a valid active plugin $activeplugins = maybe_unserialize(get_option('active_plugins')); if (!is_array($activeplugins)) {return;} if (in_array('jonradio-multiple-themes/jonradio-multiple-themes.php',$activeplugins)) {$multiplethemes = true;} if (in_array('theme-test-drive/themedrive.php',$activeplugins)) {$themetestdrive = true;} if ( (!$multiplethemes) && (!$themetestdrive) ) {return;} // nothing to do // theme test drive by default only filters via get_stylesheet and get_template // improve theme test drive to use options filters like multiple themes instead if ($themetestdrive) { remove_filter('template', 'themedrive_get_template'); remove_filter('stylesheet', 'themedrive_get_stylesheet'); add_filter('pre_option_stylesheet', 'themedrive_get_stylesheet'); add_filter('pre_option_template', 'themedrive_get_template'); } // maybe load stored alternative theme for AJAX/admin calls if (is_admin()) { // get pagenow to check for admin-post.php as well global $pagenow; if ( ( (defined('DOING_AJAX')) && (DOING_AJAX) ) || ($pagenow == 'admin-post.php') ) { // set the referer path for URL matching $referer = parse_url($_SERVER['HTTP_REFERER'],PHP_URL_PATH); // set some globals for the AJAX theme options global $ajax_stylesheet, $ajax_template; // check for temporary Theme Test Drive cookie data if ( ($themetestdrive) && (isset($_COOKIE['theme_test_drive'])) && ($_COOKIE['theme_test_drive'] != '') ) { $i = 0; $cookiedata = explode(',',$_COOKIE['theme_test_drive']); // attempt to match referer data with stored transient request foreach ($cookiedata as $transientkey) { $transientdata = get_transient($transientkey); if ($transientdata) { $data = explode(':',$transientdata); if ($data[0] == $referer) { $ajax_stylesheet = $data[1]; $ajax_template = $data[2]; $transientdebug = $transientdata; $matchedurlpath = true; } } $i++; } } elseif ($multiplethemes) { // check the request URL list to handle all other cases $requesturls = get_option('theme_switch_request_urls'); if (!is_array($requesturls)) {return;} if ( (is_array($requesturls)) && (array_key_exists($referer,$requesturls)) ) { $matchedurlpath = true; $ajax_stylesheet = $requesturls[$referer]['stylesheet']; $ajax_template = $requesturls[$referer]['template']; } } if ($matchedurlpath) { // add new theme option filters for admin AJAX (and admin post) // so any admin actions defined by the theme are finally loaded! add_filter('pre_option_stylesheet','admin_ajax_stylesheet'); add_filter('pre_option_template','admin_ajax_template'); function admin_ajax_stylesheet() {global $ajax_stylesheet; return $ajax_stylesheet;} function admin_ajax_template() {global $ajax_template; return $ajax_template;} } // maybe output debug info for AJAX/admin test frame if ($debug) { echo "<!-- COOKIE DATA: ".$_COOKIE['theme_test_drive']." -->"; echo "<!-- TRANSIENT DATA: ".$transientdebug." -->"; echo "<!-- REFERER: ".$referer." -->"; echo "<!-- STORED URLS: "; print_r($requesturls); echo " -->"; if ($matchedurlpath) {echo "<!-- URL MATCH FOUND -->";} else {echo "<!-- NO URL MATCH FOUND -->";} echo "<!-- AJAX Stylesheet: ".get_option('stylesheet')." -->"; echo "<!-- AJAX Template: ".get_option('template')." -->"; } return; // we are done so bug out here } } // store public request URLs where an alternate theme is active // (multiple themes does not load in admin, but theme test drive does) if ( ($themetestdrive) || ( (!is_admin()) && ($multiplethemes) ) ) { // get current theme (possibly overriden) setting $themestylesheet = get_option('stylesheet'); $themetemplate = get_option('template'); // remove filters, get default theme setting, re-add filters if ($multiplethemes) { remove_filter('pre_option_stylesheet', 'jr_mt_stylesheet'); remove_filter('pre_option_template', 'jr_mt_template'); $stylesheet = get_option('stylesheet'); $template = get_option('template'); add_filter('pre_option_stylesheet', 'jr_mt_stylesheet'); add_filter('pre_option_template', 'jr_mt_template'); } if ($themetestdrive) { // note: default theme test drive filters are changed earlier on remove_filter('pre_option_stylesheet', 'themedrive_get_stylesheet'); remove_filter('pre_option_template', 'themedrive_get_template'); $stylesheet = get_stylesheet(); $template = get_template(); add_filter('pre_option_stylesheet', 'themedrive_get_stylesheet'); add_filter('pre_option_template', 'themedrive_get_template'); } // set/get request URL values (URL path only) $requesturl = parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH); $requesturls = get_option('theme_switch_request_urls'); // check for a temporary Theme Test Drive (querystring) if ( ($themetestdrive) && (isset($_REQUEST['theme'])) && ($_REQUEST['theme'] != '') ) { // add a transient style user page cookie for matching later $cookiedata = array(); if ( (isset($_COOKIE['theme_test_drive'])) && ($_COOKIE['theme_test_drive'] != '') ) { $existingmatch = false; $i = 0; $cookiedata = explode(',',$_COOKIE['theme_test_drive']); // remove transient IDs for expired transients foreach ($cookiedata as $transientkey) { $transientdata = get_transient($transientkey); if ($transientdata) { $data = explode(':',$transientdata); if ($data[0] == $requesturl) { // update the existing transient data $transientdata = $transientdebug = $requesturl.':'.$themestylesheet.':'.$themetemplate; set_transient($transientkey,$transientdata,$expires); $existingmatch = true; // no duplicates } } else {unset($cookiedata[$i]);} $i++; } } // set the matching transient and cookie data if (!$existingmatch) { $transientkey = 'theme_test_drive_session_'.uniqid(); $transientdata = $transientdebug = $requesturl.':'.$themestylesheet.':'.$themetemplate; set_transient($transientkey, $transientdata, $expires); $cookiedata[] = $transientkey; $cookiedatastring = implode(',',$cookiedata); setCookie('theme_test_drive', $cookiedatastring, time()+$expires); } // maybe output debug info if ($debug) { echo "<!-- COOKIE DATA: "; print_r($cookiedata); echo " -->"; echo "<!-- TRANSIENT DATA: ".$transientdebug." -->"; } } elseif ($multiplesthemes) { // save/remove the requested URL path in the list if ( ($stylesheet == $themestylesheet) && ($template == $themetemplate) ) { // maybe remove this request from the stored URL list if ( (is_array($requesturls)) && (array_key_exists($requesturl,$requesturls)) ) { unset($requesturls[$requesturl]); if (count($requesturls) === 0) {delete_option('theme_switch_request_urls');} else {update_option('theme_switch_request_urls',$requesturls);} } } else { // add this request URL to the stored list $requesturls[$requesturl]['stylesheet'] = $themestylesheet; $requesturls[$requesturl]['template'] = $themetemplate; update_option('theme_switch_request_urls',$requesturls); } // maybe output debug info if ( (!is_admin()) && ($debug) ) { echo "<!-- REQUEST URL: ".$requesturl." -->"; echo "<!-- STORED URLS: "; print_r($requesturls); echo " -->"; } } // maybe output hidden ajax debugging frames if ( (!is_admin()) && ($debug) ) { echo "<iframe src='".admin_url('admin-ajax.php')."?debug=1' style='display:none;'></iframe>"; echo "<iframe src='".admin_url('admin-post.php')."?debug=1' style='display:none;'></iframe>"; } } } } не add_action('init','muscle_theme_switch_admin_fix'); if (!function_exists('muscle_theme_switch_admin_fix')) { function muscle_theme_switch_admin_fix() { $multiplethemes = false; $themetestdrive = false; $debug = false; $expires = 24*60*60; // transient time for temporary theme test drive (querystring) // maybe reset cookie and URL data by user request if ( (isset($_GET['resetthemes'])) && ($_GET['resetthemes'] == '1') ) { if ($debug) {echo "<!-- THEME SWITCH DATA RESET -->";} if ($themetestdrive) {setCookie('theme_test_drive','',-300);} delete_option('theme_switch_request_urls'); return; } // maybe set debug switch if ( (isset($_GET['debug'])) && ($_GET['debug'] == '1') ) {$debug = true;} elseif (defined('THEMEDEBUG')) {$debug = THEMEDEBUG;} // check for a valid active plugin $activeplugins = maybe_unserialize(get_option('active_plugins')); if (!is_array($activeplugins)) {return;} if (in_array('jonradio-multiple-themes/jonradio-multiple-themes.php',$activeplugins)) {$multiplethemes = true;} if (in_array('theme-test-drive/themedrive.php',$activeplugins)) {$themetestdrive = true;} if ( (!$multiplethemes) && (!$themetestdrive) ) {return;} // nothing to do // theme test drive by default only filters via get_stylesheet and get_template // improve theme test drive to use options filters like multiple themes instead if ($themetestdrive) { remove_filter('template', 'themedrive_get_template'); remove_filter('stylesheet', 'themedrive_get_stylesheet'); add_filter('pre_option_stylesheet', 'themedrive_get_stylesheet'); add_filter('pre_option_template', 'themedrive_get_template'); } // maybe load stored alternative theme for AJAX/admin calls if (is_admin()) { // get pagenow to check for admin-post.php as well global $pagenow; if ( ( (defined('DOING_AJAX')) && (DOING_AJAX) ) || ($pagenow == 'admin-post.php') ) { // set the referer path for URL matching $referer = parse_url($_SERVER['HTTP_REFERER'],PHP_URL_PATH); // set some globals for the AJAX theme options global $ajax_stylesheet, $ajax_template; // check for temporary Theme Test Drive cookie data if ( ($themetestdrive) && (isset($_COOKIE['theme_test_drive'])) && ($_COOKIE['theme_test_drive'] != '') ) { $i = 0; $cookiedata = explode(',',$_COOKIE['theme_test_drive']); // attempt to match referer data with stored transient request foreach ($cookiedata as $transientkey) { $transientdata = get_transient($transientkey); if ($transientdata) { $data = explode(':',$transientdata); if ($data[0] == $referer) { $ajax_stylesheet = $data[1]; $ajax_template = $data[2]; $transientdebug = $transientdata; $matchedurlpath = true; } } $i++; } } elseif ($multiplethemes) { // check the request URL list to handle all other cases $requesturls = get_option('theme_switch_request_urls'); if (!is_array($requesturls)) {return;} if ( (is_array($requesturls)) && (array_key_exists($referer,$requesturls)) ) { $matchedurlpath = true; $ajax_stylesheet = $requesturls[$referer]['stylesheet']; $ajax_template = $requesturls[$referer]['template']; } } if ($matchedurlpath) { // add new theme option filters for admin AJAX (and admin post) // so any admin actions defined by the theme are finally loaded! add_filter('pre_option_stylesheet','admin_ajax_stylesheet'); add_filter('pre_option_template','admin_ajax_template'); function admin_ajax_stylesheet() {global $ajax_stylesheet; return $ajax_stylesheet;} function admin_ajax_template() {global $ajax_template; return $ajax_template;} } // maybe output debug info for AJAX/admin test frame if ($debug) { echo "<!-- COOKIE DATA: ".$_COOKIE['theme_test_drive']." -->"; echo "<!-- TRANSIENT DATA: ".$transientdebug." -->"; echo "<!-- REFERER: ".$referer." -->"; echo "<!-- STORED URLS: "; print_r($requesturls); echo " -->"; if ($matchedurlpath) {echo "<!-- URL MATCH FOUND -->";} else {echo "<!-- NO URL MATCH FOUND -->";} echo "<!-- AJAX Stylesheet: ".get_option('stylesheet')." -->"; echo "<!-- AJAX Template: ".get_option('template')." -->"; } return; // we are done so bug out here } } // store public request URLs where an alternate theme is active // (multiple themes does not load in admin, but theme test drive does) if ( ($themetestdrive) || ( (!is_admin()) && ($multiplethemes) ) ) { // get current theme (possibly overriden) setting $themestylesheet = get_option('stylesheet'); $themetemplate = get_option('template'); // remove filters, get default theme setting, re-add filters if ($multiplethemes) { remove_filter('pre_option_stylesheet', 'jr_mt_stylesheet'); remove_filter('pre_option_template', 'jr_mt_template'); $stylesheet = get_option('stylesheet'); $template = get_option('template'); add_filter('pre_option_stylesheet', 'jr_mt_stylesheet'); add_filter('pre_option_template', 'jr_mt_template'); } if ($themetestdrive) { // note: default theme test drive filters are changed earlier on remove_filter('pre_option_stylesheet', 'themedrive_get_stylesheet'); remove_filter('pre_option_template', 'themedrive_get_template'); $stylesheet = get_stylesheet(); $template = get_template(); add_filter('pre_option_stylesheet', 'themedrive_get_stylesheet'); add_filter('pre_option_template', 'themedrive_get_template'); } // set/get request URL values (URL path only) $requesturl = parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH); $requesturls = get_option('theme_switch_request_urls'); // check for a temporary Theme Test Drive (querystring) if ( ($themetestdrive) && (isset($_REQUEST['theme'])) && ($_REQUEST['theme'] != '') ) { // add a transient style user page cookie for matching later $cookiedata = array(); if ( (isset($_COOKIE['theme_test_drive'])) && ($_COOKIE['theme_test_drive'] != '') ) { $existingmatch = false; $i = 0; $cookiedata = explode(',',$_COOKIE['theme_test_drive']); // remove transient IDs for expired transients foreach ($cookiedata as $transientkey) { $transientdata = get_transient($transientkey); if ($transientdata) { $data = explode(':',$transientdata); if ($data[0] == $requesturl) { // update the existing transient data $transientdata = $transientdebug = $requesturl.':'.$themestylesheet.':'.$themetemplate; set_transient($transientkey,$transientdata,$expires); $existingmatch = true; // no duplicates } } else {unset($cookiedata[$i]);} $i++; } } // set the matching transient and cookie data if (!$existingmatch) { $transientkey = 'theme_test_drive_session_'.uniqid(); $transientdata = $transientdebug = $requesturl.':'.$themestylesheet.':'.$themetemplate; set_transient($transientkey, $transientdata, $expires); $cookiedata[] = $transientkey; $cookiedatastring = implode(',',$cookiedata); setCookie('theme_test_drive', $cookiedatastring, time()+$expires); } // maybe output debug info if ($debug) { echo "<!-- COOKIE DATA: "; print_r($cookiedata); echo " -->"; echo "<!-- TRANSIENT DATA: ".$transientdebug." -->"; } } elseif ($multiplesthemes) { // save/remove the requested URL path in the list if ( ($stylesheet == $themestylesheet) && ($template == $themetemplate) ) { // maybe remove this request from the stored URL list if ( (is_array($requesturls)) && (array_key_exists($requesturl,$requesturls)) ) { unset($requesturls[$requesturl]); if (count($requesturls) === 0) {delete_option('theme_switch_request_urls');} else {update_option('theme_switch_request_urls',$requesturls);} } } else { // add this request URL to the stored list $requesturls[$requesturl]['stylesheet'] = $themestylesheet; $requesturls[$requesturl]['template'] = $themetemplate; update_option('theme_switch_request_urls',$requesturls); } // maybe output debug info if ( (!is_admin()) && ($debug) ) { echo "<!-- REQUEST URL: ".$requesturl." -->"; echo "<!-- STORED URLS: "; print_r($requesturls); echo " -->"; } } // maybe output hidden ajax debugging frames if ( (!is_admin()) && ($debug) ) { echo "<iframe src='".admin_url('admin-ajax.php')."?debug=1' style='display:none;'></iframe>"; echo "<iframe src='".admin_url('admin-post.php')."?debug=1' style='display:none;'></iframe>"; } } } } 

Для вашего конкретного случая использования (насколько я понимаю сейчас) вы просто хотите использовать липкие запросы, если источник доступа отличается, поэтому работает на уровне пользователя, а не на уровне сайта (например, все сообщения и / или страницы опция) …

Поскольку «Несколько тем» действительно отлично запускать «как есть» в админке из липкого запроса через файл cookie (он просто не делает этого по умолчанию, потому что это конфликтует с его альтернативными параметрами) … вы можете просто заставить его загружать AJAX звонит, включая select-theme.php

Но так как было бы неплохо, если бы они не влияли на любые вызовы AJAX с домашней страницы, где используется тема по умолчанию, вы можете добавить список этих путей вручную, чтобы отфильтровать их (добавив к $defaultthemepaths ). Это много проще, но просто не автоматически соединяется с параметрами Sitewide из нескольких элементов, вам нужно добавить URL-адреса по умолчанию вручную в этот код …

 add_action('plugins_loaded','switched_theme_admin_fix'); function switched_theme_admin_fix() { if (!is_admin()) {return;} // switch-themes.php already loads for non-admin // default theme URL paths (add to this list?) $defaultthemepaths = array('','/'); // 'home' paths // get pagenow to check for admin-post.php as well global $pagenow; if ( ( (defined('DOING_AJAX')) && (DOING_AJAX) ) || ($pagenow == 'admin-post.php') ) { // set the referer path for URL matching $referer = parse_url($_SERVER['HTTP_REFERER'],PHP_URL_PATH); // do not switch themes if called from a default theme URL path if (!in_array($referer,$defaultthemepaths)) { // full path to select-theme.php $selecttheme = WP_PLUGIN_DIR.'/jonradio-multiple-themes'; $selecttheme .= '/includes/select-theme.php'; // just in case multiple themes does update to load for admin $included = get_included_files(); if (!in_array($selecttheme,$included)) { // adds the multiple themes stylesheet filters if (file_exists($selecttheme) {include($selecttheme);} } } } } 

Глобальный глобальный $_GET можно установить внутренне. Сохраняя параметр, переданный как пользовательский мета и / или файл cookie, и получая его позже. Это, вероятно, нужно будет поместить в папку /wp-content/mu-plugins/ для правильной работы (чтобы она была загружена раньше):

 <?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().'/'.$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); } ?> 

Использование: это может быть использовано для обеспечения постоянной проверки тестового диска на уровне каждого пользователя, в настоящее время он работает только на уровне пользовательской роли и / или с помощью непостоянного запроса. Тем не менее, Theme Test Drive не позволяет выбирать область сайта – либо вся тема переключается на пользователя повсюду или нигде.