wake-up-neo.net

Wildcard-Subdomain für dieselbe Site

Gibt es eine Möglichkeit, alle Anfragen an eine Subdomain zum Laden derselben Wordpress-Website zu veranlassen, z. user1.example.com, user2.example.com und user3.example.com laden alle dieselbe Website, aber mit den Links, die auf die aktuelle Unterdomäne verweisen?

Ich würde gerne die meisten Inhalte auf den verschiedenen Websites beibehalten. Der einzige Unterschied besteht darin, dass ich durch Lesen der Unterdomäne dem betreffenden Benutzer angepassten Inhalt (Website-Titel usw.) anbieten oder einen Haken hinzufügen kann, um eine Fehlermeldung anzuzeigen, wenn der Benutzer nicht vorhanden ist. Im Moment erfordert die Netzwerkinstallation, dass ich jede Website mit unterschiedlichen Inhalten manuell definiere.

5
Zahymaka

In WordPress können Sie dies problemlos mit Unterverzeichnissen wie example.com/user1 tun.

Subdomain- & URL-Strategie Mit username.domain.com können Sie zukünftig keine eigenen Subdomains wie shop.example.com mehr haben und werden geplagt, wenn Sie www.example.com oder nur http://example.com verwenden möchten.

Endlich ... was ist, wenn einige Benutzer Expletiva oder Sonderzeichen in ihrem Benutzernamen <verwenden möchten - nicht sehr gut.

Verkehrslast Subdomains werden von DNS-Servern auf der ganzen Welt analysiert, um herauszufinden, wie der Verkehr weitergeleitet wird. Wenn Sie viele Unterdomänen verwenden möchten, erhöht dies auch die Belastung Ihres Apache-Webservers, da er versucht, herauszufinden, was mit someusername123456789.example.com zu tun ist.

Aber um dies zu tun, müssten Sie sich Skripte, htaccess und Rewrite-Regeln ansehen, und dann ist diese Frage wahrscheinlich besser für ein anderes Forum geeignet.

Unterverzeichnisse sind einfach zusammen mit URL-Parametern
Man kann mit Sicherheit sagen, dass Unterverzeichnisse einfach sind (WordPress Author-Seiten als Beispiel), und dann kann WordPress dies analysieren und bestimmen, was zu tun ist.

Sie können sogar URL-Parameter wie www.example.com/category/?user=username123456789 verwenden.

Zusammenfassend lässt sich sagen, dass Subdomains für Benutzernamen keine Probleme verursachen können, die Sie nicht möchten.

2
Damien

Für mich klingt es so, als wäre dies besser für eine Installation an einem einzigen Standort als für eine Installation an mehreren Standorten geeignet. Aber es kommt wirklich darauf an, wie individuell die Dinge für einen einzelnen Benutzer sein müssen.

ANMERKUNG: Diese Antwort enthält keine Informationen zur Serverkonfiguration usw.

Zunächst einmal würde ich WP_HOME und WP_SITEURL in wp-config.php definieren und sie unverändert lassen. Sie können diese wahrscheinlich dynamisch festlegen, aber das Ergebnis muss sein, dass sie auf die Haupt-Root-Domäne verweisen. Meine lokale WP -Installation ist wordpress.dev, daher werde ich das in dieser Antwort verwenden.

Beispiel:

<?php
// in wp-config.php
define('WP_HOME', 'http://wordpress.dev');
define('WP_SITEURL', WP_HOME . '/wp'); // wp in sub directory

// custom content directory
define('WP_CONTENT_DIR', dirname(__FILE__) . '/content');
define('WP_CONTENT_URL', WP_HOME . '/content');

Als nächstes müssen wir den Benutzer basierend auf der aktuellen Subdomain einstellen. Dies sollte relativ einfach sein: Analysieren Sie den HTTP-Host, suchen Sie nach einem Benutzer mit diesem Benutzernamen und legen Sie diesen Benutzer als späteren Benutzer fest. Ich würde vorschlagen, alles in eine Klasse zu packen (ein Singleton hier).

<?php
class WPSE66456
{
    // container for an instance of this class
    private static $ins;

    // The current user, based on subdomain.
    private $user = null;

    /***** Singleton Pattern *****/

    public static function init()
    {
        add_action('plugins_loaded', array(__CLASS__, 'instance'), 0);
    }

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    /**
     * Constructor.  Actions really get added here.
     *
     */
    protected function __construct()
    {
        // empty for now...
    }
} // end class

Dann müssen wir etwas schreiben, um $_SERVER['HTTP_Host'] zu analysieren und zu sehen, ob wir einen gültigen Benutzernamen erhalten.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
    }

    protected function set_current_user($Host)
    {
        if(!is_null($this->user))
            return;

        list($user, $Host) = explode('.', $Host, 2);

        // gets tricky here.  Where is the real site? Is it at the root domain?
        // For the purposes of this tutorial, let's assume that we're using a
        // nacked root domain for the main, no user site.

        // Make sure the $Host is still a valid domain, if not we're on the root
        if(strpos($Host, '.') === false)
        {
            $this->user = false;
        }
        else
        {
            if($u = get_user_by('slug', $user))
            {
                // we have a user!
                $this->user = $u;
            }
            else
            {
                // invalid user name.  Send them back to the root.
                wp_redirect("http://{$Host}", 302);
                exit;

                // Or you could die here and show an error...
                // wp_die(__('Invalid User'), __('Invalid User'));
            }
        }
    }
}

Jetzt, da Sie einen Benutzernamen haben, können Sie alle möglichen Dinge tun. Lassen Sie uns als Beispiel den Blog-Slogan in eine Begrüßung für diesen Benutzer ändern.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
        add_filter('bloginfo', array($this, 'set_tagline'), 10, 2);
    }

    // snip snip

    public function set_tagline($c, $show)
    {
        if('description' != $show || !$this->user)
            return $c;

        return 'Hello, ' . esc_html($this->user->display_name) . '!';
    }
}

Unter der Annahme, dass Sie die Root-URL (ohne www) für Ihre Installation verwenden, sendet WordPress Cookies an alle Sudomains. Auf diese Weise können Sie überprüfen, ob ein Benutzer seine eigene Unterdomäne anzeigt, und diese andernfalls zurück in den Stammordner werfen.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
        add_filter('bloginfo', array($this, 'set_tagline'), 10, 2);
        add_action('init', array($this, 'check_user'), 1);
    }

    // snip snip

    public function check_user()
    {
        if($this->user === false || current_user_can('manage_options'));
            return; // on the root domain or the user is an admin

        $user = wp_get_current_user();

        if(!$user || $user != $this->user)
        {
            wp_redirect(home_url());
            exit;
        }
    }
}

Als letztes müsste berücksichtigt werden, dass WordPress Dinge in Benutzernamen zulässt, die mit dem Domain Name System nicht funktionieren. Wie user.one ist ein gültiger Benutzername. Aber user.one.yoursite.com ist zwei Subdomains tief und wird nicht funktionieren.

Sie müssen sich also in pre_user_login einbinden und Dinge bereinigen.

<?php
class WPSE66456
{
    // snip snip

    protected function __construct()
    {
        $this->set_current_user($_SERVER['HTTP_Host']);
        add_filter('bloginfo', array($this, 'set_tagline'), 10, 2);
        add_filter('pre_user_login', array($this, 'filter_login'));
        add_action('init', array($this, 'check_user'), 1);
    }

    // snip snip

    public function filter_login($login)
    {
        // replace anything that isn't a-z and 0-9 and a dash
        $login = preg_replace('/[^a-z0-9-]/u', '', strtolower($login));

        // domains can't begin with a dash
        $login = preg_replace('/^-/u', '', $login);

        // domains can't end with a dash
        $login = preg_replace('/-$/u', '', $login);

        // probably don't want users registering the `www` user name...
        if('www' == $login)
            $login = 'www2';

        return $login;
    }
}

alle oben genannten als plugin .

Es gibt viele Bedenken, die in dieser Antwort nicht angesprochen werden. Skaliert diese auf die Stelle, an der sie skaliert werden soll? Wie wirkt es sich auf die Suchoptimierung aus, wenn mehrere Subdomains mit sehr ähnlichen Inhalten vorhanden sind? Wie viel Inhalt wird angepasst? Wenn es viel ist, wäre Multi-Site besser für diese Aufgabe geeignet?

2
chrisguitarguy