如何使WordPress数据库具有可移植性且独立于url?


9

问题

我即将在多人团队环境中进行一些WordPress开发。(一次有3个或更多的人在同一个代码库上工作,每个人都在本地开发)

使用我们与之合作的其他CMS,每个人都将其安装指向同一个数据库,并且由于CMS /数据库的工作方式,这意味着我们可以从安装目录中将相同的内容(位于不同的URL)馈入我们的安装中。同一数据库,没有太大问题(除了偶尔必须同步上传文件夹)

我的问题是,使用WordPress,是什么阻止了我们使用这种方法,又如何解决这些问题呢?

例如。WordPress的三个副本都在同一个数据库中运行。

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

等等

我希望不用多说,这只会在发布之前处于开发环境中。

主要问题

  1. 在数据库中引用特定的URL(wp_postswp_options表似乎)
  2. 如果一个人安装了插件,则其他人将没有该插件,这将导致数据库中的并发问题
  3. 保持上传文件夹同步

当前解决方案

目前,我已经开始解决第一个问题。我将以下内容放在mu-plugins文件夹中的文件中。

该代码本质上通过用唯一令牌替换url的任何实例来过滤帖子内容进入和离开数据库的过程。

<?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');

我已经使用安装了WordPress的环境通过php设置了home和siteurl选项。(同样,这仅用于开发),这意味着对于每个单独的WordPresses安装,发布内容在到达客户端时将看起来像在该url上运行。

<?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');
}

通过适当的符号链接可以解决第二个和第三个问题(所有问题均在同一台机器上开发)

实际问题

  1. 无论如何,我可以改善对不同网址的处理吗?有什么我会错过的将URL硬编码到数据库的东西吗?

  2. 我应该通过符号链接了解任何陷阱吗?

  3. 还有谁能想到的其他问题?

我意识到这些问题是非常具体的,如果尚不清楚,请对此发表评论,然后我将进行修改/澄清。

谢谢。

Answers:


2

我将回答问题2,请注意,数据库中的某些值存储在序列化数组中。例如,如果您的URL字符串的长度发生变化并且位于序列化数组中,那么您需要为其更新索引。

您可以使用此PHP脚本更新序列化数组中的所有值,或在自己的脚本中从命令行运行它


谢谢您向我指出了该PHP脚本的方向。它解决了我在另一个与WordPress相关的任务中遇到的一些问题。
navitronic,2012年

1

问题1:您有进入和离开数据库的URL不仅仅是帖子内容。我在*_postmeta*_comments和中找到了URL *_options(除了您定义的URL )。这不包括插件活动和“ 自定义元字段”活动。

问题2:为了方便起见,有时我还会使用symlink插件,并且在大多数情况下都可以使用。有时并非如此。我无法告诉您导致问题的确切条件,但是Javascript似乎确实是一个因素。

问题3:我希望*_options桌子有麻烦。诸如激活的插件和激活的主题之类的东西都保存在那里,还有许多其他信息是针对特定站点的。


您对问题3的回答是正确的,我认为这主要是由于事物以序列化形式存储在此表中,如果您不小心可能会中断。
navitronic,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.