Problema
Estoy a punto de embarcarme en un desarrollo de WordPress en un entorno de equipo de varias personas. (3 o más personas trabajando en la misma base de código a la vez, cada una desarrollándose localmente)
Con otros CMS con los que hemos trabajado, todos han apuntado sus instalaciones a la misma base de datos y, debido a cómo ha funcionado ese CMS / base de datos, ha significado que todos podamos tener el mismo contenido en nuestras instalaciones (ubicadas en diferentes URL) misma base de datos sin muchos problemas (aparte de tener que sincronizar ocasionalmente carpetas de cargas)
Mi pregunta es, con WordPress, ¿qué nos impide usar este mismo enfoque y cómo podemos resolver estos problemas?
p.ej. Tres copias de WordPress se ejecutan todas en la misma base de datos.
http: //dev.local/developer-a/
http: //dev.local/developer-b/
http: //dev.local/developer-c/
etc.
Espero que sea evidente que esto solo será en un entorno de desarrollo antes del lanzamiento.
Temas principales
- Referencias a URL específicas dentro de la base de datos (
wp_posts
ywp_options
tablas al parecer) - Si una persona instala un complemento, las otras instalaciones no lo tendrán y causarán problemas de concurrencia en la base de datos
- Mantener las carpetas cargadas sincronizadas
Solución actual
Actualmente tengo el comienzo de una solución para el primer problema. Coloco lo siguiente en un archivo en mi carpeta de plugins mu.
El código esencialmente filtra el contenido de la publicación a medida que entra y sale de la base de datos al reemplazar cualquier instancia de la URL con un token único.
<?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');
He configurado las opciones de inicio y siteurl a través de php usando el entorno donde está instalado WordPress para resolverlas. (una vez más, esto es solo para desarrollo) Esto significa que para cada instalación individual, el contenido de publicación de WordPresses parecerá que se está ejecutando en esa URL para cuando llegue al 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');
}
Los problemas segundo y tercero parecen resolverse con los enlaces simbólicos apropiados (todos se desarrollan en la misma máquina)
Preguntas reales
¿Puedo mejorar mi manejo de las diferentes URL de todos modos? ¿Hay algo que me haya perdido que tenga la URL codificada en la base de datos?
¿Algún inconveniente que debería tener en cuenta con el enlace simbólico?
¿Algún otro problema que alguien pueda pensar?
Me doy cuenta de que estas preguntas son muy específicas, si algo no está claro, comente sobre esto y lo enmendaré / aclararé.
Gracias.
fuente
Pregunta 1: Tienes URL que entran y salen de la base de datos en más lugares que solo el contenido de la publicación. Encontré URL en
*_postmeta
,*_comments
y*_options
(además de las que definiste). Esto no cuenta la actividad del complemento y la actividad de metacampo personalizado .Pregunta 2: También a veces hago enlaces simbólicos para mayor comodidad, y la mayoría de las veces funciona. A veces no. No puedo decirle las condiciones exactas que causan un problema, pero Javascript parece ser un factor.
Pregunta 3: Esperaría problemas con la
*_options
mesa en todo caso. Cosas como complementos activados y el tema activo se mantienen allí, entre mucha otra información es bastante específica del sitio.fuente