charset ) ) {
$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
}
if ( ! empty( $wpdb->collate ) ) {
$charset_collate .= " COLLATE $wpdb->collate";
}
// create tables
$group_table = _groups_get_tablename( 'group' );
if ( $wpdb->get_var( "SHOW TABLES LIKE '$group_table'" ) != $group_table ) {
$queries[] = "CREATE TABLE $group_table (
group_id BIGINT(20) UNSIGNED NOT NULL auto_increment,
parent_id BIGINT(20) DEFAULT NULL,
creator_id BIGINT(20) DEFAULT NULL,
datetime DATETIME DEFAULT NULL,
name VARCHAR(100) NOT NULL,
description LONGTEXT DEFAULT NULL,
PRIMARY KEY (group_id),
UNIQUE INDEX group_n (name)
) $charset_collate;";
}
$capability_table = _groups_get_tablename( 'capability' );
if ( $wpdb->get_var( "SHOW TABLES LIKE '$capability_table'" ) != $capability_table ) {
$queries[] = "CREATE TABLE $capability_table (
capability_id BIGINT(20) UNSIGNED NOT NULL auto_increment,
capability VARCHAR(255) UNIQUE NOT NULL,
class VARCHAR(255) DEFAULT NULL,
object VARCHAR(255) DEFAULT NULL,
name VARCHAR(100) DEFAULT NULL,
description LONGTEXT DEFAULT NULL,
PRIMARY KEY (capability_id),
INDEX capability_kco (capability(20),class(20),object(20))
) $charset_collate;";
}
$user_group_table = _groups_get_tablename( 'user_group' );
if ( $wpdb->get_var( "SHOW TABLES LIKE '$user_group_table'" ) != $user_group_table ) {
$queries[] = "CREATE TABLE $user_group_table (
user_id bigint(20) unsigned NOT NULL,
group_id bigint(20) unsigned NOT NULL,
PRIMARY KEY (user_id, group_id),
INDEX user_group_gu (group_id,user_id)
) $charset_collate;";
}
$user_capability_table = _groups_get_tablename( 'user_capability' );
if ( $wpdb->get_var( "SHOW TABLES LIKE '$user_capability_table'" ) != $user_capability_table ) {
$queries[] = "CREATE TABLE $user_capability_table (
user_id bigint(20) unsigned NOT NULL,
capability_id bigint(20) unsigned NOT NULL,
PRIMARY KEY (user_id, capability_id),
INDEX user_capability_cu (capability_id,user_id)
) $charset_collate;";
}
$group_capability_table = _groups_get_tablename( 'group_capability' );
if ( $wpdb->get_var( "SHOW TABLES LIKE '$group_capability_table'" ) != $group_capability_table ) {
$queries[] = "CREATE TABLE $group_capability_table (
group_id bigint(20) unsigned NOT NULL,
capability_id bigint(20) unsigned NOT NULL,
PRIMARY KEY (group_id, capability_id),
INDEX group_capability_cg (capability_id,group_id)
) $charset_collate;";
}
if ( !empty( $queries ) ) {
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $queries );
}
// needs to be called to create its capabilities
Groups_Post_Access::activate();
// same thing to created groups for registered users
Groups_Registered::activate();
// add WordPress capabilities
Groups_WordPress::activate();
// ... end of plugin activation work.
}
/**
* Checks current version and triggers update if needed.
*/
public static function version_check() {
global $groups_version, $groups_admin_messages;
$previous_version = get_option( 'groups_plugin_version', null );
$groups_version = GROUPS_CORE_VERSION;
if ( strcmp( $previous_version, $groups_version ) < 0 ) {
if ( self::update( $previous_version ) ) {
update_option( 'groups_plugin_version', $groups_version );
} else {
$groups_admin_messages[] = '
Updating Groups plugin core failed.
';
}
}
}
/**
* Update maintenance.
*/
public static function update( $previous_version ) {
global $wpdb, $groups_admin_messages;
$result = true;
$queries = array();
switch ( $previous_version ) {
case '1.0.0' :
$capability_table = _groups_get_tablename( 'capability' );
if ( $wpdb->get_var( "SHOW TABLES LIKE '$capability_table'" ) == $capability_table ) {
// increase column sizes
$queries[] = "ALTER TABLE $capability_table MODIFY capability VARCHAR(255) UNIQUE NOT NULL;";
$queries[] = "ALTER TABLE $capability_table MODIFY class VARCHAR(255) DEFAULT NULL;";
$queries[] = "ALTER TABLE $capability_table MODIFY object VARCHAR(255) DEFAULT NULL;";
// correct capabilities
$queries[] = "UPDATE $capability_table SET capability='delete_published_pages' WHERE capability='delete_published_pag';";
$queries[] = "UPDATE $capability_table SET capability='delete_published_posts' WHERE capability='delete_published_pos';";
// fix hideously big index
$queries[] = "ALTER TABLE $capability_table DROP INDEX capability_kco;";
$queries[] = "ALTER TABLE $capability_table ADD INDEX capability_kco (capability(20),class(20),object(20));";
}
break;
case '1.0.0-beta-3d' :
$capability_table = _groups_get_tablename( 'capability' );
if ( $wpdb->get_var( "SHOW TABLES LIKE '$capability_table'" ) == $capability_table ) {
// increase column sizes
$queries[] = "ALTER TABLE $capability_table MODIFY capability VARCHAR(255) UNIQUE NOT NULL;";
$queries[] = "ALTER TABLE $capability_table MODIFY class VARCHAR(255) DEFAULT NULL;";
$queries[] = "ALTER TABLE $capability_table MODIFY object VARCHAR(255) DEFAULT NULL;";
// correct capabilities
$queries[] = "UPDATE $capability_table SET capability='delete_published_pages' WHERE capability='delete_published_pag';";
$queries[] = "UPDATE $capability_table SET capability='delete_published_posts' WHERE capability='delete_published_pos';";
}
break;
default :
} // switch
foreach ( $queries as $query ) {
if ( $wpdb->query( $query ) === false ) {
$result = false;
}
}
return $result;
}
/**
* Drop tables and clear data if the plugin is deactivated.
* This will happen only if the user chooses to delete data upon deactivation.
* @param boolean $network_wide
*/
public static function deactivate( $network_wide = false ) {
if ( is_multisite() && $network_wide ) {
if ( Groups_Options::get_option( 'groups_network_delete_data', false ) ) {
$blog_ids = Groups_Utility::get_blogs();
foreach ( $blog_ids as $blog_id ) {
self::switch_to_blog( $blog_id );
self::cleanup( true );
self::restore_current_blog();
}
}
} else {
self::cleanup();
}
}
/**
* Plugin deactivation cleanup.
* @param $drop overrides the groups_delete_data option, default is false
*/
private static function cleanup( $drop = false ) {
global $wpdb, $wp_roles;
$delete_data = Groups_Options::get_option( 'groups_delete_data', false );
if ( $delete_data || $drop ) {
foreach ( $wp_roles->role_objects as $role ) {
$role->remove_cap( GROUPS_ACCESS_GROUPS );
$role->remove_cap( GROUPS_ADMINISTER_GROUPS );
$role->remove_cap( GROUPS_ADMINISTER_OPTIONS );
}
$wpdb->query('DROP TABLE IF EXISTS ' . _groups_get_tablename( 'group' ) );
$wpdb->query('DROP TABLE IF EXISTS ' . _groups_get_tablename( 'capability' ) );
$wpdb->query('DROP TABLE IF EXISTS ' . _groups_get_tablename( 'user_group' ) );
$wpdb->query('DROP TABLE IF EXISTS ' . _groups_get_tablename( 'user_capability' ) );
$wpdb->query('DROP TABLE IF EXISTS ' . _groups_get_tablename( 'group_capability' ) );
Groups_Options::flush_options();
delete_option( GROUPS_ADMINISTRATOR_ACCESS_OVERRIDE );
delete_option( 'groups_plugin_version' );
delete_option( 'groups_delete_data' );
}
}
/**
* Determines the default capabilities for the administrator role.
* In lack of an administrator role, these capabilities are assigned
* to any role that can manage_options.
* This is also used to assure a minimum set of capabilities is
* assigned to an appropriate role, so that it's not possible
* to lock yourself out (although deactivating and then activating
* the plugin would have the same effect but with the danger of
* deleting all plugin data).
* @param boolean $activate defaults to true, when this function is called upon plugin activation
* @access private
*/
public static function set_default_capabilities() {
global $wp_roles;
// The administrator role should be there, if it's not, assign privileges to
// any role that can manage_options:
if ( $administrator_role = $wp_roles->get_role( 'administrator' ) ) {
$administrator_role->add_cap( GROUPS_ACCESS_GROUPS );
$administrator_role->add_cap( GROUPS_ADMINISTER_GROUPS );
$administrator_role->add_cap( GROUPS_ADMINISTER_OPTIONS );
} else {
foreach ( $wp_roles->role_objects as $role ) {
if ($role->has_cap( 'manage_options' ) ) {
$role->add_cap( GROUPS_ACCESS_GROUPS );
$role->add_cap( GROUPS_ADMINISTER_GROUPS );
$role->add_cap( GROUPS_ADMINISTER_OPTIONS );
}
}
}
}
/**
* There must be at least one role with the minimum set of capabilities
* to access and manage the Groups plugin's options.
* If this condition is not met, the minimum set of capabilities is
* reestablished.
*/
public static function assure_capabilities() {
global $wp_roles;
$complies = false;
$roles = $wp_roles->role_objects;
foreach( $roles as $role ) {
if ( $role->has_cap( GROUPS_ACCESS_GROUPS ) && ( $role->has_cap( GROUPS_ADMINISTER_OPTIONS ) ) ) {
$complies = true;
break;
}
}
if ( !$complies ) {
self::set_default_capabilities();
}
}
}
Groups_Controller::boot();