webentwicklung-frage-antwort-db.com.de

stamm-relative Links für mehrere geparkte Domains

Ich habe fünf Domänen, die auf dieselbe Server-/WP-Installation verweisen. Die Domain-Namen sind wichtig und meine Besucher müssen in der Lage sein, auf ihrer bevorzugten Domain zu bleiben, wenn sie auf meiner Website surfen.

wie richte ich wp (oder .htaccess oder ...) so ein, dass alle Links auf die vom Besucher angegebene Domain/Host verweisen?

im Moment, wenn ich Dashboard/General/Site Address auf setze site-A.comund ich lade die Seite als site-B.comDie Links verweisen immer noch auf site-A.com anstatt site-B.com; zB http://site-B.com/blog/this-is-my-home/ laden. Die Links innerhalb der geladenen Seite verweisen weiterhin auf site-A.com anstatt site-B.com.

in meinem alten MT System konnte ich alle Links als root-relativ definieren, sodass alle Links auf die aktuelle Domain verweisen. ist das mit WP möglich?

prost,
Gregory

2
Gregory

Ich verfolgte die Funktionsaufrufe in meinem Theme (ein untergeordnetes Theme von Oenology by Chip Bennett) und in wp-include, die die Links generierten, fand die Funktion home_url() und schrieb dann die folgenden Funktionen für meine Site:

function gregory_make_relative($url='') {
    return preg_replace( '#^https?://[^/]+/#iu', '/', $url, 1 );
}
add_filter( 'home_url', 'gregory_make_relative', 11, 1 );

Ich habe absichtlich nach dem/nach der Domain gesucht, damit ich home_url('') verwenden kann, um die angegebene Domain des Blogs zurückzugeben, und mithilfe der folgenden Funktionen (dh der kanonischen Links) über WordPress SEO echte kanonische URLs zu dieser Domain im <head> angeben kann wird unabhängig von der Domain, die zum Laden der Seite verwendet wird, gleich sein (dh kein "doppelter Inhalt"):

function gregory_wpseo_canonical_add_domain( $canonical ) {
    return home_url('').$canonical;
}
add_filter( 'wpseo_canonical', 'gregory_wpseo_canonical_add_domain', 10, 1 );

bisher funktioniert es sehr gut, aber ich frage mich, ob es sich nachteilig auf Feeds oder die E-Commerce-Lösung auswirkt, die ich schließlich implementiere. Kommentare, Hinweise, Tipps, Warnungen sind willkommen :-)

Aktualisieren

eine einfache home_url() (d. h. kein Pfad angegeben) wird im gesamten System verwendet, so dass das nachfolgende/in der grep-Suche nicht verwendet werden konnte. Ich musste es entfernen und einen anderen Weg finden, um die Domain in der kanonischen URL zu spezifizieren. Also, ein bisschen mehr Forschung durch WP-Includes, und jetzt sehen die Funktionen so aus:

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


Update 2

es ist schwieriger als es zuerst erschien ;-) mein code sieht nun so aus. Feeds sind betroffen. irgendwo in der Funktionskette, die die Links erzeugt, scheinen Feeds _SERVER ['HTTP_Host'] zu verwenden. Ich werde dort meine Möglichkeiten prüfen müssen.

/* 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 );


Update 3 - WPSEO

in WPSEO gibt es eine Option zum Hinzufügen von Text/Links vor und nach RSS-Posts, einschließlich der Option, Platzhalter zu verwenden. Einer dieser Platzhalter ist %%BLOGLINK%%. Leider hat %% BLOGLINK %% mit den Root-relativen Filtern eine leere Zeichenfolge erzeugt, die in den Feeds nicht nützlich war. Dieser Code behebt das Problem (ich habe auch bemerkt, dass ich den Link in den RSS-Einstellungen von WPSEO nur hart codiert habe, wahrscheinlich ist das klüger :-)

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

(Ich habe mich seitdem entschieden, meine RSS-After-Post-Nachricht fest zu codieren, daher wurde der oben genannte Filter in meinem Thema deaktiviert.)


Update 4 - aus preg_replace () wird preg_match ()

Ich habe die in Update 2 gezeigte Funktion gregory_make_stylehref_relative() aktualisiert, um preg_match() anstelle von preg_replace() zu verwenden. Das ist der alte Code:

    $href = preg_replace( '#^(.+ +href=\')(.+)(\' +type=.+)$#iu', '$2', $tag );
    $href = gregory_make_relative($href);
    return preg_replace( '#^(.+ +href=\')(.+)(\' +type=.+)$#iu', '$1'.$href.'$3', $tag );


Update 5 - get_avatar ()

ein weiterer Filter, diesmal für get_avatar (), damit das Schema und die aktuelle Domain im Pfad zu wps blank.gif enthalten sind. ohne diese wird das gif nicht gefunden und geladen. Ohne das Schema lädt Gravatar stattdessen seinen eigenen Unternehmens-Avatar.

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


Update 6 - redirect_canonical ()

die Filter verursachten Probleme mit eingehenden URLs, die Abfragezeichenfolgen betrafen. der scheme://domain der url wird auf ://domain gekürzt. Es dauerte ein paar Stunden, um das Problem zu lokalisieren, aber es befand sich in wp-includes/canonical.php :: redirect_canonical () und ein Filter-Hook ermöglichte es, das Problem zu beheben. Hier ist der Filter:

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


Bitte beachten Sie, dass ich meine Frage noch nicht als beantwortet markiert habe, da ich nicht weiß, welche Konsequenzen diese Filter später haben werden. Mehr Zeit und Tests sind erforderlich.

prost,
Gregory
(WordPress 3.3.2)

2
Gregory

Zurück zur absoluten URL

Das Implementieren von root-relativen URLs war ziemlich machbar, aber kompliziert, da WP geschrieben wurde, um absolute URLs zu verwenden, und absolute URLs erwartet. Mir wurde klar, dass ich nur wollte, dass die Besucher meiner Website alle Links sehen können, die dieselbe Domain wie die angegebene verwenden. Dies erforderte keine Verwendung von root-relativen URLs. Daher habe ich den Code umgeschrieben, um die Domains in allen relevanten URLs durch die vom Besucher angegebene Domain zu ersetzen. Der vollständige Code ist viel einfacher !

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

prost,
Gregory
(WordPress 3.4.2)

0
Gregory