Ignorare WP_SITEURL e WP_HOME per WordPress Multisito

Per fare sviluppo locale su un sito WordPress (http://www.example.com), sono stato in precedenza l’override del WP_SITEURL e WP_HOME valori in wp-config.php in questo modo:

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

Questo mi avrebbe permesso di copiare il database e i file del sito sul server locale, e apportare le modifiche necessarie, il collaudo di installazione locale.

È stato quindi necessario convertire l’installazione di WordPress Multisito in modo che gli utenti, autenticazione, plugin, etc. potrebbero essere condivisi tra la sede principale e di una secondaria, sito ospitato su un sottodominio (http://second.example.com).

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

Di aggiornare il mio HOSTS file è un po ‘ una soluzione, ma non è l’ideale (io non sono in grado di confrontare il live del sito, ecc). Esecuzione di uno script per modificare i valori del database è un’altra opzione che ho provato, ma è leggermente più ingombrante, quindi la mia domanda è se o non c’è un’opzione in Multisito per sostituire questi valori in un file di impostazioni, come wp-config.php, e se sì, che cosa sarebbe simile.

InformationsquelleAutor doublesharp | 2012-10-18



4 Replies
  1. 10


    Aggiornamento: aggiornata del plugin codice 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. Ho bisogno di essere in grado di copiare il wp_options tabella(s) per il mio ambiente di sviluppo, in quanto contengono le configurazioni necessarie. Per superare il problema di non essere in grado di impostare il WP_SITEURL e WP_HOME valori in Multisito, ho scritto un filtro personalizzato per sostituire il _config_wp_siteurl() e _config_wp_home() funzioni che sono disponibili per i non-multisito installa che è incluso in un plugin che è disponibile in rete ed è configurato in wp-config.php. Sono quindi in grado di copiare tutte le tabelle del database tranne wp_site e wp_blogs a un database locale.

    Mi raccomando il URL Sostituzione di Token Tecniche per WordPress 3.0 articolo di Chris Murphy per aiutare a gestire gli Url nel tuo contenuto.

    In questo esempio si presuppone un sottodominio multisito installare, con un dominio di example.com e due sottodomini, www.example.com e second.example.com. Di sviluppo locale, gli Url sarà www.example.local e second.example.local rispettivamente.

    Modifiche Al Database:

    Aggiornare il valore del dominio in wp_site:

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

    Aggiornare il valore del 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';

    Codice Del Plugin:
    I seguenti plugin dovrebbe essere installato su 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'    );
    ?>

    Configurare wp-config.php:

    Aggiungere nuove costanti per wp-config.php. Il sito primario dovrebbe utilizzare lo standard WP_HOME e WP_SITEURL e terziario Url dovrebbe utilizzare 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');
    • Questo è perfetto. Grazie mille.
    • Nessun problema, ho finito per ampliare un po ‘ a fare più cose tra cui quello di sostituire i link nel contenuto qui: justin.ag/tecnologia/wordpress-plugin/… La meta ganci sono commentate, perché mi sono imbattuto in alcuni problemi (che potrebbe essere stato legato alla cache), ma lo sto usando su uno dei miei multisites per un po ‘ senza problemi. È necessario definire un WP_DEVELOPMENT=true costante per fare la riscrittura degli URL, l’url di sostituzione di token dovrebbe correre per tutto il tempo.
    • L’ultimo definisce salvato me, dopo aver provato i plugin e tutto… MA ho anche dovuto rivedere la rete di wordpress admin della pagina e salvare ogni pagina del sito.
    • WP_HOME e WP_SITEURL non dovrebbe avere alcun effetto in MS
    • questo è corretto, e l’esatto problema che stavo avendo. Stavo sfruttando la loro prima di passare a Multisito e bisogno di un modo per ottenere la stessa funzionalità, che il plugin che ho scritto in gran parte non.
  2. 1

    Si potrebbe utilizzare il update_option in functions.php

    update_option("siteurl","http://example.com");
    update_option("home","http://example.com");
    • Il problema di questa soluzione è che quando eseguo il sito in locale, il suo URL è http://local-example/ che non corrisponde al valore di database http://www.example.com nel caso del sito primario. A causa di questo, nessuno del codice in functions.php viene eseguito, quindi, le opzioni non sono aggiornati. I polli e le uova.
  3. 1

    C’è una simile domanda qui: Il Team di Sviluppo di un Sito WordPress che ho fornito una possibile soluzione. Nel tuo caso, si potrebbe non voler andare in quella misura (anche se sarebbe molto flessibile); tuttavia, si può sempre guardare la parte della risposta che parla di un dominio-tecnica di sostituzione.

    Ho descritto che qui la soluzione: URL Sostituzione di Token Tecniche di…

    • Bello, che in realtà ha un sacco di grandi informazioni, soprattutto l’URL di Sostituzione di Token. Purtroppo, non totalmente aiutare nel mio caso perché ho bisogno di ignorare effettivi valori di database (per quello che posso dire guardando wp-includes/ms-settings.php.
    • Fondamentalmente, sei nel Caso 2 la soluzione che ho descritto nell’altro post. È un problema costante con WP (anche se non è nativo WP da solo), e purtroppo, non c’è una facile soluzione per il problema, a meno che non si voglia fare un po proxy magia o creare alcuni davvero complesso di regole di routing in un .htaccess file. La mia esperienza con WP MU/Multi-sito, è che è necessario configurare i vostri ambienti in anticipo (con l’approccio che ho contorno) prima di iniziare. Per il resto, è un sacco di query SQL per sostituire i valori nel DB.
    • Tecnicamente nel Caso 2, ma il sito non è vivere in modo che io posso fare quello di cui ho bisogno, per quanto di installazione. Il problema non è la Url del contenuto di per sé, è salvato Url nel wp_options['siteurl'] (sito principale), wp_site['domain'] (Multisito sito), wp_blogs['domain'] (primario, secondario blog) e wp_2_options['siteurl'] (sito secondario). In precedenza ho avuto solo preoccuparsi di wp_options['siteurl'] e potrebbe ignorare che in wp-config.php, ma non vedo come fare senza di aggiornamento di questi valori della tabella ogni volta che mi copia il database. Ignorando il contenuto di Url per ora.
    • Io in realtà potrebbe essere solo il pensiero di una soluzione usando il tuo approccio e un po ‘ di codice che ho scritto per ignorare i valori in wp_options e wp_2_options – Se posso installazione personalizzata di una versione dev di wp_site e wp_blogs con i valori modificati dalla produzione e non la copia di questi giù per dev lavoro. Dovrei quindi essere in grado di utilizzare custom wp-config.php valori (la mia implementazione è leggermente diversa dalla tua, ma lo stesso principio). Il problema che ho avuto è che il ms-settings.php file ha un po ‘ di hard coded query per cercare blog_id, etc.
    • Vedi l’ultima parte del post sulla sincronizzazione. Il fatto è: se si dispone di un ambiente di sviluppo separato dall’ambiente di gestione temporanea, non è necessario per eseguire il dump di ogni tabella, ad esempio wp_options all’interno. Hai solo bisogno di eseguire il dump del contenuto pertinente tabelle, in questo modo non hanno per modificare i valori nel tuo ambiente di sviluppo sandbox. Così, che cosa dovrebbe accadere qui è che il contenuto della promozione andare a monte di gestione temporanea di produzione, dove, come mirroring succede a valle messa in scena per la tua sandbox. In questo modo ogni ambiente deve essere configurata una volta, lasciando solo il contenuto per essere promosso.
    • Esattamente il mio pensiero (appena pubblicato), anche se I non bisogno di wp_options all’interno. Ho un po ‘ di codice che dovrebbe risolvere il problema, per me, tuttavia, pubblicheremo un aggiornamento, se funziona davvero 🙂
    • Si può sempre scrivere uno script bash per eseguire la query SQL per aggiornare il wp_options all’interno delle tabelle, se si sta specchiando il DB per il vostro ambiente di sviluppo. Contento che il mio post ha aiutato un po’!
    • Grazie mille per i vostri suggerimenti, ho appena postato la risposta che mi è venuta, e vota il tuo supporto post di conseguenza.
    • Si avvicinò, con una bella soluzione per il problema wp_options all’interno — raramente ho avuto a che fare con esso, ma ora almeno ho una buona strategia per fare riferimento a quando ho bisogno di affrontare. Complimenti!

  4. 1

    Ho avuto lo stesso problema e volevo una soluzione simile per la definizione di WP_HOME & WP_SITEURL in wp-config.php come possibile.

    Non posso usare un plugin, perché io sono la sincronizzazione con GIT e non voglio avere il plugin nel mio repo e vorrei aggiungere il plugin ogni volta… suppongo che potrebbe essere attivato su tutta la rete attraverso il wp_sitemeta tabella… ma non era l’ideale per me.

    Mi si avvicinò con questa soluzione.

    Essere sicuri di non sincronizzare wp_blogs, wp_site, wp_sitemeta. E quindi aggiungere il codice per il tuo locale wp-config.php 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 che i siti sono sincronizzati fino al locale wp_blogs tabella.

    L’unico inconveniente è che quando si aggiunge un nuovo sito, lo si fa manualmente è necessario copiarli nella wp_blogs tabella e aggiornare il suo url.

    • Non riesco a credere di non pensare di farlo in questo modo. Questo verrà eseguito l’aggiornamento su ogni caricamento della pagina – è possibile utilizzare un valore nella tabella delle opzioni per determinare se è necessario eseguire l’aggiornamento il vostro non per evitare questo, anche se non è che molto di un calo di prestazioni. DOP o mysqli sarebbe un bene per il futuro di correzione, anche se WordPress è ancora utilizzando il mysql_* estensioni.
    • Un ulteriore opzione se si voleva essere in grado di aggiornare l’intero database per memorizzare i blog_id => associazioni url in un array wp_config.php e aggiornare il blogs, sites, e options tabelle di utilizzo.
    • Ci sono sicuramente le opzioni. Questo è davvero semplice. La matrice potrebbe essere una buona opzione troppo. Ho iniziato a farlo in quel modo, ma ha deciso contro di esso. Io non sono sicuro perché ora… forse perché il blog tabella l’id di sito già… è in esecuzione su ogni caricamento della pagina, ma dal momento che sto usando in locale non mi importava. Vorrei affinare per un ambiente vivo, e io tendo a commento, quando non sto usando. E non è quasi efficace come il plugin. Ovviamente i link nel contenuto sono ancora lasciate invariate per uno, ma volevo qualcosa di semplice e portatile.

Lascia un commento