WordPress multisite pentru dezvoltare locală și la distanță

Publicat: 2021-07-19

Este o practică obișnuită să se utilizeze medii locale și la distanță atunci când se dezvoltă pentru web. În cazul site-urilor WordPress unice, acest lucru funcționează bine. Cu toate acestea, instalațiile WordPress multisite complică semnificativ lucrurile.

Când căutăm o soluție la problema instalărilor WordPress Multisite, am întâlnit o serie de articole scrise de John Russel la Laubster Boy. În aceste articole, el a marcat o modalitate de a rezolva această problemă pentru mediile de dezvoltare și producție la distanță, care era destul de aproape de ceea ce ne doream. Cu unele modificări, am reușit să facem lucrurile mai mult sau mai puțin sortate. Cu toate acestea, de atunci, anumite actualizări ale WordPress au rupt această soluție și a trebuit să revedem problema.

În acest articol, vă voi arăta cum am rezolvat această problemă folosind diverse resurse și un pic de jocuri.

Intenție

Vrem să putem găzdui o instalare locală a site-ului și o instalare la distanță a site-ului care ambele rulează din aceeași bază de date (la distanță).

Problemă

Configurările multisite WordPress redirecționează întotdeauna către instalarea de bază, în acest caz: la distanță. Acest lucru face dificilă lucrul la o bază de cod de dezvoltare care va reflecta exact site-ul la distanță.

Pentru a evita acest lucru, este necesar să rulați două instalații care folosesc baze de date diferite. Acest lucru poate duce la conflicte confuze și probleme de sincronizare, deoarece la fiecare modificare, atât codul, cât și bazele de date trebuie să fie combinate.

Soluţie

Vom folosi pluginul WPMU Domain Mapping.

Rețineți că câteva fișiere din acest plugin vor fi editate direct, deci este important să vă amintiți acest lucru dacă actualizați pluginul din orice motiv!

Acest proces presupune că aveți o instalare WordPress pe mai multe site-uri în mediile dvs. la distanță și locale.

Următorii pași pentru fiecare vor fi separați de local și de la distanță, deoarece este important să aveți versiuni diferite ale aceluiași fișier în fiecare locație.

Deci, cu configurarea de fundal terminată, să continuăm cu pașii!

Structură de directoare pentru multisite WordPress locale și la distanță

Pentru referință, structura fișierului pentru această configurare, atât în ​​medii locale, cât și la distanță, va fi după cum urmează:

 + - wp-config.php
|
+ - .htaccess
|
+ - conținut wp
| |
| + - răsărit de soare.php
| |
| + - pluginuri
| |
| + - wordpress-mu-domain-mapping
| |
| + - Changelog.txt
| |
| + - domain_mapping.php
| |
| + - readme.txt
| |
| + - răsărit de soare.php
| |
| + - wordpress-mu-domain-mapping.php

1. Telecomandă

Această secțiune oferă detalii despre fișierele și setările la distanță.

1.1 wp-config.php

Acest lucru nu trebuie schimbat pe serverul de la distanță.

1.2 Cartografierea domeniului WordPress MU (la distanță!)

Descărcați pluginul WordPress MU Domain Mapping de aici:

https://en-gb.wordpress.org/plugins/wordpress-mu-domain-mapping/

Instalați pe site-ul la distanță și „activați rețeaua”, astfel încât să fie activ pe toate site-urile.

1.3 răsărit de soare.php

Copiați fișierul sunrise.php din pluginul wordpress-mu-domain-mapping direct în directorul wp-content , astfel încât să fie localizat aici:

/wp-content/sunrise.php

1.4 Terminați modificările la distanță

Acum ați terminat cu editarea site-ului la distanță. Accesați câteva pagini pentru a vă asigura că nu ați rupt nimic și am terminat aici.

2. Local

Această secțiune arată ce ar trebui făcut pe localhost. O parte din cod este duplicat, dar toate sunt afișate pentru a fi complete.

2.1 wp-config.php

Copiați codul de mai jos și lipiți-l în fișierul dvs. wp-config.php. Apoi îl puteți actualiza cu detaliile de la telecomandă wp-config.php (baza de date etc.)

Va trebui să actualizați acest lucru cu detaliile bazei de date etc., dar vom ajunge cu un document similar cu cel prezentat mai jos în „ Codul 1: wp-config.php “.

Cod 1: wp-config.php


<? php

define („MEDIU”, „dezvoltare”);
define ('WP_DEBUG_LOG', adevărat);
define ('WP_DEBUG_DISPLAY', adevărat);
define ('WP_DEBUG', adevărat);

/ * Setări MySQL * /

/ ** Numele bazei de date pentru WordPress * /
define ('DB_NAME', 'mysite_db');

/ ** Nume utilizator bază de date MySQL * /
define ('DB_USER', 'mysite_user');

/ ** Parola bazei de date MySQL * /
define ('DB_PASSWORD', '***********');

/ ** Numele gazdei MySQL * /
define ('DB_HOST', 'example.com');

/ ** Set de caractere bază de date pentru utilizare la crearea tabelelor bazei de date. * /
define ('DB_CHARSET', 'utf8');

/ ** Tipul Database Collate. Nu schimbați acest lucru dacă aveți dubii. * /
define ('DB_COLLATE', ”);

define ('AUTH_KEY', '***********');
define ('SECURE_AUTH_KEY', '***********');
define ('LOGGED_IN_KEY', '***********');
define ('NONCE_KEY', '***********');
define ('AUTH_SALT', '***********');
define ('SECURE_AUTH_SALT', '***********');
define ('LOGGED_IN_SALT', '***********');
define ('NONCE_SALT', '***********');

$ table_prefix = 'wp_';

/ * Multisite * /
define ('WP_ALLOW_MULTISITE', adevărat);
define („MULTISITE”, adevărat);
define ('SUBDOMAIN_INSTALL', fals);
define ('DOMAIN_CURRENT_SITE', 'example.com');
define ('PATH_CURRENT_SITE', '/');
define ('SITE_ID_CURRENT_SITE', 1);
define ('BLOG_ID_CURRENT_SITE', 1);

define ('ADMIN_COOKIE_PATH', '/');
define ('COOKIEPATH', ”);
define ('SITECOOKIEPATH', ”);

// WPMU a împărtășit lucruri DB
define ('SUNRISE', 'on');
define ('WP_PRODUCTION_DOMAIN', 'example.com');
define ('WP_DEVELOPMENT_DOMAIN', 'mysite-local-domain');

/ * Atât, încetează editarea! Blog fericit. * /

/ ** Calea absolută către directorul WordPress. * /
if (! definit ('ABSPATH'))) {
define ('ABSPATH', dirname (__FILE__). '/');
}

/ ** Configurează WordPress WordPress și fișierele incluse. * /
require_once (ABSPATH. 'wp-settings.php');

2.2 Cartografierea domeniului WordPress MU (local!)

Adăugați același plugin pe site-ul local. Ați putea crede că asta este, conform site-ului la distanță, dar ați greși!

Deschideți fișierul domain_mapping.php în editorul dvs. preferat și editați liniile 708 și 709, astfel încât declarația întreagă if să arate astfel:

Cod 2: domeniu_mapare.php


if ($ url && $ url! = untrailingslashit ($ protocol. $ current_blog-> domeniu. $ current_blog-> cale)) {
$ redirect = get_site_option ('dm_301_redirect')? '301': '302';
if ((definit ('VHOST') && constant („VHOST”)! = 'yes') || (definit ('SUBDOMAIN_INSTALL') && constant ('SUBDOMAIN_INSTALL') == false)) {
$ _SERVER ['REQUEST_URI'] = str_replace ($ current_blog-> cale, '/', $ _SERVER ['REQUEST_URI']);
}
// header („Locație: {$ url} {$ _ SERVER ['REQUEST_URI']}”, adevărat, $ redirecționare);
// Ieșire;
}

2.3 răsărit de soare.php

Mai întâi, copiați fișierul sunrise.php din pluginul wordpress-mu-domain-mapping în directorul wp-content. S-ar putea să existe deja un fișier sunrise.php aici. Nu vă faceți griji - suprascrieți-l.

Copie de aici:

/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php

Pana aici:

/wp-content/sunrise.php

Apoi, editați acest nou fișier sunrise.php, adăugând linii în jurul liniei 40, astfel încât să arate ca codul de mai jos:

Cod 3: sunrise.php


<? php if (! defined ('SUNRISE_LOADED')) {define ('SUNRISE_LOADED', 1); } if (definit ('COOKIE_DOMAIN')) {die ('Constanta „COOKIE_DOMAIN” este definită (probabil în wp-config.php). Vă rugăm să eliminați sau să comentați linia care definește ().'); } $ wpdb-> dmtable = $ wpdb-> bază_prefix. 'domeniu_mapping';
$ dm_domain = $ _SERVER ['HTTP_HOST'];

if (($ nowww = preg_replace ('| ^ www. |', ”, $ dm_domain))! = $ dm_domain) {
$ unde = $ wpdb-> pregătiți ('domain IN (% s,% s)', $ dm_domain, $ nowww);
} altceva {
$ unde = $ wpdb-> pregătiți ('domain =% s', $ dm_domain);
}

$ wpdb-> suppress_errors ();
$ domain_mapping_id = $ wpdb-> get_var („SELECT blog_id FROM {$ wpdb-> dmtable} WHERE {$ where} ORDER BY CHAR_LENGTH (domain) DESC LIMIT 1”);
$ wpdb-> suppress_errors (false);
if ($ domain_mapping_id) {
$ current_blog = $ wpdb-> get_row („SELECT * FROM {$ wpdb-> blogs} WHERE blog_id = '$ domain_mapping_id' LIMIT 1”);
$ current_blog-> domeniu = $ dm_domain;
$ current_blog-> cale = '/';
$ blog_id = $ domain_mapping_id;
$ site_id = $ current_blog-> site_id;

define ('COOKIE_DOMAIN', $ dm_domain);

$ current_site = $ wpdb-> get_row („SELECT * din {$ wpdb-> site} WHERE id = '{$ current_blog-> site_id}' LIMIT 0,1”);
$ current_site-> blog_id = $ wpdb-> get_var („SELECT blog_id FROM {$ wpdb-> blogs} WHERE domain = '{$ current_site-> domain}' AND path = '{$ current_site-> path}'”);
if (function_exists ('get_site_option')) {)
$ current_site-> site_name = get_site_option ('site_name');
} elseif (function_exists ('get_current_site_name')) {
$ current_site = get_current_site_name ($ current_site);
}

define ('DOMAIN_MAPPING', 1);
}

/ *
* 1) COD ADAUGAT MULITIZIT
* /

// Filtrează domeniul HTML care este afișat / ieșit
add_filter ('pre_option_home', 'dev_pre_url_filter', 1);
add_filter ('pre_option_siteurl', 'dev_pre_url_filter', 1);
add_filter ('the_content', 'dev_content_filter', 100);
add_filter ('content_url', 'dev_content_url_filter', 100, 2);
add_filter ('post_thumbnail_html', 'dev_content_filter', 100);
add_filter ('wp_get_attachment_link', 'dev_content_filter', 100);
add_filter ('wp_get_attachment_url', 'dev_content_filter', 100);
add_filter ('upload_dir', 'dev_upload_dir_filter', 10);

funcția dev_pre_url_filter () {
global $ wpdb, $ cale, $ comutat;
$ url;
$ switch_path;
$ blog_id = get_current_blog_id ();

dacă (! $ comutat) {
$ url = is_ssl ()? 'https: //': 'http: //';
$ url. = WP_DEVELOPMENT_DOMAIN;
if (! is_main_site ()) {
$ url. = rtrim ($ cale, '/');
}

returnează $ url;
} altceva {
$ switched_path = $ wpdb-> get_var („SELECTează calea din {$ wpdb-> bloguri} UNDE blog_id = {$ blog_id} COMANDĂ ÎN CHAR_LENGTH (cale) DESC LIMIT 1”);
$ url = is_ssl ()? 'https: //': 'http: //';
$ url. = WP_DEVELOPMENT_DOMAIN;
$ url. = rtrim ($ switched_path, '/');

returnează $ url;
}
}

funcția dev_content_filter ($ post_content) {
global $ wpdb;

$ blog_details = get_blog_details ();
$ original_url = $ wpdb-> get_var („SELECT domeniu din {$ wpdb-> dmtable} UNDE blog_id = {$ blog_details-> blog_id} COMANDĂ ÎN CHAR_LENGTH (domeniu) DESC LIMIT 1”);
$ dev_url = WP_DEVELOPMENT_DOMAIN. $ blog_details-> cale;

if ($ original_url! == null) {
$ post_content = str_replace ($ original_url. '/', $ original_url, $ post_content);
$ post_content = str_replace ($ original_url, $ dev_url, $ post_content);
}
// Schimbați toate adresele URL pentru a indica stadiul (imagini, ancore, orice în conținutul postării)
$ post_content = str_replace (WP_PRODUCTION_DOMAIN, WP_DEVELOPMENT_DOMAIN, $ post_content);
// Schimbați adresele URL pentru „încărcări” pentru a indica producția, astfel încât imaginile să fie vizibile
$ post_content = str_replace (WP_DEVELOPMENT_DOMAIN. $ blog_details-> cale. 'wp-content / uploads', WP_PRODUCTION_DOMAIN. $ blog_details-> cale. 'wp-content / uploads', $ post_content);

returnează $ post_content;
}

/ *
* Filtrează funcția content_url - căutând în mod specific apeluri content_url („încărcare”) unde calea are încărcări în șir
*
* Adăugat pentru ca pluginurile MU să poată utiliza content_url pe DEV și PROD
* /
funcția dev_content_url_filter ($ url, $ cale) {
if (! goal ($ path) && strpos ($ path, 'uploads')! == false) {
return str_replace (WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $ url);
}

returnează $ url;
}

funcția dev_upload_dir_filter ($ param) {
$ param ['url'] = str_replace (WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $ param ['url']);
$ param ['baseurl'] = str_replace (WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $ param ['baseurl']);

returnează $ param;
}

/ *
* Înlocuire pentru /wp-includes/ms-load.php get_site_by_path
* /
function dev_get_site_by_path ($ _site, $ _domain, $ _path, $ _segments, $ _paths) {
global $ wpdb, $ cale;

// Pentru a exista o posibilă potrivire în baza de date, setați $ _domain să fie WP_PRODUCTION_DOMAIN
$ _domain = WP_PRODUCTION_DOMAIN;

// Căutați un site care să corespundă domeniului și primul segment de cale
$ site = $ wpdb-> get_row ($ wpdb-> pregătiți („SELECT * FROM $ wpdb-> bloguri WHERE domain =% s and path =% s”, $ _domain, $ _paths [0]));
$ current_path = $ _paths [0];

if ($ site === null) {
// În mod special pentru blogul principal - dacă un site nu este găsit, atunci încărcați blogul principal
$ site = $ wpdb-> get_row ($ wpdb-> pregătiți („SELECT * FROM $ wpdb-> bloguri WHERE domeniu =% s și cale =% s”, $ _domain, '/'));
$ current_path = '/';
}

// Setați calea pentru a se potrivi cu primul segment
$ cale = $ cale_curentă;

returnează $ site;
}

add_filter ('pre_get_site_by_path', 'dev_get_site_by_path', 1, 5);

3. .htaccess (local)

Introduceți următoarele în fișierul dvs. .htaccess (rețineți că directorul local a fost eliminat din linia finală index.php RewriteRule):

Codul 4: .htaccess


# ÎNCEPE WordPress
<IfModule mod_rewrite.c>;
RewriteEngine On
RewriteBase /
RewriteRule ^ index.php $ - [L]

# adăugați o bară finală la / wp-admin
RewriteRule ^ wp-admin $ wp-admin / [R = 301, L]

RewriteCond% {REQUEST_FILENAME} -f [SAU]
RewriteCond% {REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^ (wp- (conținut | admin | include). *) $ 1 [L]
RewriteRule ^ (. *. Php) $ 1 $ [L]
Rescrie Regula. /index.php [L]
</IfModule>;

# END WordPress

4. Gazde virtuale

Configurați gazde virtuale astfel încât să puteți introduce valoarea dată în wp-config.php (mai sus) pentru WP_DEVELOPMENT_DOMAIN în bara de adrese a browserului și să accesați site-ul. În mod normal, ați tasta localhost, dar acest lucru va înlocui acest lucru.

În exemplul de cod (de mai sus), gazda virtuală a fost setată să ia „price-buckland” în bara de adrese și să o trimită direct la directorul care conține WordPress.

Procesul de adăugare a gazdelor virtuale într-un mediu MAMP este după cum urmează:

1) În terminal:

 $ sudo vi / etc / hosts

2) Adăugați următoarea linie, înlocuind corespunzător pentru adresa pe care doriți să o tastați în browser:

 127.0.0.1 mysite-local-domain

3) Apoi, dorim să activăm gazde virtuale pentru mediul dvs. local, așa că deschideți următorul fișier pentru editare:

 $ sudo vi /Applications/MAMP/conf/apache/httpd.conf

Găsiți aceste linii:

 # Gazde virtuale
# Includeți /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

Și decomentați linia „Includeți”, astfel:

 # Gazde virtuale
Includeți /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

4) Acum editați următorul fișier:

 $ sudo vi /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

Și adăugați două intrări - în primul rând pentru a permite „localhost” în browserul dvs. și, în al doilea rând, pentru a adăuga noua gazdă virtuală, permițându-vă să tastați un domeniu personalizat în browser și să ajungeți la serverul dvs. local:

 DocumentRoot "/ Users / username / htdocs /"
    ServerName localhost


    DocumentRoot "/ Users / username / htdocs / mysite-local-directory"
    ServerName mysite-local-domain

5) Reporniți serverul apache. În cazul meu, MAMP, dar din linia de comandă rulați:

 apachectl restart

Dacă totul a mers bine, ar trebui să aveți acum o configurare de lucru care vă permite să codificați o instalare WordPress găzduită local, care utilizează o bază de date la distanță.

De asemenea, ar trebui să puteți împinge modificările pe serverul de la distanță și să vedeți o copie exactă pe site-ul de la distanță.

Depanare, avertismente și probleme!

Din păcate, multe (multe) lucruri pot merge prost. Iată câteva simptome și lucruri de încercat:

    1. Paginile de administrare sunt în regulă, dar nu pot vizita nicio pagină front-end internă!
    2. .htaccess fie lipsește, fie nu a fost inițializat. Adăugați fișierul și salvați din nou legăturile permanente.
    3. În curând mai multe!

Când lucrați pe site-ul dvs. local, dacă mergeți la:

 Site-urile mele> Administrator rețea> Tablou de bord

Vă va duce la site-ul la distanță, adică:

 example.com/wp-admin/network

Este posibil să nu fie ceea ce doriți, dar puteți tasta direct în bara de adrese și să rămâneți în mediul local, adică:

mysite-local / wp-admin / network

Concluzie

Dacă totul a mers bine, ar trebui să aveți acum o configurare funcțională care vă permite să codificați o instalare WordPress găzduită local, care utilizează o bază de date la distanță.

De asemenea, ar trebui să puteți împinge modificările pe serverul de la distanță și să vedeți o copie exactă pe site-ul de la distanță.

Spuneți-ne cum ați început să urmați acest ghid pas cu pas către WordPress multisite pentru dezvoltare locală și la distanță în comentariile de mai jos!


Dacă aveți nevoie de ajutor pentru dezvoltarea dvs. web, nu ezitați să ne contactați.