Existe uma maneira de definir domínios wp_blogs no wp-config?

4

Na minha configuração multisite, tenho vários ambientes que desejo compartilhar o mesmo banco de dados, mas usar domínios diferentes.

  • server1.example.com
  • server2.example.com
  • example.com

... cada um deles apontaria para o mesmo banco de dados. Isso funciona perfeitamente em uma instalação padrão do WP usando define( 'WP_HOME', 'http://server1.example.com' ); e define( 'WP_SITEURL', 'http://server1.example.com' ); .

Quando você adiciona vários sites à mistura, ele quebra.

O problema é que a tabela wp_blogs também define os domínios, então eu preciso de uma maneira de defini-los no arquivo de configuração. Existe alguma maneira de fazer isso?

    
por developdaly 19.11.2012 / 15:00

2 respostas

5

Quando o WordPress carrega vários sites, ele inclui os arquivos específicos do MS relevantes em wp-settings.php

As linhas relevantes:

<?php
// Initialize multisite if enabled.
if ( is_multisite() ) {
    require( ABSPATH . WPINC . '/ms-blogs.php' );
    require( ABSPATH . WPINC . '/ms-settings.php' );
} elseif ( ! defined( 'MULTISITE' ) ) {
    define( 'MULTISITE', false );
}

ms-settings.php tem um objetivo semelhante ao wp-settings.php : carrega o ambiente multisite e - mais importante para nossos propósitos - configura o site atual (coleção de blogs) e o blog. Mas também há essas poucas jóias:

if ( defined( 'SUNRISE' ) )
    include_once( WP_CONTENT_DIR . '/sunrise.php' );

/** Check for and define SUBDOMAIN_INSTALL and the deprecated VHOST constant. */
ms_subdomain_constants();

if ( !isset( $current_site ) || !isset( $current_blog ) ) {
    // setup current site and blog
}

Mais importante: if(defined('SUNRISE')) . Isso permite que você solte um arquivo sunrise.php no diretório wp-content . Ele é incluído se você define('SUNRISE', true); no seu wp-config.php . Esse arquivo é o mesmo usado para mapeamento de domínio para configurar o site atual e o blog com base nos domínios personalizados. Você pode usá-lo para criar seu próprio site e blog, em vez de permitir que o WordPress faça isso por você.

Exemplo rápido - isso funciona bem, mas provavelmente precisa de melhorias.

<?php
// sunrise.php

$host = $_SERVER['HTTP_HOST'];

if('wpmscustom.dev' == $host)
{
    // switch the host.
    $host = 'wpms.dev';
}

if(is_subdomain_install())
{
    $sql = $wpdb->prepare("SELECT * FROM {$wpdb->blogs} WHERE domain = %s LIMIT 1", $host);
}
else
{
    // this probably needs some work.
    $path = explode('/', ltrim($_SERVER['REQUEST_URI'], '/'));
    if(count($path))
        $path = '/' . $path[0];
    else
        $path = '/';

    $sql = $wpdb->prepare("SELECT * FROM {$wpdb->blogs} WHERE domain = %s AND path = %s LIMIT 1", $host, $path);
}

if($_blog = $wpdb->get_row($sql))
{
    $current_blog = $_blog;

    $blog_id = $_blog->blog_id;
    $site_id = $current_blog->site_id;

    // set current site
    $current_site = $wpdb->get_row(
        $wpdb->prepare("SELECT * from {$wpdb->site} WHERE id = %d", $site_id)
    );
    $current_site->blog_id = $blog_id;

    $current_site = get_current_site_name($current_site);
}

Como o @kaiser provavelmente vai dizer que $_SERVER['HTTP_HOST'] não é confiável, você pode querer fazer Certifique-se de que seu servidor realmente esteja disponível.

Ou faça algo assim ...

<?php
if(isset( $_SERVER['HTTP_HOST']))
{
    $host = $_SERVER['HTTP_HOST'];
}
elseif(isset($_SERVER['SERVER_NAME']))
{
    $host = $_SERVER['SERVER_NAME'];
}

Você pode soltar o sunrise.php acima em sua instalação local e colocar define('SUNRISE', true); no wp-config do seu local.

    
por chrisguitarguy 26.11.2012 / 22:21
1

Não tenho certeza se isso responde à sua pergunta, mas descobri o seguinte: enlace

    
por daresayer 20.11.2012 / 15:23