web-dev-qa-db-fra.com

Quelle est la meilleure façon de charger le WP environnement dans un sous-domaine de mon installation Wordpress multisite?

J'ai un dossier d'installation de WP multisite, par exemple sur "domain.com".

Je dois maintenant charger l'environnement WP dans les sous-domaines de domain.com, par exemple "sub1.domain.com", "sub2.domain.com", ... "subN.domain.com". Notez que ces sous-domaines ne correspondent pas à WP blogs. Mais je dois avoir accès à l'utilisateur connecté, à la base de données, etc.

J'ai configuré des sous-domaines génériques pour charger un fichier php qui affiche ce dont j'ai besoin pour n'importe quel sous-domaine particulier, et j'inclus "wp-load.php" au début de ce fichier. Le problème est que près de la ligne 99 dans "ms-settings.php", il redirige vers la page principale du site car $ _SERVER ['HTTP_Host'] est le sous-domaine, pas le domaine du site principal.

Alors, comment puis-je charger correctement l'environnement WP dans un sous-domaine autre qu'un blog?

J'ai un prototype qui fonctionne, mais je m'inquiète des effets secondaires de ce que je fais. Ce serait formidable si une personne connaissant le noyau pouvait intervenir.

Ce que je fais est de pré-remplir correctement les globales $ current_site et $ current_blog avant d'inclure "wp-load". Ensuite, "ms-settings" n'essaie pas de créer ces fichiers et n'atteint pas le chemin du code qui détecte le sous-domaine et redirige vers la page d'accueil.

Je peux maintenant accéder aux informations sur les membres (par exemple, avec "get_userdata") et $ wpdb.

Cela vous semble-t-il une approche raisonnable?

5
Greg

Utilisez les définitions pour choisir le site que vous souhaitez sélectionner.

Vous pouvez définir ces quatre éléments pour configurer correctement les valeurs $ current_site: DOMAIN_CURRENT_SITE, PATH_CURRENT_SITE, SITE_ID_CURRENT_SITE, BLOG_ID_CURRENT_SITE.

Si vous cochez la fonction wpmu_current_site () dans ms-load.php, vous verrez qu’elle les utilise pour créer le global $ current_site global.

Il se peut que vous deviez ou non renseigner le $ global_blog global manuellement. Pas certain. Essayez et voyez.

Donc, de manière réaliste, tout ce que vous avez à faire est d’ajouter quelque chose comme ceci avant d’appeler wp-load.php:

define( 'DOMAIN_CURRENT_SITE', 'example.com' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );

Avec les bonnes valeurs pour votre site principal exemple.com, bien sûr.

Si vous ne voulez pas les mettre eux-mêmes dans les fichiers php du sous-domaine, vous pouvez le faire dans le fichier wp-config.php ou sunrise.php (si vous définissez SUNRISE sur true dans le fichier wp- config.php aussi, bien sûr).

if ( $_SERVER['HTTP_Host'] == 'sub1.example.com' || 
     $_SERVER['HTTP_Host'] == 'sub2.example.com') {
    define( 'DOMAIN_CURRENT_SITE', 'example.com' );
    define( 'PATH_CURRENT_SITE', '/' );
    define( 'SITE_ID_CURRENT_SITE', 1 );
    define( 'BLOG_ID_CURRENT_SITE', 1 );
}

C’est à peu près ce que le chargement de fichiers sunrise a pour but de permettre un emplacement où vous pouvez remplacer manuellement des éléments comme celui-ci. L'avantage d'utiliser sunrise.php par rapport à wp-config.php (qui fonctionne également) est que vous pouvez facilement activer et désactiver sunrise ailleurs, pour les tests et le débogage, etc.

3
Otto

Vous pourriez essayer Wordpress Mu Domain Mapping plugin.

Mise à jour

En fait, cela correspond mieux à votre demande d'inclure wp-blog-header.php en haut de votre fichier php de votre sous-domaine, afin que vous puissiez également charger les fonctions de modèle.

    include(dirname(__FILE__) . "/../path_to_my_blog/wp-blog-header.php");

Ou vous pouvez faire un wp_redirect après l'inclusion de wp-load.php

2
konus

J'essayais la même chose que celle posée dans cette question et je ne pouvais pas contourner la redirection tant que je n'avais pas imité les vars $ _SERVER avant d'inclure wp-load.php:

define('WP_USE_THEMES', false);
define( 'DOMAIN_CURRENT_SITE', $siteRow['domain'] );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', $siteRow['wp_blog_id'] );

$_SERVER = array(
    "HTTP_Host" => $siteRow['domain'],
    "SERVER_NAME" => $siteRow['domain'],
    "REQUEST_URI" => "/",
    "REQUEST_METHOD" => "GET"
);

Le tableau $ siteRow est ma propre configuration de site, mettez à jour les variables avec ce dont vous avez besoin. Pas de redirection, et toutes les WP à votre disposition! Prendre plaisir.

0
Dunhamzzz

J'utilise actuellement une instruction switch pour définir le DOMAIN_CURRENT_SITE

Je l'ai configuré pour fonctionner lorsqu'il est déployé sur le serveur en direct. Le commutateur définit également DOMAIN_CURRENT_SITE lorsque je travaille localement sur ma machine de développement. (ainsi que tous les domaines de premier niveau .dev)

Après l’instruction switch, je définis les autres éléments qui ne changent pas mais sont liés au multisite.

switch ($_SERVER['SERVER_NAME']) {
    case 'sub1.mydomain.com':
    case 'sub2.mydomain.com':
    case 'community.mydomain.com':
        define('DOMAIN_CURRENT_SITE', 'community.mydomain.com');
        break;
    case 'sub1.mydomain.dev':
    case 'sub2.mydomain.dev':
    case 'community.mydomain.dev':
        define('DOMAIN_CURRENT_SITE', 'community.mydomain.dev');
        break;
    default:
        define('DOMAIN_CURRENT_SITE', 'community.mydomain.com');
        break;
}

define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

Bien sûr, ce fichier wp-config.php contient plus de paramètres, mais je n’en ai pas inclus, car ils ne sont pas spécifiques aux installations WP MULTISITE.

Remarque: lorsque vous travaillez localement (après avoir téléchargé le dernier fichier SQL. Je dois effectuer d’énormes opérations de recherche-remplacement sur la base de données, cela n’a aucun rapport avec votre question, mais je vais laisser l’extrait wp-cli.org ci-dessous)

wp search-replace 'community.mydomain.com' 'community.mydomain.dev' --network --dry-run
wp search-replace 'sub1.mydomain.com' 'sub1.mydomain.dev' --network --dry-run
wp search-replace 'sub2.mydomain.com' 'sub2.mydomain.dev' --network --dry-run
0
andxyz