¿Cómo puedo hacer que una base de datos de WordPress sea portátil e independiente de la URL?

9

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

  1. Referencias a URL específicas dentro de la base de datos ( wp_postsy wp_optionstablas al parecer)
  2. Si una persona instala un complemento, las otras instalaciones no lo tendrán y causarán problemas de concurrencia en la base de datos
  3. 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

  1. ¿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?

  2. ¿Algún inconveniente que debería tener en cuenta con el enlace simbólico?

  3. ¿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.

navitronic
fuente

Respuestas:

2

Contestaré la pregunta 2, tenga en cuenta que algunos valores en la base de datos se almacenan en matrices serializadas. Por ejemplo, si la longitud de su cadena de URL cambia y está en una matriz serializada, entonces necesita actualizar el índice.

Puede usar este script PHP para actualizar todos los valores en matrices serializadas, o ejecutarlo desde la línea de comando en su propio script

davemac
fuente
Un agradecimiento tardío por señalarme en la dirección de ese script PHP. Solucionó algunos problemas que tenía con otra tarea relacionada con WordPress.
navitronic
1

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, *_commentsy *_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 *_optionsmesa 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.

s_ha_dum
fuente
Tiene razón en la pregunta 3, creo que esto se debe principalmente a que las cosas se almacenan en forma serializada en esta tabla, lo que puede romperse si no tiene cuidado.
navitronic