2012-10-18 8 views
7

per fare sviluppo locale su un sito WordPress (http://www.example.com), ero in precedenza sovrascrivendo i valori WP_SITEURL e WP_HOME in wp-config.php in questo modo:Override WP_SITEURL e WP_HOME per WordPress multisito

define('WP_SITEURL', 'http://local-example/'); 
define('WP_HOME', 'http://local-example/'); 

Questo mi avrebbe permesso di copiare il database e file del sito su un server locale e apportare le modifiche necessarie, testando l'installazione locale.

È stato quindi necessario convertire l'installazione in un multiutente WordPress in modo che utenti, autenticazione, plug-in, ecc. Possano essere condivisi tra il sito principale e un sito secondario, ospitato su un sottodominio (http://second.example.com).

Il metodo di cui sopra per ignorare i valori della tabella wp_options non funziona più, ma sono incerto il modo corretto di impostare un valore per le voci wp_blogs così come il tavolo wp_2_options per la primaria e sottodominio.

L'aggiornamento del file HOSTS è un po 'una soluzione alternativa, ma non ideale (non sono in grado di confrontare il sito attivo, ecc.). L'esecuzione di uno script per modificare i valori del database è un'altra opzione che ho provato, ma è leggermente più ingombrante, quindi le mie domande sono se c'è un'opzione in MultiSite per sovrascrivere questi valori in un file di impostazioni, come wp-config.php, e se è così come sarebbe.

risposta

9


Aggiornamento: piena codice del plugin aggiornato con descrizione aggiuntiva può essere trovato qui: http://justinsilver.com/technology/wordpress/wordpress-plugins/wordpress-plugin-wp-server-migration/
sono stato in grado di trovare una soluzione con l'aiuto di @ user916011. Avevo bisogno di essere in grado di copiare le tabelle wp_options nel mio ambiente di sviluppo in quanto contengono configurazioni necessarie. Per superare il problema di non essere in grado di impostare i valori WP_SITEURL e WP_HOME in MultiSite, ho scritto un filtro personalizzato per sostituire le funzioni _config_wp_siteurl() e _config_wp_home() disponibili per le installazioni non multiple che sono incluse in un plug-in disponibile a livello di rete ed è configurato in wp-config.php. Sono quindi in grado di copiare tutte le tabelle del database eccetto wp_site e wp_blogs in un database locale.

Consiglio vivamente l'articolo URL Token Replacement Techniques for WordPress 3.0 di Chris Murphy per gestire gli URL nei contenuti.

Questo esempio presuppone l'installazione di un sottodominio multisito, con un dominio di example.com e due sottodomini, www.example.com e second.example.com. Gli URL di sviluppo locale saranno rispettivamente www.example.local e second.example.local.

Database Modifiche:

Aggiornare il valore di dominio in wp_site:

UPDATE wp_site SET domain = 'example.local' WHERE domain = 'example.com'; 

Aggiornare il valore di dominio (s) in wp_blogs:

UPDATE wp_blogs SET domain = 'www.example.local' WHERE domain = 'www.example.com'; 
UPDATE wp_blogs SET domain = 'second.example.local' WHERE domain = 'second.example.com'; 

Plugin Codice: Il seguente plugin dovrebbe essere installato in tutta la rete.

<?php 
/* 
Plugin Name: MultiSite WP_HOME and WP_SITEURL 
Plugin URI: http://doublesharp.com/ 
Description: Allows wp_options values to be overwritten in wp-config.php for MultiSite 
Author: Justin Silver 
Version: 1.0 
Author URI: http://doublesharp.com 
License: GPL2 
*/ 

function _ms_config_wp_siteurl($url = '') { 
    if (is_multisite()): 
     global $blog_id, $current_site; 
     $cur_blog_id = defined('BLOG_ID_CURRENT_SITE')? BLOG_ID_CURRENT_SITE : 1; 
     $key = ($blog_id!=$cur_blog_id)? $blog_id.'_' : ''; 
     $constant = 'WP_'.$key.'SITEURL'; 
     if (defined($constant)) 
      return untrailingslashit(constant($constant)); 
    endif; 
    return $url; 
} 
add_filter('option_siteurl', '_ms_config_wp_siteurl'); 

function _ms_config_wp_home($url = '') { 
    if (is_multisite()): 
     global $blog_id; 
     $cur_blog_id = defined('BLOG_ID_CURRENT_SITE')? BLOG_ID_CURRENT_SITE : 1; 
     $key = ($blog_id!=$cur_blog_id)? $blog_id.'_' : ''; 
     $constant = 'WP_'.$key.'HOME'; 
     if (defined($constant)) 
      return untrailingslashit(constant($constant)); 
    endif; 
    return $url; 
} 
add_filter('option_home', '_ms_config_wp_home' ); 
?> 

Configura wp-config.php:

Aggiungi nuove costanti per wp-config.php. Il sito primario dovrebbe utilizzare lo standard WP_HOME e WP_SITEURL e gli URL terziario dovrebbe usare WP_{$blog_id}_HOME e WP_{$blog_id}_SITEURL

define('WP_HOME',  'http://www.example.local'); 
define('WP_SITEURL', 'http://www.example.local'); 
define('WP_2_HOME', 'http://secondary.example.local'); 
define('WP_2_SITEURL', 'http://secondary.example.local'); 
+0

Questo è perfetto. Grazie mille. – slifty

+0

Nessun problema, ho finito con l'espandermi un po 'per fare altre cose tra cui la sostituzione dei link nel contenuto qui: http://justin.ag/technology/wordpress-plugins/wordpress-plugin-wp-server-migration/ I meta hook sono commentati perché mi sono imbattuto in alcuni problemi (che potrebbero essere stati correlati al caching) ma lo sto usando da un mio multisito per un po 'senza problemi. È necessario definire una costante 'WP_DEVELOPMENT = true' per eseguire la riscrittura dell'URL, la sostituzione del token URL deve essere eseguita sempre. – doublesharp

+0

L'ultimo definisce mi ha salvato dopo aver provato i plugin e tutto ... MA ho anche dovuto rivisitare la pagina di amministrazione wordpress di rete e salvare nuovamente ogni pagina del sito. – shaneonabike

1

è possibile utilizzare il update_option in functions.php

update_option("siteurl","http://example.com"); 
update_option("home","http://example.com"); 
+0

Il problema con questa soluzione è che quando eseguo il sito localmente, il suo URL è 'http: // local-example /' che non corrisponde al valore del database di 'http: //www.example. com' nel caso del sito primario. Per questo motivo, nessuno del codice in 'functions.php' viene eseguito, quindi le opzioni non vengono aggiornate. Polli e uova – doublesharp

1

C'è una domanda simile viene chiesto qui: Team Development of a Wordpress Site che ho fornito una possibile soluzione per. Nel tuo caso, potresti non voler andare in quella misura (anche se sarebbe molto flessibile); tuttavia, si può sempre guardare la parte della risposta che menziona una tecnica di sostituzione del dominio.

ho delineato che la soluzione qui: URL Token Replacement Techniques...

+0

Bello, questo ha molte informazioni interessanti, specialmente la sostituzione dei token URL. Sfortunatamente, non è di grande aiuto nel mio caso perché ho bisogno di sovrascrivere i valori effettivi del database (da quello che posso dire guardando 'wp-include/ms-settings.php'. – doublesharp

+0

Fondamentalmente, sei nel caso 2 del soluzione che ho delineato in quell'altro post. È un problema costante con WP (anche se non è nativo per WP da solo), e sfortunatamente, non c'è una soluzione facile per il problema - a meno che non si voglia fare del proxy magic o creare qualcosa di veramente complesso regole di routing in un file '.htaccess'. La mia esperienza con WP MU/Multi-site è che devi configurare in anticipo i tuoi ambienti (con l'approccio che ho delineato) prima di iniziare. Altrimenti, sono molte le query SQL per sostituire i valori nel DB. – user916011

+0

Tecnicamente nel caso 2, ma il sito non è attivo, quindi posso fare tutto ciò che mi serve per quanto riguarda la configurazione.Il problema non sono gli URL nel contenuto di per sé, sono gli URL salvati nel 'wp_options ['siteurl']' (sito primario), 'wp_site ['dominio']' (sito MultiSite), 'wp_blogs ['dominio' ] '(primario, secondo blog) e' wp_2_options ['siteurl'] '(sito secondario). Precedentemente mi dovevo preoccupare solo di 'wp_options ['siteurl']' e potevo scavalcarlo in 'wp-config.php', ma non vedo come farlo senza aggiornare questi valori di tabella ogni volta che copio il database . Ignorando gli URL dei contenuti per ora. – doublesharp

1

ho avuto lo stesso problema e volevo una soluzione più simile a definire WP_HOME & WP_SITEURL in wp-config.php possibile .

Non riesco a utilizzare un plug-in, perché sto sincronizzando con GIT e non voglio avere quel plugin nel mio repository e dovrei aggiungere il plug-in ogni volta ... Suppongo che possa essere attivato a livello di rete attraverso la tabella wp_sitemeta ... ma non era l'ideale per me.

Mi è venuta in mente questa soluzione.

Assicurarsi di non sincronizzare wp_blogs, wp_site, wp_sitemeta. E quindi aggiungere il codice al tuo wp-config.php locale da qualche parte sotto $table_prefix:

/* Update local database */ 
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die(mysql_error()); 
mysql_select_db(DB_NAME); 

$result = mysql_query("SELECT * FROM `". $table_prefix ."blogs`") or die(mysql_error()); 
while($row = mysql_fetch_array($result)) 
{ 
    $id = (1 == $row['blog_id']) ? '' : $row['blog_id'] .'_'; 
    mysql_query("UPDATE `". $table_prefix . $id ."options` SET `option_value`='http://". $row['domain'] ."/' WHERE (`option_name`='siteurl' OR `option_name`='home')") or die(mysql_error()); 
} 

Questo farà in modo i siti sono sincronizzati fino al vostro tavolo wp_blogs locali.

L'unico inconveniente è che quando si aggiunge un nuovo sito, è necessario copiarlo manualmente nella tabella wp_blogs e aggiornare l'URL locale.

+1

Non posso credere di non aver pensato di farlo in quel modo. Questo eseguirà l'aggiornamento ad ogni caricamento della pagina - potresti usare un valore nella tabella delle opzioni per determinare se è necessario eseguire l'aggiornamento per non prevenirlo, anche se non è il risultato di una grande prestazione. PDO o mysqli andrebbero bene anche per le prove future, anche se WordPress usa ancora le estensioni mysql_ *. – doublesharp

+1

Un'ulteriore opzione se si volesse essere in grado di aggiornare l'intero database sarebbe quella di memorizzare il blog_id => url mapping in un array in 'wp_config.php' e aggiornare le tabelle' blogs', 'sites' e' options' usandolo. – doublesharp

+0

Ci sono sicuramente opzioni. Questo è veramente semplice Anche la matrice potrebbe essere una buona opzione. Ho iniziato a farlo in quel modo, ma ho deciso contro. Non sono sicuro del perché ora ... forse perché la tabella dei blog ha già gli id ​​del sito ... È in esecuzione su ogni caricamento della pagina, ma dal momento che sto usando solo localmente non mi importava. Lo raffinerei per un ambiente live e tendo a commentarlo quando non lo uso. E non è quasi robusto come il plugin. Ovviamente i link nel contenuto sono rimasti invariati per uno, ma volevo solo qualcosa di semplice e portatile. – Jake

Problemi correlati