Como posso tornar um banco de dados WordPress portátil e independente de URL?


9

Questão

Estou prestes a embarcar em algum desenvolvimento do WordPress em um ambiente de equipe para várias pessoas. (3 ou mais pessoas trabalhando na mesma base de código por vez, cada uma desenvolvendo localmente)

Com outros CMSs com os quais trabalhamos, todos apontaram suas instalações para o mesmo banco de dados e, devido ao modo como o CMS / banco de dados funcionou, isso significa que todos podemos ter o mesmo conteúdo alimentando nossas instalações (localizadas em URLs diferentes). mesmo banco de dados sem muitos problemas (além de precisar ocasionalmente sincronizar pastas de uploads)

Minha pergunta é, com o WordPress, o que nos impede de usar essa mesma abordagem e como podemos resolver esses problemas?

por exemplo. Três cópias do WordPress, todas rodando no mesmo banco de dados.

http: //dev.local/developer-a/
http: //dev.local/developer-b/
http: //dev.local/developer-c/

etc

Espero que seja desnecessário dizer que isso ocorrerá apenas em um ambiente de desenvolvimento antes do lançamento.

Questões principais

  1. Referências a URLs específicos no banco de dados ( wp_postse wp_optionstabelas, ao que parece)
  2. Se uma pessoa instalar um plug-in, as outras instalações não o terão e causarão problemas de simultaneidade no banco de dados
  3. Mantendo as pastas de uploads sincronizadas

Solução Atual

Atualmente, tenho o início de uma solução para o primeiro problema. Coloco o seguinte em um arquivo na pasta mu-plugins.

O código filtra essencialmente o conteúdo da postagem à medida que entra e sai do banco de dados, substituindo qualquer instância da URL por um token exclusivo.

<?php

define('PORTABILITY_TOKEN', '{_portable_}');

function portability_remove_home($content)
{
    $content = str_replace(get_option('home'), PORTABILITY_TOKEN, $content);

    return $content;
}

add_filter('content_save_pre', 'portability_remove_home');

function portability_add_home($content)
{
    $content = str_replace(PORTABILITY_TOKEN, get_option('home'), $content);

    return $content;
}

add_filter('the_content', 'portability_add_home');
add_filter('the_editor_content', 'portability_add_home');

Eu configurei as opções home e siteurl via php usando o ambiente em que o WordPress está instalado para resolvê-las. (novamente, isso é apenas para desenvolvimento) Isso significa que, para cada instalação individual, o conteúdo da postagem do WordPress parecerá estar em execução nesse URL no momento em que chegar ao cliente.

<?php
if (!defined('WP_HOME'))
{
    // define WP_HOME (aka url of install) based on environment.
    // IF THIS ISN'T WORKING, DEFINE IT EARLIER.
    define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(__FILE__) ) );
}

if (!defined('WP_SITEURL'))
{
    // Assumes WordPress is in a separate directory called 'wp', relative to WP_HOME.
    // IF IT'S DIFFERENT, DEFINE IT EARLIER.
    define('WP_SITEURL', WP_HOME . '/wp');
}

O segundo e o terceiro problemas parecem solucionáveis ​​com os links simbólicos apropriados (todos desenvolvidos na mesma máquina)

Perguntas reais

  1. Posso melhorar minha maneira de lidar com os diferentes URLs? Existe alguma coisa que eu perdi que tenha o URL codificado no banco de dados?

  2. Alguma dica que eu deveria estar ciente com o link simbólico?

  3. Quaisquer outros problemas em que alguém possa pensar?

Sei que essas perguntas são muito específicas, se algo não estiver claro, comente isso e vou alterar / esclarecer.

Obrigado.

Respostas:


2

Responderei à pergunta 2, esteja ciente de que alguns valores no banco de dados são armazenados em matrizes serializadas. Por exemplo, se o comprimento da sua string de URL mudar e ela estiver em uma matriz serializada, será necessário atualizar o índice.

Você pode usar esse script PHP para atualizar todos os valores em matrizes serializadas ou executá-lo na linha de comando em seu próprio script


Um agradecimento tardio por me apontar na direção desse script PHP. Ele resolveu alguns problemas que eu estava tendo com outra tarefa relacionada ao WordPress.
Navitronic 19/10/12

1

Pergunta 1: você tem URLs entrando e saindo do banco de dados em mais lugares do que apenas no conteúdo da postagem. Encontrei URLs em *_postmeta, *_commentse *_options(além dos que você definiu). Isso não está contando a atividade do plug-in e a atividade do campo meta personalizado .

Pergunta 2: Às vezes, também vou vincular plugins por conveniência, e na maioria das vezes ele funciona. Às vezes não. Não posso dizer as condições exatas que causam um problema, mas o Javascript parece ser um fator.

Pergunta 3: Eu esperaria problemas com a *_optionstabela, se alguma coisa. Coisas como plugins ativados e o tema ativo são mantidos lá, entre muitas outras informações são bastante específicas do site.


Você está certo na pergunta 3, acho que isso se deve principalmente ao fato de as coisas serem armazenadas de forma serializada nesta tabela, que podem ser quebradas se você não tomar cuidado.
Navitronic 19/10/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.