web-dev-qa-db-fra.com

comment utiliser un domaine/sous-domaine différent pour les auteurs/catégories sur un seul site?

Je ne suis pas sûr d'avoir bien formulé cette question ...

Ma femme et moi avons un blog family.com dans cet exemple, auquel nous contribuons tous les deux.

J'aimerais que family.com affiche tous les articles du blog.

me.family.com n'affichera que les messages dont je suis l'auteur et her.family.com affichera uniquement les messages de son auteur. plus tard, nous ajouterons kid1.family.com et ainsi de suite ...

de plus, parfois elle/je/nous faisons des projets qui vont au-delà d’un poste. project1.com n'affichera que tous les articles de la catégorie 'projet1'. Cependant, contrairement aux auteurs, seules des catégories spécifiques auraient leur propre nom de domaine.

wp-subdomains-revisited plus système de cartographie de domaine utilisés ensemble semblent plus proche de ce que je cherche mais ils sont obsolètes et je suis sûr que je ne pourrais pas les reproduire moi-même.

Edit 1: J'ai trouvé cette réponse merveilleuse de mikeschinkel : Nom de domaine multiple - Un WP Installation (non multisite) - Par défaut chaque nom de domaine dans l'archive des catégories

Edit 2: Le code de mikeschinkel fonctionne sur mon site. Génial! Maintenant, j'ai essayé de le modifier pour qu'il fonctionne également avec les sous-domaines. Cela ne s’est pas si bien passé - seule une page blanche se charge lorsque mes modifications sont en place.

Edit 3: Le site se recharge à nouveau avec des domaines et sous-domaines de travail! C'est excitant!

La tâche suivante consiste à faire en sorte que tous les liens utilisent leur domaine/sous-domaine respectif. Par exemple, un post jour férié écrit par me et dans la catégorie project1 devrait apparaissent sous la forme family.com/holiday, me.family.com/holiday ou project1.com/holiday en fonction du sous/domaine auquel il est lié. Toutes les suggestions seraient grandement appréciées !!!

(également, il devra fonctionner avec WPML -> me.family.com/holiday, une fois traduit, devrait devenir her.family.com/日/ ... effrayant!)

Edit 4: Juste pour clarifier, sur le plan fonctionnel, cela ne devrait pas être différent de la visualisation d’un auteur individuel ou d’une archive de catégorie, la seule différence étant que l’archive aura son propre sous-domaine/domaine.

De plus, mon TLD est . Is ... et mon domaine est mon nom de famille. Cela signifie que mon URL est à mi-chemin pour être une phrase -> _adam.rabbit.is/...

Le but est d'avoir une URL spécifique à n'importe quelle relation:
adam.rabbit.is/gardening
wife.rabbit.is/coding
rabbit.is/travelling

Edit 5: Code mis à jour - fonctionne principalement maintenant. Je suis réticent à le marquer comme résolu parce que je n'ai ni supprimé la catégorie de base, ni ajouté d'en-tête/titre séparé pour chaque page ... mais tel quel, ce code fonctionne et résout la question principale du message. J'espère que quelqu'un d'autre le trouvera utile :)

Edit 6: J'ai trouvé un plugin Nice appelé wp-no-base-permalink qui supprime la base de la catégorie. J'ai mis à jour le code pour fonctionner avec ce plugin. Maintenant, si je tape adam.rabbit.is/uncategorized, il affiche tous les messages non classés par moi - exactement ce que je cherchais!

réponse ci-dessous...

1
adammoore

wp-config.php

if ( is_alt_domain( $_SERVER['SERVER_NAME'] ) ) {
    $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
    define( 'WP_SITEURL', 'http://www.' . $domain );
    define( 'WP_HOME', 'http://www.' . $domain );
} else if (is_sub_domain( $_SERVER['HTTP_Host'] ) ) {
    $domain = "{$_SERVER['HTTP_Host']}";
    define( 'WP_SITEURL', 'http://' . $domain );
    define( 'WP_HOME', 'http://' . $domain );
} else if (! (is_main_domain( $_SERVER['SERVER_NAME']) ) ) {
    Header( "HTTP/1.1 301 Moved Permanently" );
    Header( "Location:http://family.com", true, 301 );
    exit;
}
function is_main_domain( $domain ) {
    $domain = $_SERVER['HTTP_Host'] ;
    return strcmp( $domain, my_main_domain() ) == 0 ;
}
function is_sub_domain ( $domain ) {
    $domain = str_replace( my_main_domain(), '', $_SERVER['HTTP_Host'] );
    return in_array( substr( $domain, 0, -1), sub_domains() );
}
function is_alt_domain( $domain ) {
    $domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
    $domain = substr( $domain, 0, strrpos( $domain, '.') );
    return array_key_exists( $domain, alt_domains() );
}
function sub_domains() {
    return array(
        'me',
        'her',
        'kid1',
    );
}
function alt_domains() {
    return array(
        'project1' => 'com',
        'project2' => 'com',
        'project3' => 'is',
    );
}
function my_main_domain() {
    return 'family.com';
}

functions.php

// this seems to be important
update_option('siteurl','http://' . $_SERVER["HTTP_Host"]);
update_option('home','http://' . $_SERVER["HTTP_Host"]);

add_action( 'category_link', 'yoursite_category_link', 11, 2 );
function yoursite_category_link( $category_link, $category_id ) {
    $parts = explode( '/', $category_link );
    // if %category% in http://%domain%/%category%/
    // is in alt_domains() update the category_link
    if ( array_key_exists("{$parts[3]}", alt_domains() ) ) {
        $tld = alt_domains()[$parts[3]];
        $category_link = "http://www.{$parts[3]}.{$tld}/"; // Strip 'category/%category%/'
    }
    return $category_link;
}

add_action( 'author_link', 'yoursite_author_link', 11, 2 );
function yoursite_author_link( $author_link, $author_id ) {
    $parts = explode( '/', $author_link );
    // if %author% in http://domain/author/%author%/
    // is in sub_domains() update the author_link
    if ( "{$parts[3]}" == "author" && in_array("{$parts[4]}", sub_domains() ) ) {
        $author_link = "http://{$parts[4]}.family.com/"; // Strip 'author/%author%/'
    } else {
        $author_link = "http://family.com/author/{$parts[4]}"; // Strip 'author/%author%/'
    }
    return $author_link;
}

add_action( 'init', 'yoursite_init' );
function yoursite_init() {
    // Remove the canonical redirect to the category page
    // if %category% in http://%category%.%ext%/ is a blogger category
    if ( is_alt_domain( $_SERVER['SERVER_NAME'] ) || is_sub_domain( $_SERVER['HTTP_Host'] ) ) {
        $parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
        if ( (count($parts) > 1) &&  ( array_key_exists("{$parts[1]}",alt_domains() ) || ( "author" == $parts[1] && in_array("{$parts[2]}", sub_domains() ) ) ) ) {
            remove_filter( 'template_redirect', 'redirect_canonical' );
        }
    }
}

add_action( 'template_redirect', 'yoursite_template_redirect' );
function yoursite_template_redirect() {
    // Redirect any http://%domain%.%ext%/%category%/ to http://%category%.%ext%/
    // and any http://%domain%.%ext%/author/%author%/ to http://%author%.%domain%.%ext%
    $parts = explode( '/', strtolower( $_SERVER['REQUEST_URI'] ) );
    if ( array_key_exists( "{$parts[1]}", alt_domains()) ) {
        $tld = alt_domains()[$parts[1]];
        wp_redirect( "http://www.{$parts[1]}.{$tld}/", 301 );
        exit;
    } else if ( 'author' == $parts[1] && in_array("{$parts[2]}", sub_domains() ) ) {
        wp_redirect( "http://{$parts[2]}.famliy.com/", 301 );
        exit;
    }
}

add_action( 'request', 'yoursite_request' );
function yoursite_request($query_vars) {
    // If %category% in http://%category%.%ext%/ is a blogger category set the
    // 'category_name' query var to tell WordPress to display the category page.
    if ( is_alt_domain( $_SERVER['SERVER_NAME']) || is_sub_domain( $_SERVER['HTTP_Host'] ) ) {
        $category_domain = str_replace( 'www.', '', $_SERVER['SERVER_NAME'] );
        $category_domain = substr( $category_domain, 0, strrpos( $category_domain, '.' ) );
        $author_name = substr( $_SERVER['HTTP_Host'], 0, strpos( $_SERVER['HTTP_Host'], '.' ) );
        $parts = explode( '/', $_SERVER['REQUEST_URI'] );
        $category_name = "{$parts[1]}";
        if ( array_key_exists($category_domain, alt_domains()) ) {
            if ( strlen( $category_name ) < 1  ) {
                $query_vars = array( 'pagename' => $category_domain.'-page' );
            } else if ( term_exists("{$category_name}", 'category') ) {
                $query_vars = array(
                    'category__and' => array(
                        get_category_by_slug($category_domain)->term_id,
                        get_category_by_slug($category_name)->term_id
                    )
                );
            }
        } else if ( in_array( $author_name, sub_domains() ) ) {
            if ( strlen( $category_name ) < 1  ) {
                $query_vars = array( 'pagename' => $author_name.'-page' );
            } else if (term_exists("{$category_name}", 'category') ) {
                $query_vars = array(
                    'category_name' => $category_name,
                    'author_name' => $author_name
                );
            }
        }
    }
    return $query_vars;
}

Et, bien sûr, vous devez également pointer vos sous-domaines (ou *) sur votre serveur de noms vers votre installation wordpress. Vous devrez également ajouter un hôte virtuel (Nginx) pour tous les autres domaines que vous utilisez ... et vous devrez configurer CORS.

En remarque, cette réponse utilisée conjointement avec ma réponse suivante/ma question - Comment avoir une page statique catégorie/auteur? - devrait faire mes intentions d'avoir un site multi-faces un peu plus clair :)

0
adammoore

Y a-t-il une raison pour laquelle vous avez besoin de sous-domaines plutôt que de "sous-répertoires" (je l'ai mis entre guillemets, car ce ne sera pas réellement un sous-répertoire réel ... continuez à lire)? Ce serait beaucoup plus facile si vous vouliez aller avec family.com/me, family.com/her, family.com/project1, etc ...

En empruntant cette voie, vous pourriez créer des modèles de page dotés de boucles personnalisées en utilisant WP_Query et assignez-les aux pages dans WP Admin. Si vous utilisez de jolis permaliens, vous pouvez nommer la page comme bon vous semble et vous obtiendrez un joli lien.

Honnêtement, je ne vois pas comment cela serait possible avec les sous-domaines, mais c'est moins une question WP que davantage une question de gestion de domaine/serveur.

1
brianjohnhanna

Le meilleur moyen de séparer les sites entre les sites consiste à séparer leurs bases de données. En règle générale, il est plus facile d’agréger le contenu séparément: recherche, flux RSS, partage de réseaux sociaux et SEO, il peut être nécessaire que le référencement se comporte différemment selon les sous-domaines. les mecs".

La solution la plus simple consiste à utiliser wordpress en mode réseau, puis, chaque fois que vous en avez besoin, écrivez ou trouvez un plug-in qui importera automatiquement le contenu du "blog source" sur le bon site d'agrégation.

0
Mark Kaplun

Certes, une solution intelligente, et qui fonctionne bien dans le cadre de votre question initiale. Pour les futurs lecteurs avec une référence similaire aux cas d'utilisation, je suggérerais qu'ils envisagent également de créer une installation multisite (réseau).

Lorsqu'il est utilisé uniquement pour les sites de sous-domaines (c'est-à-dire sans mappage de domaine), il n'est pas beaucoup plus difficile à créer et à gérer qu'une installation standard. Vous avez alors une portée beaucoup plus large pour développer chaque sous-site comme vous le souhaitez, et beaucoup plus de flexibilité (thèmes entièrement différents, etc.). Sans parler d'un arrangement de contenu plus logique et facile à gérer. Le multisite est également beaucoup plus extensible - ajoutez un mappage de domaine et vous pouvez ajouter votre site professionnel, d'autres amis, des groupes sportifs, etc. sur le compte d'hébergement et la connexion de l'administrateur.

Le plug-in ThreeWP Broadcast est une excellente solution pour la publication de messages sur tous les sites adaptés au sujet, etc., ainsi que des lectures de fond démontrant le champ d'application du multisite.

J’ai seulement l’impression que dans le futur, le trafic le plus fréquenté par ce poste (en raison du titre) concernera des personnes pour qui le multisite convient bien, mais qu’il est souvent négligé.

http://codex.wordpress.org/Create_A_Network

http://plugins.plainview.se/threewp-broadcast/

0
Steve82