J'ai cinq domaines pointant vers la même installation serveur/wp. les noms de domaine sont importants et mes visiteurs doivent pouvoir rester sur leur domaine de prédilection lorsqu’ils surfent sur mon site.
comment puis-je configurer wp (ou .htaccess ou ...) pour que tous les liens pointent vers le domaine/l'hôte spécifié par le visiteur?
maintenant, si je règle Dashboard/General/Site Address sur site-A.comet je charge le site en tant que site-B.com, les liens pointent toujours vers site-A.com au lieu de site-B.com; par exemple, chargez http://site-B.com/blog/this-is-my-home/
. les liens dans la page chargée indiquent toujours site-A.com au lieu de site-B.com.
dans mon ancien système MT, j'ai pu définir tous les liens comme étant relatifs à la racine, de sorte que tous les liens pointaient vers le domaine actuel. est-ce possible avec WP?
à votre santé,
Gregory
J'ai suivi les appels de fonction dans mon thème (un thème enfant d'œnologie de Chip Bennett) et dans wp-include qui génèrent les liens, trouvé la fonction home_url()
, puis écrit ces fonctions pour mon site:
function gregory_make_relative($url='') {
return preg_replace( '#^https?://[^/]+/#iu', '/', $url, 1 );
}
add_filter( 'home_url', 'gregory_make_relative', 11, 1 );
J'ai intentionnellement grep-recherché pour inclure le/après le domaine afin que je puisse toujours utiliser home_url('')
pour renvoyer le domaine spécifié du blog, et spécifier les url canoniques vraies de ce domaine dans le <head>
via WordPress SEO à l'aide des fonctions suivantes (à savoir, les liens canoniques) sera le même quel que soit le domaine utilisé pour charger la page, c.-à-d. qu'il n'y a pas de "contenu dupliqué"):
function gregory_wpseo_canonical_add_domain( $canonical ) {
return home_url('').$canonical;
}
add_filter( 'wpseo_canonical', 'gregory_wpseo_canonical_add_domain', 10, 1 );
jusqu’à présent, cela fonctionne vraiment bien, mais je me demande si cela aura un impact négatif sur Feeds ou sur la solution de commerce électronique que j’ai finalement mise en œuvre. commentaires, notes, conseils, avertissements sont les bienvenus :-)
une simple home_url()
(c’est-à-dire qu’aucun chemin n’est spécifié) est utilisée dans l’ensemble du système. Par conséquent, le caractère de fin/dans la recherche de grep ne peut pas être utilisé. Je devais l'enlever et trouver un autre moyen de spécifier le domaine dans les URL canoniques. donc, un peu plus de recherche à travers wp-includes, et maintenant les fonctions ressemblent à ceci:
function gregory_make_relative($url='') {
return preg_replace( '#^https?://[^/]+#iu', '', $url, 1 );
}
add_filter( 'home_url', 'gregory_make_relative', 11, 1 );
function gregory_wpseo_canonical_add_domain( $canonical ) {
// get_option() is defined in wp-includes/functions.php and is used by get_home_url()
return get_option('home').$canonical;
}
add_filter( 'wpseo_canonical', 'gregory_wpseo_canonical_add_domain', 10, 1 );
c'est plus difficile qu'il ne paraissait au début ;-) mon code ressemble maintenant à ceci. les aliments sont touchés. quelque part dans la chaîne de fonctions qui produit les liens, les flux semblent utiliser _SERVER ['HTTP_Host']. Je vais devoir examiner mes options là-bas.
/* FILTERS TO PRODUCE ROOT-RELATIVE URLs */
// define WP_SITEURL because the formula in wp-includes/functions::wp_guess_url() makes a
// false assumption and appends $_SERVER['REQUEST_URI'] to the base_url.
define('WP_SITEURL', 'http://my.domain.hk/', true );
// strip the domain
function gregory_make_relative( $url='' ) {
return preg_replace( '#^https?://[^/]+#iu', '', $url, 1 );
}
add_filter( 'site_url', 'gregory_make_relative', 11, 1 );
add_filter( 'home_url', 'gregory_make_relative', 11, 1 );
add_filter( 'template_directory_uri', 'gregory_make_relative', 11, 1 );
add_filter( 'stylesheet_directory_uri', 'gregory_make_relative', 11, 1 );
add_filter( 'script_loader_src', 'gregory_make_relative', 11, 1 );
function gregory_make_stylehref_relative( $tag='' ) {
// $wp_styles->do_item() passes this along to the filter:
// "<link rel='$rel' id='$handle-rtl-css' $title href='$rtl_href' type='text/css' media='$media' />\n"
$matches = array();
if( !preg_match( '#^(.+ +href=\')(.+)(\' +type=.+)$#iu', $tag, &$matches ))
return $tag;
$matches[2] = gregory_make_relative($matches[2]);
return $matches[1].$matches[2].$matches[3];
}
add_filter( 'style_loader_tag', 'gregory_make_stylehref_relative', 11, 1 );
function gregory_wpseo_canonical_add_domain( $canonical='' ) {
// get_option is defined in wp-includes/functions.php and is used by get_home_url() to get the home url.
return get_option('home').$canonical;
}
add_filter( 'wpseo_canonical', 'gregory_wpseo_canonical_add_domain', 10, 1 );
wPSEO permet d’ajouter du texte/des liens avant et après les publications RSS, y compris l’option d’utiliser des espaces réservés. Un de ces espaces réservés est %%BLOGLINK%%
. malheureusement, avec les filtres relatifs relatifs à la racine en place, %% BLOGLINK %% a généré une chaîne vide qui n’était pas utile dans les flux. ce code corrige ce problème (notant que mon autre choix était simplement de coder en dur le lien dans les paramètres RSS de WPSEO, probablement la chose la plus intelligente à faire :-)
// a change for WPSEO's %%BLOGLINK%% code.
// I changed get_bloginfo() to get_bloginfo_rss() in wpseo/frontend/class-frontend.php to allow this.
// without these changes, %%BLOGLINK%% is printed into the rss feeds as an empty string.
function gregory_set_domain_in_rss_urls( $info, $show ) {
// copied from wp-includes/general-template.php::get_bloginfo()
$url = true;
if (strpos($show, 'url') === false &&
strpos($show, 'directory') === false &&
strpos($show, 'home') === false)
$url = false;
return ( !$url || !empty($info) ? $info : '/' );
}
add_filter( 'get_bloginfo_rss', 'gregory_set_domain_in_rss_urls', 11, 2 );
(J'ai depuis décidé de coder en dur mon message après-post RSS, le filtre ci-dessus a donc été désactivé dans mon thème.)
J'ai mis à jour la fonction gregory_make_stylehref_relative()
indiquée dans la mise à jour 2 pour utiliser preg_match()
au lieu de preg_replace()
. c'est l'ancien code:
$href = preg_replace( '#^(.+ +href=\')(.+)(\' +type=.+)$#iu', '$2', $tag );
$href = gregory_make_relative($href);
return preg_replace( '#^(.+ +href=\')(.+)(\' +type=.+)$#iu', '$1'.$href.'$3', $tag );
un autre filtre, cette fois pour get_avatar (), de sorte que le schéma et le domaine actuel soient inclus dans le chemin d'accès à blank.gif de wp. sans cela, le gif ne sera ni trouvé ni chargé. Sans le schéma, Gravatar chargera son propre avatar d'entreprise à la place.
function gregory_avatar_add_domain( $avatar ) {
// look for urlencode( includes_url('images/blank.gif')) in the $avatar string.
// if found, encode the schema and domain, insert it into the $avatar string.
$gif = includes_url('images/blank.gif'); // from get_avatar()
if( preg_match( '|^https?://|i', $gif ))
// the url already includes the schema (and domain).
return $avatar;
$gif = urlencode($gif);
$schema = is_ssl() ? 'https://' : 'http://'; // from wp_guess_url()
$domain = urlencode( $schema . $_SERVER['HTTP_Host'] );
return str_replace( $gif, $domain.$gif, $avatar );
}
add_filter( 'get_avatar', 'gregory_avatar_add_domain', 11, 1 );
les filtres posaient des problèmes avec les URL entrantes impliquant des chaînes de requête. le scheme://domain
de l'url serait haché à ://domain
seulement. il a fallu quelques heures pour identifier le problème, mais c’est dans wp-includes/canonical.php :: redirect_canonical () et un crochet de filtre permet de corriger le problème. voici le filtre:
function gregory_redirect_canonical_addScheme( $redirect_url ) {
// redirect_canonical() requires (but doesn't need) a fully qualified url.
// get_permalink() in the second iteration of redirect_canonical()
// (redirect_canonical() calls itself) usually switches to the domain specified in the
// WP Settings. but if we do the same, redirect_canonical() doesn't recognise the
// permalink as a redirect, and WP doesn't update the url in the User Agent's Address bar.
if( preg_match( '|^https?://|i', $redirect_url ))
// fully qualified url. leave it alone.
return $redirect_url;
if( substr( $redirect_url, 0, 3 ) == '://' )
// no scheme specified in $redirect during the
// second pass through redirect_canonical().
return (is_ssl() ? 'https' : 'http') . $redirect_url;
if( substr( $redirect_url, 0, 1 ) == '/' )
// root-relative url.
return (is_ssl() ? 'https://' : 'http://').$_SERVER['HTTP_Host'].$redirect_url;
// relative url. not root-relative.
return (is_ssl() ? 'https://' : 'http://').$_SERVER['HTTP_Host'].'/'.$redirect_url;
}
add_filter( 'redirect_canonical', 'gregory_redirect_canonical_addScheme', 11, 1 );
Veuillez noter que je n'ai pas encore marqué ma question comme une réponse, car je ne sais pas quelles conséquences ces filtres auront plus tard. plus de temps et de tests sont nécessaires.
à votre santé,
Gregory
(WordPress 3.3.2)
Implémenter les URL relatives aux racines était assez faisable, mais compliqué car WP était écrit pour utiliser des URL absolues et attend celles-ci. J'ai réalisé que tout ce que je voulais, c'était que les personnes visitant mon site puissent voir tous les liens utilisant le même domaine que celui spécifié. Cela n'a pas rendu obligatoire l'utilisation d'URL relatives à la racine. J'ai donc réécrit le code pour remplacer les domaines de toutes les URL pertinentes par le domaine spécifié par le visiteur. Le code complet est beaucoup plus simple !
// set the url's domain to that of the current Host, IGNORING any specified subdomains.
// (other WordPress users may need to retain the subdomains)
function gregory_use_Host_domain( $url='' ) {
$myDomains = '(?:domain1|domain2|domain3|xn--domain4|xn--domain5)';
$matches = array();
// get the current Host domain. ignore/remove any subdomain.
if( 1 != preg_match( '!.*('.$myDomains.'\.hk)!iu', $_SERVER['HTTP_Host'], &$matches )) // preg_match returns 1 if the pattern was found.
// the current Host is not one of the above specified domains! weird. this will probably never happen, but just in case...
return $url;
$thisDomain = ( is_ssl() ? 'https://' : 'http://' ).$matches[1];
if( 1 == preg_match( '!^(?:https?://[^/]*'.$myDomains.'\.hk)(/.*)?$!iu', $url, &$matches ))
// fully qualified url.
return $thisDomain.$matches[1];
if( substr( $url, 0, 1 ) == '/' )
// root-relative url.
return $thisDomain.$url;
// relative url but not root-relative.
return $thisDomain.'/'.$url;
}
add_filter( 'site_url', 'gregory_use_Host_domain', 11, 1 );
add_filter( 'home_url', 'gregory_use_Host_domain', 11, 1 );
/*
* CONTENT_URL()
* this function directly affects the template_ and stylesheet_ directory uri results,
* but they don't matter as far as the visitor is concerned. they're not going to directly
* access those particular url's.
*
* SPAM-FREE-WORDPRESS PLUGIN
* the Spam-Free-Wordpress plugin uses plugin_dir_url() and plugin_dir_path() to get the paths to its resources,
* but we're not going to worry about specifying the domain for these items.
* wp's plugin_dir_url() uses wp's plugins_url()
* wp's plugin_dir_path() uses php's dirname()
*/
// a filter to specify the 'domain1.hk' domain for WPSEO's canonical links.
// one specific domain for all content canonical links. no 'duplicate' content.
function gregory_wpseo_specify_canonical_domain( $canonical='' ) {
$matches = array();
if( 1 != preg_match( '!^(?:https?://[^/]+)(/.*)?$!iu', $canonical, &$matches ))
return $canonical;
// get_option is defined in wp-includes/functions.php and is used by get_home_url() to get the home url.
return get_option('home').$matches[1];
}
add_filter( 'wpseo_canonical', 'gregory_wpseo_specify_canonical_domain', 10, 1 );
à votre santé,
Gregory
(WordPress 3.4.2)