多个wp_options表以在安装之间共享内容

时间:2015-08-10 作者:Youleean

我的应用程序>10user_roles, 每个都能够执行完全不同的任务,提供了自定义后端,并且没有访问wp-admin.

每个user_role 通过多个插件处理使用。每个user_role 在相同的数据(帖子、分类法等)上进行交互

我的想法是对一个或多个应用程序使用单个安装user_roles 连接到单个数据库以共享用户、帖子等,但加载了不同的插件,因此只需单独wp_options 桌子

目标是提供独立的登录区域(例如子域,我不希望合作伙伴使用与客户相同的登录),更容易的路由(每个角色的永久链接和重写不同),以及更少的时间检查登录用户在站点受保护部分的权限。此外,我还可以为“仅后端”角色禁用主题,并只加载每个角色执行其操作所需的插件。

我的猜测是,一个很好的副作用将是一个显著的速度提升,因为客户的主站点由woocommerce 我不需要激活woocommerce 在其他情况下,反之亦然。。。为用户/客户前端供电的安装中不会加载自定义插件。

我考虑了多站点功能,但这不是正确的路径,因为每个博客都有自己的posts表,这不实用,因为我需要让所有用户使用相同的数据。

Wordpress提供以下常量来设置自定义用户表,以便在多个安装中共享用户:

define( \'CUSTOM_USER_TABLE\', $table_prefix.\'my_users\' );
define( \'CUSTOM_USER_META_TABLE\', $table_prefix.\'my_usermeta\' );
但它没有提供定义自定义选项表的方法,请参见此票据https://core.trac.wordpress.org/ticket/7008

该线程提供了一个解决方案,虽然有点粗糙,但在我的初始测试中效果很好:https://wordpress.stackexchange.com/a/175494/68858

TL;DR:通过复制的功能修改wpdb类CUSTOM_USER_TABLE 使用CUSTOM_OPTION_TABLE 在里面wp-config.php.

顺便说一句,他说,第二个网站的内容将链接到第一个网站,我想这只是一个估计。。。所以不,它不会,它工作得很好。

我现在的问题是,你看到我在这种方法中可能面临的任何问题了吗?(多个安装、一个数据库、相同的数据库表和一个单独的选项表或每个安装)

你会建议一种不同的方法,还是坚持默认的wordpress方式?

如何解决修改wpdb的“黑客”问题。php在核心更新的情况下是否持久?

除了可维护性,还有其他缺点吗?(我想这样做会让我受益匪浅)

当这个项目启动时,几乎一半的需求都不存在,而wordpress+woocommerce由于简单而被选中。使用wordpress作为应用程序框架比我想象的要困难得多,也有很大的局限性。

提前感谢您的帮助!

Update:

wordpress支持票证中回答了如何在更新时保留wpdb的修改版本,或者如何在custom\\u USER\\u表之外使用自定义表名的问题。解决方案是扩展wpdb类,在tables 函数,另存为db。php到wp内容,并将其作为一个下拉菜单使用。通过这种方式,您可以为所有表定义自定义名称,并避免更新core时出现问题。(参见:#33320)

2 个回复
SO网友:Mark Kaplun

听起来你在努力自杀,你很可能会成功。每个框架都有自己的假设和限制,因此如果wordpress的假设不符合您的需要,那么就不要在项目中使用wordpress。

如果您(好的,可能是客户)出于成本、交付时间和可维护性的原因决定使用wordpress,那么您应该努力使用内置的wordpress工具,而不是试图绕过它们并重新发明东西,因为如果您使用的是framework X,您就可以这样做。你越是认同wordpress核心开发实践,你就会越快乐(除非你试图确保工作安全;)。

很抱歉给出了非常复杂的答案,但从您的描述来看,您似乎不想在wordpress中执行此项目,尽管我没有在这里阅读wordpress中可能存在问题的任何内容,也没有必要执行您认为应该执行的所有黑客操作。

SO网友:RafaSashi

这是一个假设以下三件事的建议:

所有站点都位于同一数据库中

每个站点以前都安装了自己的base_prefix

必须尽快调用以下筛选器,在我们的情况下,使用HyperDB 把过滤器放进去db-config.php

  add_filter(\'query\', function ($query){

          global $wpdb;

          $content_prefix = \'main_\'; //prefic of the main installation where all posts and terms are located

          $query  = preg_replace(\'/\' . $wpdb->base_prefix . \'(?!options|users|usermeta)/i\', $content_prefix, $query);

          return $query;
  });
还建议共享相同的上传路径,并为媒体和synch the user table 因为作者信息需要从两侧提取。

如果数据位于不同的数据库/服务器中,则可以保留相同的筛选器和implement the HyperDB dataset methods.

Alternatively

也可以在不过滤查询的情况下使用数据集,但需要在不同的数据库中使用相同的前缀。

结束