Fügen Sie allen internen Links URL-Parameter hinzu, die ein bestimmtes Thema verwenden

Ich blieb mit einigen Modifikationen stecken und vielleicht könnte mir jemand helfen.

Was tue ich

Ich verwende das Multiple Theme Plugin, um Themen für mein WordPress-Projekt zu wechseln. Um zwischen den Themen zu wechseln, wird ein URL-Parameter hinzugefügt: www.mydomain/?parameter=XYZ . Bis jetzt funktioniert alles super.

Wo ist das Problem?

Das Problem ist, wenn ich auf interne Links innerhalb der Seite klicke, die ich zurück zum Grundthema gesandt werde, da die Links und URLs innerhalb der Website nicht den URL-Parameter angehängt haben.

Bitte beachten Sie, dass mir bekannt ist, dass das Plugin eine sticky-function hat, die den meisten URLs den Parameter hinzufügt, aber nicht für alle URLs funktioniert und insbesondere nicht für solche, die mit AJAX geladen sind. Außerdem muss ich immer noch über die normale URL ohne Parameter auf das Basisthema zugreifen können.

Was ich versuche zu tun

In der functions.php des spezifischen Themas versuche ich eine function hinzuzufügen, die allen URLs, die WordPress erzeugt, den benötigten Parameter hinzufügt.

Basierend auf dieser Info :
Ich bin in der Lage, zumindest die richtige URL wiederzugeben

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

Leider habe ich keine Ahnung, wie ich das in eine function umwandeln kann, dass alle URLs innerhalb der geladenen Webseite den Parameter angehängt bekommen? Hat jemand eine Idee?

Was ich bereits überprüft habe

Ich möchte URL-Parameter an alle URLs anhängen

Da es sich um eine Umleitung und keine Neuschreibung der URL handelt, kann ich dann nicht mehr auf die normale URL ohne den Parameter zugreifen.

Solutions Collecting From Web of "Fügen Sie allen internen Links URL-Parameter hinzu, die ein bestimmtes Thema verwenden"

Okay, das ist eine wahnsinnig lange Antwort, aber glücklicherweise arbeitete ich daran, das Theme Test Drive Plugin mit meinem Theme zu testen. Ich dachte, ich könnte es besser mit Multiple Themes kompatibel machen, auch wenn das Admin-Problem behoben wurde …

Also, hier ist der Code, den ich entwickelt habe, der beides beherrscht. Setzen Sie es wieder in Ihren /wp-content/mu-plugins/ Ordner (obwohl es wahrscheinlich auch als Plugin gut ist.) Ich setze es in mein Design, um Child Theme Switching trotzdem zu unterstützen, aber es muss früher geladen werden um die Umschaltung zwischen übergeordneten Themen zu unterstützen.

Ich werde später noch einige Hinweise hinzufügen, denn jetzt ist es erwähnenswert, dass Sie nicht die “sticky” -Option von Multiple Themes verwenden wollen, da dies zu Konflikten führen wird – denn wenn Sie zwei Themes auf derselben Site haben, öffnen Sie in verschiedenen Fenstern die Persistenter Cookie überschreibt die passenden Admin-Aufrufe, und genau aus diesem Grund habe ich diese Lösung codiert – um dieses Problem zu lösen.

Im Grunde genommen lassen Multiple Themes bestimmen, welches Stylesheet / Template wie normal verwendet wird, und speichert eine Liste von URLs mit anderem Thema als Standard, wenn sie geladen werden, und stimmt dann mit den Referrer-Strings des Admin AJAX überein Anfrage (sowohl admin-ajax.php und admin-post.php unterstützt.)

Wie für Theme Test Drive Ich fand, dass es bereits in Admin geladen, wenn Sie das persistente Theme-Laufwerk aktiviert haben, in Ordnung. Aber für die Querystring-Testfahrt habe ich einen völlig anderen Ansatz mit passenden Cookies und Transienten verwendet.

Wie auch immer, das ist genug, lies die Code-Kommentare für mehr (wenn du dich traust). Ansonsten habe ich es schon gründlich getestet, also kannst du es einfach ausprobieren … 🙂

 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 "";} 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 ""; echo ""; echo ""; echo ""; if ($matchedurlpath) {echo "";} else {echo "";} echo ""; echo ""; } 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 ""; echo ""; } } 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 ""; echo ""; } } // maybe output hidden ajax debugging frames if ( (!is_admin()) && ($debug) ) { echo ""; echo ""; } } } } 

Für Ihren speziellen Anwendungsfall (so weit ich es jetzt verstehe) möchten Sie nur die Sticky-Abfragen verwenden, wenn die Zugriffsquelle anders ist, also auf einer Benutzerebene und nicht auf einer Site-Ebene läuft (zB wie alle Posts und / oder Seiten Möglichkeit)…

Da “Multiple Themes” eigentlich “so wie es ist” im admin von der sticky-Abfrage über cookie ausgeführt werden kann (dies wird standardmäßig nicht ausgeführt, da dies bei den standortweiten Optionen zu Konflikten führen würde), können Sie es einfach zum Laden zwingen AJAX ruft mit select-theme.php

Aber da es immer noch gut wäre, wenn sie keine AJAX-Aufrufe von der Startseite aus betreffen, auf denen das Standardthema verwendet wird, können Sie manuell eine Liste dieser Pfade hinzufügen, um sie herauszufiltern (durch Hinzufügen zu $defaultthemepaths ) einfacher, aber passt nicht automatisch zu den Sitewide-Optionen von Multiple Theme, Sie müssen die Standard-Design-URLs manuell in diesem Code hinzufügen …

 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);} } } } } 

Sie können $_GET intern global $_GET . Indem Sie den als Benutzer-Meta und / oder Cookie übergebenen Parameter speichern und später abrufen. Dies müsste wahrscheinlich in Ihren /wp-content/mu-plugins/ Ordner gelegt werden, damit er richtig funktioniert (also früh geladen wird):

 < ?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); } ?> 

Verwendung: Dies kann verwendet werden, um Theme Test Drive für einzelne Benutzer persistent zu machen. Derzeit funktioniert es nur auf Benutzerrollenebene und / oder über nicht persistente Querystrings. Theme Test Drive ermöglicht jedoch keine Bereichsauswahl – entweder wird das gesamte Thema für den Benutzer überall oder nirgendwo geschaltet.