Shared table across network

时间:2015-04-22 作者:Malibur

我目前正在创建一个插件,该插件将读取xml文件并将数据导入wordpress多站点上的4个表中。表相当大,有很多列,因此post表不适合此任务。网络上的每个“博客”都需要能够访问此表中的数据。

我已尝试使用dbDelta函数按照此处的codex说明创建表:https://codex.wordpress.org/Creating_Tables_with_Plugins

但在多站点上,这会为网络中的每个“博客”创建一组表。这是多余的,因为所有不同的表集的数据都是相同的。

我一直在谷歌上搜索,但找不到WordPress这样做的方法。

有人有什么想法吗?你认为这是如何最好地实现的?当插件在网络范围内激活时,它需要创建一组表,以便从网络中的所有博客访问

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

使用$wpdb->base_prefix . \'table_name\' 当您要为整个网络创建表时,或当您要对其运行查询时,将其作为表名。

$wpdb->base_prefix 始终是当前网络主表的前缀。

SO网友:bueltge

您应该仅在激活时创建表,如果未创建表,则该表存在于数据库中。一个小的源代码示例应该对您有所帮助。

follow源代码也在单个站点中创建一个表,该插件可能会为网络中的每一方以单一模式激活。

register_activation_hook( __FILE__, \'on_activate\' );
function on_activate() {

    create_table();
}

function create_table() {
    global $wpdb;

    $table_name = $wpdb->prefix . \'your_table_name\';

    // Check, if exists
    if ( $wpdb->get_var( "show tables like \'{$table_name}\'" ) == $table_name ) {
        return NULL;
    }

    $sql = "CREATE TABLE " . $table_name . " (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        col VARCHAR(100) NOT NULL,
        PRIMARY KEY  (id)
    );";

    // // make dbDelta() available
    require_once( ABSPATH . \'wp-admin/includes/upgrade.php\' );
    dbDelta( $sql );
}
如果你的插件只用于网络激活,那么在插件的头条博客上添加评论Network: TRUE. WP对此进行检查,只允许在网络范围内激活。还可以在源代码中添加对多站点的检查,如if (function_exists(\'is_multisite\') && is_multisite()).

但现在最重要的部分是全球$wpdb. 在globals命名空间中创建表,而不是用于特定站点$wpdb->base_prefix, 不$wpdb->prefix.

结束

相关推荐

Multisite Login problem

自从我将我的多站点网络从3.8升级到3.9后,我就无法通过主博客登录。它是一个子目录安装,而不是子域。当我尝试登录到主站点时:http://uspress.avenues.org/wp-login.php, 获取消息“此用户已选择删除其帐户,并且内容不再可用。”这不是真的。据我所知,你不能删除主网站,我已经检查了数据库,网站被设置为公共网站。如果转到子网站的登录页,我可以这样登录:http://uspress.avenues.org/kgarnier/wp-login.php主站点的主页是可以访问的,但是