/**
  * Import user membership from group membership
  *
  * @since 1.0.0
  * @param int $user_id
  * @param int $group_id
  * @param int $plan_id
  * @return int|bool Imported membership ID or false on skip/failure
  */
 private function import_user_membership($user_id, $group_id, $plan_id)
 {
     // User is already a member, skip
     if (wc_memberships_is_user_member($user_id, $plan_id)) {
         return false;
     }
     /**
      * Filter new membership data, used when importing membership from Groups
      *
      * @param array $data
      * @param array $args
      */
     $data = apply_filters('wc_memberships_groups_import_membership_data', array('post_parent' => $plan_id, 'post_author' => $user_id, 'post_type' => 'wc_user_membership', 'post_status' => 'wcm-active', 'comment_status' => 'open'), array('user_id' => $user_id, 'group_id' => $group_id));
     // Create a new membership
     $user_membership_id = wp_insert_post($data);
     // Bail out on failure
     if (is_wp_error($user_membership_id)) {
         return false;
     }
     // Save group ID that granted access
     update_post_meta($user_membership_id, '_group_id', $group_id);
     // Save the membership start date
     update_post_meta($user_membership_id, '_start_date', current_time('mysql', true));
     // Calculate membership end date based on membership length
     $plan = wc_memberships_get_membership_plan($plan_id);
     $end_date = '';
     if ($plan->get_access_length_amount()) {
         $now = current_time('timestamp');
         if (strpos($plan->get_access_length_period(), 'month') !== false) {
             $end = wc_memberships()->add_months($now, $plan->get_access_length_amount());
         } else {
             $end = strtotime('+ ' . $plan->get_access_length(), $now);
         }
         $end_date = date('Y-m-d H:i:s', $end);
     }
     // Save/update end date
     $user_membership = wc_memberships_get_user_membership($user_membership_id);
     $user_membership->set_end_date($end_date);
     // Add membership note
     $group = Groups_Group::read($group_id);
     $user_membership->add_note(sprintf(__('Membership imported from Group "%s" (ID #%d)'), $group->name, $group_id));
     return $user_membership_id;
 }
 /**
  * Modify query to filter users by group.
  * 
  * @param WP_User_Query $user_query
  * @return WP_User_Query
  */
 public static function pre_user_query($user_query)
 {
     global $pagenow, $wpdb;
     if ($pagenow == 'users.php' && empty($_GET['page'])) {
         if (isset($_REQUEST['group'])) {
             $group_id = $_REQUEST['group'];
             if (Groups_Group::read($group_id)) {
                 $group = new Groups_Group($group_id);
                 $users = $group->users;
                 $include = array();
                 if (count($users) > 0) {
                     foreach ($users as $user) {
                         $include[] = $user->user->ID;
                     }
                 } else {
                     // no results
                     $include[] = 0;
                 }
                 $ids = implode(',', wp_parse_id_list($include));
                 $user_query->query_where .= " AND {$wpdb->users}.ID IN ({$ids})";
             }
         }
     }
     return $user_query;
 }
/**
 * Get the users based on groups from the User Access Manager plugin
 * $meta_filter can be '', MAILUSERS_ACCEPT_NOTIFICATION_USER_META, or MAILUSERS_ACCEPT_MASS_EMAIL_USER_META
 */
function mailusers_get_recipients_from_itthinx_groups_group($itthinx_groups_ids, $exclude_id = '', $meta_filter = '')
{
    global $wpdb;
    $ids = array();
    //  Make sure we have an array
    if (!is_array($itthinx_groups_ids)) {
        $itthinx_groups_ids = array($itthinx_groups_ids);
    }
    //  No groups?  Return an empty array
    if (empty($itthinx_groups_ids)) {
        return array();
    }
    foreach ($itthinx_groups_ids as $key => $value) {
        $group = new Groups_Group($value);
        foreach ($group->__get('users') as $u) {
            $ids[] = $u->user->ID;
        }
    }
    //  Make sure the list of IDs accounts for the Email Users settings for email
    $ids = mailusers_get_recipients_from_ids($ids, $exclude_id, $meta_filter);
    return $ids;
}
Esempio n. 4
0
 /**
  * Clear cache objects for all users in the group.
  * @param unknown_type $group_id
  */
 public static function clear_cache_for_group($group_id)
 {
     global $wpdb;
     if ($group = Groups_Group::read($group_id)) {
         // not using $group->users, as we don't need a lot of user objects created here
         $user_group_table = _groups_get_tablename("user_group");
         $users = $wpdb->get_results($wpdb->prepare("SELECT ID FROM {$wpdb->users} LEFT JOIN {$user_group_table} ON {$wpdb->users}.ID = {$user_group_table}.user_id WHERE {$user_group_table}.group_id = %d", Groups_Utility::id($group_id)));
         if ($users) {
             foreach ($users as $user) {
                 self::clear_cache($user->ID);
             }
         }
     }
 }
Esempio n. 5
0
/**
 * Get the users based on groups from the User Access Manager plugin
 * $meta_filter can be '', MAILUSERS_ACCEPT_NOTIFICATION_USER_META, or MAILUSERS_ACCEPT_MASS_EMAIL_USER_META
 */
function mailusers_get_itthinx_groups($exclude_id = '', $meta_filter = '')
{
    global $wpdb;
    $itthinx_groups = array();
    $groups = Groups_Utility::get_group_tree();
    $groups = Mailusers_Groups_Utility::flatten_group_tree($groups);
    foreach ($groups as $key => $value) {
        $group = Groups_Group::read($value);
        $ids = mailusers_get_recipients_from_itthinx_groups_group($group->group_id, $exclude_id, $meta_filter);
        if (!empty($ids)) {
            $itthinx_groups[$group->group_id] = $group->name;
        }
    }
    return $itthinx_groups;
}
Esempio n. 6
0
/**
 * Handle add group form submission.
 * @return int new group's id or false if unsuccessful
 */
function groups_admin_groups_add_submit()
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE], 'groups-add')) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $creator_id = get_current_user_id();
    $datetime = date('Y-m-d H:i:s', time());
    $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : null;
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : '';
    $name = isset($_POST['name-field']) ? $_POST['name-field'] : null;
    return Groups_Group::create(compact("creator_id", "datetime", "parent_id", "description", "name"));
}
/**
 * Handle remove form submission.
 */
function groups_admin_groups_remove_submit()
{
    global $wpdb;
    $result = false;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE], 'groups-remove')) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $group_id = isset($_POST['group-id-field']) ? $_POST['group-id-field'] : null;
    $group = Groups_Group::read($group_id);
    if ($group) {
        if ($group->name !== Groups_Registered::REGISTERED_GROUP_NAME) {
            $result = Groups_Group::delete($group_id);
        }
    }
    return $result;
}
/**
 * Handle edit form submission.
 */
function groups_admin_groups_edit_submit()
{
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE], 'groups-edit')) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $group_id = isset($_POST['group-id-field']) ? $_POST['group-id-field'] : null;
    $group = Groups_Group::read($group_id);
    if ($group) {
        $group_id = $group->group_id;
        if ($group->name !== Groups_Registered::REGISTERED_GROUP_NAME) {
            $name = isset($_POST['name-field']) ? $_POST['name-field'] : null;
        } else {
            $name = Groups_Registered::REGISTERED_GROUP_NAME;
        }
        $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : null;
        $description = isset($_POST['description-field']) ? $_POST['description-field'] : '';
        return Groups_Group::update(compact("group_id", "name", "parent_id", "description"));
    } else {
        return false;
    }
}
function gpbbp_new_post_notification($post_id, $post, $post_type)
{
    $post_is_reply = $post_type == bbp_get_reply_post_type() ? true : false;
    $post_topic = $post_is_reply ? get_post(bbp_get_topic_id())->post_title : $post->post_title;
    $post_author = get_user_by('id', $post->post_author);
    $post_forum_title = bbp_get_forum_title($forum_id);
    $post_info = array('topic' => htmlspecialchars_decode($post_topic, ENT_QUOTES), 'topic_id' => bbp_get_topic_id(), 'category' => $post_forum_title, 'category_id' => $forum_id, 'category_slug' => str_replace(' ', '', $post_forum_title), 'is_reply' => $post_is_reply, 'author' => "{$post_author->first_name} {$post_author->last_name}", 'author_brand' => $post_author->brand, 'author_username' => $post_author->display_name, 'body' => $post->post_content, 'permalink' => $post_is_reply ? get_permalink(bbp_get_topic_id()) . "#post-{$post_id}" : get_permalink($post_id), 'user_slug' => home_url() . '/directory/user/' . $post->post_author);
    $group = Groups_Group::read_by_name($post_forum_title);
    $group = new Groups_Group($group->group_id);
    $mandrill_endpoint = 'https://mandrillapp.com/api/1.0/messages/send-template.json';
    $mandrill_key = 'MANDRILL KEY';
    $mandrill_template = 'new-post-notification-backup-mc-version-1';
    $mandrill_merge_vars = array();
    $mandrill_recipients[] = array();
    foreach ($group->users as $group_member) {
        if ($group_member->user->ID != $post->post_author) {
            $mandrill_recipients[] = array('email' => $group_member->user->user_email, 'name' => $group_member->user->display_name);
        }
    }
    // Set up merge vars
    foreach ($post_info as $key => $value) {
        $mandrill_merge_vars[] = array('name' => $key, 'content' => $value);
    }
    // Prepare request
    $mandrill_request = array('key' => $mandrill_key, 'template_name' => $mandrill_template, 'template_content' => array(), 'message' => array('to' => $mandrill_recipients, 'global_merge_vars' => $mandrill_merge_vars, 'merge' => true, 'merge_language' => 'handlebars'));
    // Send request
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $mandrill_endpoint);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($mandrill_request));
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mandrill-Curl/1.0');
    $result = curl_exec($ch);
    curl_close($ch);
}
Esempio n. 10
0
function woocommerce_dynamic_pricing_groups_is_rule_set_valid_for_user($result, $condition, $rule_set)
{
    $groups_user = new Groups_User(get_current_user_id());
    switch ($condition['type']) {
        case 'apply_to':
            if (is_array($condition['args']) && isset($condition['args']['applies_to'])) {
                if ($condition['args']['applies_to'] == 'groups' && isset($condition['args']['groups']) && is_array($condition['args']['groups'])) {
                    if (is_user_logged_in()) {
                        foreach ($condition['args']['groups'] as $group) {
                            $current_group = Groups_Group::read($group);
                            if ($current_group) {
                                if (Groups_User_Group::read($groups_user->user->ID, $current_group->group_id)) {
                                    $result = 1;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            break;
        default:
            break;
    }
    return $result;
}
 /**
  * Renders a form that lets a user leave a group.
  * * Attributes:
  * - "group" : (required) group name or id
  *
  * @param array $atts attributes
  * @param string $content not used
  */
 public static function groups_leave($atts, $content = null)
 {
     $nonce_action = 'groups_action';
     $nonce = 'nonce_leave';
     $output = "";
     $options = shortcode_atts(array('group' => '', 'display_message' => true, 'submit_text' => __('Leave the %s group', GROUPS_PLUGIN_DOMAIN)), $atts);
     extract($options);
     if ($display_message === 'false') {
         $display_message = false;
     }
     $group = trim($options['group']);
     $current_group = Groups_Group::read($group);
     if (!$current_group) {
         $current_group = Groups_Group::read_by_name($group);
     }
     if ($current_group) {
         if ($user_id = get_current_user_id()) {
             $submitted = false;
             $invalid_nonce = false;
             if (!empty($_POST['groups_action']) && $_POST['groups_action'] == 'leave') {
                 $submitted = true;
                 if (!wp_verify_nonce($_POST[$nonce], $nonce_action)) {
                     $invalid_nonce = true;
                 }
             }
             if ($submitted && !$invalid_nonce) {
                 // remove user from group
                 if (isset($_POST['group_id'])) {
                     $leave_group = Groups_Group::read($_POST['group_id']);
                     Groups_User_Group::delete($user_id, $leave_group->group_id);
                 }
             }
             if (Groups_User_Group::read($user_id, $current_group->group_id)) {
                 $submit_text = sprintf($options['submit_text'], wp_filter_nohtml_kses($current_group->name));
                 $output .= '<div class="groups-join">';
                 $output .= '<form action="#" method="post">';
                 $output .= '<input type="hidden" name="groups_action" value="leave" />';
                 $output .= '<input type="hidden" name="group_id" value="' . esc_attr($current_group->group_id) . '" />';
                 $output .= '<input type="submit" value="' . $submit_text . '" />';
                 $output .= wp_nonce_field($nonce_action, $nonce, true, false);
                 $output .= '</form>';
                 $output .= '</div>';
             } else {
                 if ($display_message) {
                     if ($submitted && !$invalid_nonce && isset($leave_group) && $leave_group->group_id === $current_group->group_id) {
                         $output .= '<div class="groups-join left">';
                         $output .= sprintf(__('You have left the %s group.', GROUPS_PLUGIN_DOMAIN), wp_filter_nohtml_kses($leave_group->name));
                         $output .= '</div>';
                     }
                 }
             }
         }
     }
     return $output;
 }
 /**
  * Update user-group relation.
  * 
  * This is a relation and as the relation is, this does nothing and
  * it SHOULD do nothing.
  * 
  * @param array $map
  * @return true on success, otherwise false
  */
 public static function update($map)
 {
     $result = false;
     //		if ( !empty( $user_id ) && !empty( $group_id) ) {
     if (!empty($group_id)) {
         // make sure user and group exist
         if (false !== Groups_Utility::id($user_id) && get_user_by("id", $user_id) && Groups_Group::read($group_id)) {
             $result = true;
             do_action("groups_updated_user_group", $user_id, $group_id);
         }
     }
     return $result;
 }
 /**
  * Takes one attribute "group" which is a comma-separated list of group
  * names or ids (can be mixed).
  * The content is shown if the current user does NOT belong to the group(s).
  *
  * @param array $atts attributes
  * @param string $content content to render
  */
 public static function groups_non_member($atts, $content = null)
 {
     $output = "";
     $options = shortcode_atts(array("group" => ""), $atts);
     $show_content = true;
     if ($content !== null) {
         $groups_user = new Groups_User(get_current_user_id());
         $groups = explode(",", $options['group']);
         foreach ($groups as $group) {
             $group = trim($group);
             $current_group = Groups_Group::read($group);
             if (!$current_group) {
                 $current_group = Groups_Group::read_by_name($group);
             }
             if ($current_group) {
                 if (Groups_User_Group::read($groups_user->user->ID, $current_group->group_id)) {
                     $show_content = false;
                     break;
                 }
             }
         }
         if ($show_content) {
             remove_shortcode('groups_non_member');
             $content = do_shortcode($content);
             add_shortcode('groups_non_member', array(__CLASS__, 'groups_non_member'));
             $output = $content;
         }
     }
     return $output;
 }
Esempio n. 14
0
 function groups_tests()
 {
     assert_options(ASSERT_ACTIVE, true);
     assert_options(ASSERT_WARNING, true);
     assert_options(ASSERT_BAIL, false);
     //
     // PART 1 : create test data
     //
     // *** groups ***
     // create valid test groups
     //
     //		  Fruits [dance] {foo}
     //		/	   \
     //   Sweet {dol}   Sour [sing]
     //	 |			|
     //   Banana {baz}  Lemon {bar}
     //
     // All groups can dance.
     // Only Sour and Lemon can sing.
     $fruits_group_id = Groups_Group::create(array('name' => 'Fruits'));
     assert('$fruits_group_id !== false');
     $sweet_group_id = Groups_Group::create(array('name' => 'Sweet', 'parent_id' => $fruits_group_id));
     assert('$sweet_group_id !== false');
     $sour_group_id = Groups_Group::create(array('name' => 'Sour', 'parent_id' => $fruits_group_id));
     assert('$sour_group_id !== false');
     $lemon_group_id = Groups_Group::create(array('name' => 'Lemon', 'parent_id' => $sour_group_id));
     assert('$lemon_group_id !== false');
     $banana_group_id = Groups_Group::create(array('name' => 'Banana', 'parent_id' => $sweet_group_id));
     assert('$banana_group_id !== false');
     // fail to create group with missing name
     $bogus_group_id = Groups_Group::create(array());
     assert('$bogus_group_id === false; /* empty name */');
     // fail to create group with wrong parent_id
     $bogus_group_id = Groups_Group::create(array('name' => 'bogus', 'parent_id' => -1));
     assert('$bogus_group_id === false; /* wrong parent_id */');
     // *** capabilities ***
     $sing_capability_id = Groups_Capability::create(array('capability' => 'sing'));
     assert('$sing_capability_id !== false');
     $dance_capability_id = Groups_Capability::create(array('capability' => 'dance'));
     assert('$dance_capability_id !== false');
     $clap_capability_id = Groups_Capability::create(array('capability' => 'clap'));
     assert('$clap_capability_id !== false');
     // read capability by id
     assert('Groups_Capability::read( $sing_capability_id )');
     // read capability by unique label
     assert('Groups_Capability::read_by_capability( "dance" )');
     // *** users ***
     // create test users
     $fooname = 'foo' . rand(0, 100);
     $foo_user_id = wp_create_user($fooname, 'foo', $fooname . '@example.com');
     assert('$foo_user_id instanceof WP_Error === false');
     $barname = 'bar' . rand(0, 100);
     $bar_user_id = wp_create_user($barname, 'bar', $barname . '@example.com');
     assert('$bar_user_id instanceof WP_Error === false');
     // this user is used to test the automatic resolution of its relationship
     // with the banana group when the group is deleted
     // it's also used to test automatic resolution of its "clap" capability
     // after that capability has been deleted
     $bazname = 'baz' . rand(0, 100);
     $baz_user_id = wp_create_user($bazname, 'baz', $bazname . '@example.com');
     assert('$baz_user_id instanceof WP_Error === false');
     // this user is deleted, the group relation must be deleted automatically
     $dolname = 'dol' . rand(0, 100);
     $dol_user_id = wp_create_user($dolname, 'dol', $dolname . ' @example.com');
     assert('$dol_user_id instanceof WP_Error === false');
     // this user is a simple editor, used to test WordPress capabilities
     $editorname = 'rotide' . rand(0, 100);
     $editor_user_id = wp_create_user($editorname, 'rotide', $editorname . '@example.com');
     assert('$editor_user_id instanceof WP_Error === false');
     if (!$editor_user_id instanceof WP_Error) {
         $editor_user = new WP_User($editor_user_id);
         $editor_user->set_role('editor');
     } else {
         $editor_user_id = false;
     }
     // *** users & groups ***
     // add valid users to groups
     //		 echo "foo user id: $foo_user_id group: $fruits_group_id<br/>";
     assert('Groups_User_Group::create(array( "user_id" => $foo_user_id, "group_id" => $fruits_group_id ) )');
     assert('Groups_User_Group::create(array( "user_id" => $bar_user_id, "group_id" => $lemon_group_id ) )');
     assert('Groups_User_Group::create(array( "user_id" => $baz_user_id, "group_id" => $banana_group_id ) )');
     assert('Groups_User_Group::create(array( "user_id" => $dol_user_id, "group_id" => $sweet_group_id ) )');
     // add invalid user to group
     assert('Groups_User_Group::create(array( "user_id" => -1, "group_id" => $sweet_group_id ) ) === false');
     // add valid user to invalid group
     assert('Groups_User_Group::create(array( "user_id" => $dol_user_id, "group_id" => -1 ) ) === false');
     // define capabilities for groups
     assert('Groups_Group_Capability::create( array( "group_id" => $fruits_group_id, "capability_id" => $dance_capability_id ) )');
     assert('Groups_Group_Capability::create( array( "group_id" => $sour_group_id, "capability_id" => $sing_capability_id ) )');
     // define capabilities for users
     assert('Groups_User_Capability::create( array( "user_id" => $foo_user_id, "capability_id" => $clap_capability_id ) )');
     assert('Groups_User_Capability::create( array( "user_id" => $baz_user_id, "capability_id" => $clap_capability_id ) )');
     // check groups that can dance (all)
     // just reading will not check the hierarchy of course ...
     assert('Groups_Group_Capability::read( $fruits_group_id, $dance_capability_id )');
     assert('Groups_Group_Capability::read( $sweet_group_id, $dance_capability_id ) === false');
     assert('Groups_Group_Capability::read( $banana_group_id, $dance_capability_id ) === false');
     assert('Groups_Group_Capability::read( $sour_group_id, $dance_capability_id ) === false');
     assert('Groups_Group_Capability::read( $lemon_group_id, $dance_capability_id ) === false');
     // same for check on groups that can sing
     assert('Groups_Group_Capability::read( $fruits_group_id, $sing_capability_id ) === false');
     assert('Groups_Group_Capability::read( $sweet_group_id, $sing_capability_id ) === false');
     assert('Groups_Group_Capability::read( $banana_group_id, $sing_capability_id ) === false');
     assert('Groups_Group_Capability::read( $sour_group_id, $sing_capability_id )');
     assert('Groups_Group_Capability::read( $lemon_group_id, $sing_capability_id ) === false');
     // hierarchical groups
     $fruits_group = new Groups_Group($fruits_group_id);
     $sweet_group = new Groups_Group($sweet_group_id);
     $banana_group = new Groups_Group($banana_group_id);
     $sour_group = new Groups_Group($sour_group_id);
     $lemon_group = new Groups_Group($lemon_group_id);
     // retrieve users
     assert('count( $fruits_group->users ) > 0');
     // all should be able to "dance" : check by capability label ...
     assert('$fruits_group->can( "dance" )');
     assert('$sweet_group->can( "dance" )');
     assert('$banana_group->can( "dance" )');
     assert('$sour_group->can( "dance" )');
     assert('$lemon_group->can( "dance" )');
     // ... or id
     assert('$fruits_group->can( $dance_capability_id )');
     assert('$sweet_group->can( $dance_capability_id )');
     assert('$banana_group->can( $dance_capability_id )');
     assert('$sour_group->can( $dance_capability_id )');
     assert('$lemon_group->can( $dance_capability_id )');
     // only sour and lemon can sing:
     assert('!$fruits_group->can( "sing" )');
     assert('!$sweet_group->can( "sing" )');
     assert('!$banana_group->can( "sing" )');
     assert('$sour_group->can( "sing" )');
     assert('$lemon_group->can( "sing" )');
     // ... or id
     assert('!$fruits_group->can( $sing_capability_id )');
     assert('!$sweet_group->can( $sing_capability_id )');
     assert('!$banana_group->can( $sing_capability_id )');
     assert('$sour_group->can( $sing_capability_id )');
     assert('$lemon_group->can( $sing_capability_id )');
     // no group can clap
     assert('!$fruits_group->can( $clap_capability_id )');
     assert('!$sweet_group->can( $clap_capability_id )');
     assert('!$banana_group->can( $clap_capability_id )');
     assert('!$sour_group->can( $clap_capability_id )');
     assert('!$lemon_group->can( $clap_capability_id )');
     // user capabilities
     $foo = new Groups_User($foo_user_id);
     $dol = new Groups_User($dol_user_id);
     $baz = new Groups_User($baz_user_id);
     $bar = new Groups_User($bar_user_id);
     assert('$foo->can( "dance" )');
     assert('$dol->can( "dance" )');
     assert('$baz->can( "dance" )');
     assert('$bar->can( "dance" )');
     assert('$foo->can( $dance_capability_id )');
     assert('$dol->can( $dance_capability_id )');
     assert('$baz->can( $dance_capability_id )');
     assert('$bar->can( $dance_capability_id )');
     assert('!$foo->can( "sing" )');
     assert('!$dol->can( "sing" )');
     assert('!$baz->can( "sing" )');
     assert('$bar->can( "sing" )');
     assert('!$foo->can( $sing_capability_id )');
     assert('!$dol->can( $sing_capability_id )');
     assert('!$baz->can( $sing_capability_id )');
     assert('$bar->can( $sing_capability_id )');
     // only foo & baz can clap
     assert('$foo->can( "clap" )');
     assert('!$dol->can( "clap" )');
     assert('$baz->can( "clap" )');
     assert('!$bar->can( "clap" )');
     assert('$foo->can( $clap_capability_id )');
     assert('!$dol->can( $clap_capability_id )');
     assert('$baz->can( $clap_capability_id )');
     assert('!$bar->can( $clap_capability_id )');
     // user can not what is not defined
     assert('!$foo->can( null )');
     assert('!$dol->can( null )');
     assert('!$baz->can( null )');
     assert('!$bar->can( null )');
     assert('!$foo->can( "bogus" )');
     assert('!$dol->can( "bogus" )');
     assert('!$baz->can( "bogus" )');
     assert('!$bar->can( "bogus" )');
     // groups can not what is not defined
     assert('!$fruits_group->can( null )');
     assert('!$sweet_group->can( null )');
     assert('!$banana_group->can( null )');
     assert('!$sour_group->can( null )');
     assert('!$lemon_group->can( null )');
     assert('!$fruits_group->can( "bogus" )');
     assert('!$sweet_group->can( "bogus" )');
     assert('!$banana_group->can( "bogus" )');
     assert('!$sour_group->can( "bogus" )');
     assert('!$lemon_group->can( "bogus" )');
     // test WordPress capabilities
     $administrator = new Groups_User(1);
     assert('$administrator->can( "activate_plugins" )');
     if ($editor_user_id) {
         $editor = new Groups_User($editor_user_id);
         assert('$editor->can( "edit_posts" )');
         assert('!$editor->can( "activate_plugins" )');
     }
     if (is_multisite()) {
         //			 $randext = rand( 0, 100 );
         //			 $wpmu_test_user_id = wp_create_user( 'wpmu_test_user' . $randext, 'wpmu_test_user' );
         //			 assert( '$wpmu_test_user_id instanceof WP_Error === false');
         // @todo create a blog => must create new tables
         //			 wpmu_create_blog( "groups_wpmu_" . $randext, "groups_wpmu_" . $randext, "Groups WPMU Test", $wpmu_test_user_id );
         // @todo add user to new blog
         // @todo switch to new blog
         // @todo check that new user is in "Registered" group
         // @todo switch to current blog
     }
     //
     // PART 2 : delete test data
     //
     if (is_multisite()) {
         // @todo delete new blog
     }
     // remove capabilities from groups
     assert('Groups_Group_Capability::delete( $fruits_group_id, $dance_capability_id )');
     // remove users from groups
     assert('Groups_User_Group::delete($foo_user_id, $fruits_group_id)');
     assert('Groups_User_Group::delete($bar_user_id, $lemon_group_id)');
     // baz must be deleted from user_group when banana group is deleted
     // invalid remove user from group
     assert('Groups_User_Group::delete($foo_user_id, $banana_group_id) === false');
     // delete test users
     include_once ABSPATH . '/wp-admin/includes/user.php';
     if ($foo_user_id && !$foo_user_id instanceof WP_Error) {
         assert('wp_delete_user( $foo_user_id ) === true');
     }
     if ($bar_user_id && !$bar_user_id instanceof WP_Error) {
         assert('wp_delete_user( $bar_user_id ) === true');
     }
     if ($dol_user_id && !$dol_user_id instanceof WP_Error) {
         assert('wp_delete_user( $dol_user_id ) === true');
         if ($sweet_group_id) {
             // see above, this user must have been removed from the group upon its deletion
             assert('Groups_User_Group::read( $dol_user_id, $sweet_group_id ) === false');
         }
     }
     if ($editor_user_id && !$editor_user_id instanceof WP_Error) {
         assert('wp_delete_user( $editor_user_id ) === true');
     }
     // fail to delete inexisting capabilities
     assert('Groups_Capability::delete( -1 ) === false');
     // delete valid test capabilities
     if ($sing_capability_id) {
         assert('Groups_Capability::delete( $sing_capability_id ) !== false');
     }
     if ($dance_capability_id) {
         assert('Groups_Capability::delete( $dance_capability_id ) !== false');
     }
     if ($clap_capability_id) {
         assert('Groups_Capability::delete( $clap_capability_id ) !== false');
     }
     // baz shouldn't be able to clap if there's no clapping capability anymore
     if ($baz_user_id && !$baz_user_id instanceof WP_Error) {
         assert('!$baz->can( "clap" )');
     }
     // fail to delete inexisting group
     assert('Groups_Group::delete( -1 ) === false');
     // delete invalid test group if creation was successful
     if ($bogus_group_id) {
         assert('Groups_Group::delete( $bogus_group_id )');
     }
     // delete valid test groups
     if ($fruits_group_id) {
         assert('Groups_Group::delete( $fruits_group_id )');
     }
     if ($sweet_group_id) {
         assert('Groups_Group::delete( $sweet_group_id )');
     }
     if ($sour_group_id) {
         assert('Groups_Group::delete( $sour_group_id )');
     }
     if ($lemon_group_id) {
         assert('Groups_Group::delete( $lemon_group_id )');
     }
     if ($banana_group_id) {
         assert('Groups_Group::delete( $banana_group_id )');
         assert('Groups_User_Group::delete($baz_user_id, $banana_group_id ) === false');
     }
     // this user must not be deleted before as it is used to test that its
     // relationship with the banana group is resolved when the group is deleted
     if ($baz_user_id && !$baz_user_id instanceof WP_Error) {
         assert('wp_delete_user( $baz_user_id ) === true');
     }
 }
 /**
  * Save variation parameters.
  * 
  * @param int $variation_id
  * @param int $i
  */
 public static function woocommerce_save_product_variation($variation_id, $i)
 {
     // variations
     $variation_post_ids = isset($_POST['variable_post_id']) ? $_POST['variable_post_id'] : null;
     if ($variation_post_ids !== null && is_array($variation_post_ids)) {
         foreach ($variation_post_ids as $variation_post_id) {
             $variation_post_id = intval($variation_post_id);
             delete_post_meta($variation_post_id, '_groups_variation_groups');
             delete_post_meta($variation_post_id, '_groups_variation_groups_remove');
             if (!empty($_POST['_groups_variation_groups']) && is_array($_POST['_groups_variation_groups'])) {
                 if (!empty($_POST['_groups_variation_groups'][$variation_post_id]) && is_array($_POST['_groups_variation_groups'][$variation_post_id])) {
                     foreach ($_POST['_groups_variation_groups'][$variation_post_id] as $group_id) {
                         if ($group = Groups_Group::read($group_id)) {
                             add_post_meta($variation_post_id, '_groups_variation_groups', $group->group_id);
                         }
                     }
                 }
             }
             if (!empty($_POST['_groups_variation_groups_remove']) && is_array($_POST['_groups_variation_groups_remove'])) {
                 if (!empty($_POST['_groups_variation_groups_remove'][$variation_post_id]) && is_array($_POST['_groups_variation_groups_remove'][$variation_post_id])) {
                     foreach ($_POST['_groups_variation_groups_remove'][$variation_post_id] as $group_id) {
                         if ($group = Groups_Group::read($group_id)) {
                             add_post_meta($variation_post_id, '_groups_variation_groups_remove', $group->group_id);
                         }
                     }
                 }
             }
         }
     }
 }
Esempio n. 16
0
 public static function render_group_tree(&$tree, &$output)
 {
     $output .= '<ul style="padding-left:1em">';
     foreach ($tree as $group_id => $nodes) {
         $output .= '<li>';
         $group = Groups_Group::read($group_id);
         if ($group) {
             $output .= $group->name;
         }
         if (!empty($nodes)) {
             self::render_group_tree($nodes, $output);
         }
         $output .= '</li>';
     }
     $output .= '</ul>';
 }
 public static function create_registration_group($group_name, $users)
 {
     // Check if Groups plugin is active
     if (is_plugin_active('groups/groups.php')) {
         Groups_Group::create(array('name' => $group_name));
         if ($group = Groups_Group::read_by_name($group_name)) {
             $group_id = $group->group_id;
         }
         if (!empty($group_id)) {
             foreach ($users as $user_id) {
                 Groups_User_Group::create(array('user_id' => $user_id, 'group_id' => $group_id));
             }
         }
     }
 }
 private function handle_condition($condition)
 {
     $groups_user = new Groups_User(get_current_user_id());
     $result = 0;
     if ($groups_user && $groups_user->user) {
         switch ($condition['type']) {
             case 'apply_to':
                 if (is_array($condition['args']) && isset($condition['args']['applies_to'])) {
                     if ($condition['args']['applies_to'] == 'groups' && isset($condition['args']['groups']) && is_array($condition['args']['groups'])) {
                         if (is_user_logged_in()) {
                             foreach ($condition['args']['groups'] as $group) {
                                 $current_group = Groups_Group::read($group);
                                 if ($current_group) {
                                     if (Groups_User_Group::read($groups_user->user->ID, $current_group->group_id)) {
                                         $result = 1;
                                         break;
                                     }
                                 }
                             }
                         }
                     }
                 }
                 break;
             default:
                 break;
         }
     }
     return $result;
 }
/**
 * Handle remove form submission.
 * @return array of deleted groups' ids
 */
function groups_admin_groups_bulk_remove_submit()
{
    global $wpdb;
    $result = array();
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_ACTION_NONCE], 'admin')) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $group_ids = isset($_POST['group_ids']) ? $_POST['group_ids'] : null;
    if ($group_ids) {
        foreach ($group_ids as $group_id) {
            $group = Groups_Group::read($group_id);
            if ($group) {
                if ($group->name !== Groups_Registered::REGISTERED_GROUP_NAME) {
                    if (Groups_Group::delete($group_id)) {
                        $result[] = $group->group_id;
                    }
                }
            }
        }
    }
    return $result;
}
 /**
  * Assign a user to its "Registered" group for the given blog.
  * 
  * @param int $user_id
  * @param WP_string $role
  */
 function add_user_to_blog($user_id, $role, $blog_id)
 {
     if (is_multisite()) {
         Groups_Controller::switch_to_blog($blog_id);
     }
     global $wpdb;
     // Check if the group table exists, if it does not exist, we are
     // probably here because the action has been triggered in the middle
     // of wpmu_create_blog() before the wpmu_new_blog action has been
     // triggered. In that case, just skip this as the user will be added
     // later when wpmu_new_blog is triggered, the activation sequence has
     // created the tables and all users of the new blog are added to
     // that blog's "Registered" group.
     $group_table = _groups_get_tablename('group');
     if ($wpdb->get_var("SHOW TABLES LIKE '" . $group_table . "'") == $group_table) {
         $registered_group = Groups_Group::read_by_name(self::REGISTERED_GROUP_NAME);
         if (!$registered_group) {
             $registered_group_id = Groups_Group::create(array("name" => self::REGISTERED_GROUP_NAME));
         } else {
             $registered_group_id = $registered_group->group_id;
         }
         if ($registered_group_id) {
             Groups_User_Group::create(array('user_id' => $user_id, 'group_id' => $registered_group_id));
         }
     }
     if (is_multisite()) {
         Groups_Controller::restore_current_blog();
     }
 }
Esempio n. 21
0
/**
 * Manage Groups: table of groups and add, edit, remove actions.
 */
function groups_admin_groups()
{
    global $wpdb;
    $output = '';
    $today = date('Y-m-d', time());
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    //
    // handle actions
    //
    if (isset($_POST['action'])) {
        //  handle action submit - do it
        switch ($_POST['action']) {
            case 'add':
                if (!($group_id = groups_admin_groups_add_submit())) {
                    return groups_admin_groups_add();
                } else {
                    $group = Groups_Group::read($group_id);
                    Groups_Admin::add_message(sprintf(__("The <em>%s</em> group has been created.", GROUPS_PLUGIN_DOMAIN), stripslashes(wp_filter_nohtml_kses($group->name))));
                }
                break;
            case 'edit':
                if (!($group_id = groups_admin_groups_edit_submit())) {
                    return groups_admin_groups_edit($_POST['group-id-field']);
                } else {
                    $group = Groups_Group::read($group_id);
                    Groups_Admin::add_message(sprintf(__('The <em>%s</em> group has been updated.', GROUPS_PLUGIN_DOMAIN), stripslashes(wp_filter_nohtml_kses($group->name))));
                }
                break;
            case 'remove':
                if ($group_id = groups_admin_groups_remove_submit()) {
                    Groups_Admin::add_message(__('The group has been deleted.', GROUPS_PLUGIN_DOMAIN));
                }
                break;
                // bulk actions on groups: add capabilities, remove capabilities, remove groups
            // bulk actions on groups: add capabilities, remove capabilities, remove groups
            case 'groups-action':
                if (wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_ACTION_NONCE], 'admin')) {
                    $group_ids = isset($_POST['group_ids']) ? $_POST['group_ids'] : null;
                    $bulk_action = null;
                    if (isset($_POST['bulk'])) {
                        $bulk_action = $_POST['bulk-action'];
                    }
                    if (is_array($group_ids) && $bulk_action !== null) {
                        foreach ($group_ids as $group_id) {
                            switch ($bulk_action) {
                                case 'add-capability':
                                    $capabilities_id = isset($_POST['capability_id']) ? $_POST['capability_id'] : null;
                                    if ($capabilities_id !== null) {
                                        foreach ($capabilities_id as $capability_id) {
                                            Groups_Group_Capability::create(array('group_id' => $group_id, 'capability_id' => $capability_id));
                                        }
                                    }
                                    break;
                                case 'remove-capability':
                                    $capabilities_id = isset($_POST['capability_id']) ? $_POST['capability_id'] : null;
                                    if ($capabilities_id !== null) {
                                        foreach ($capabilities_id as $capability_id) {
                                            Groups_Group_Capability::delete($group_id, $capability_id);
                                        }
                                    }
                                    break;
                                case 'remove-group':
                                    $bulk_confirm = isset($_POST['confirm']) ? true : false;
                                    if ($bulk_confirm) {
                                        groups_admin_groups_bulk_remove_submit();
                                    } else {
                                        return groups_admin_groups_bulk_remove();
                                    }
                                    break;
                            }
                        }
                    }
                }
                break;
        }
    } else {
        if (isset($_GET['action'])) {
            // handle action request - show form
            switch ($_GET['action']) {
                case 'add':
                    return groups_admin_groups_add();
                    break;
                case 'edit':
                    if (isset($_GET['group_id'])) {
                        return groups_admin_groups_edit($_GET['group_id']);
                    }
                    break;
                case 'remove':
                    if (isset($_GET['group_id'])) {
                        return groups_admin_groups_remove($_GET['group_id']);
                    }
                    break;
            }
        }
    }
    //
    // group table
    //
    if (isset($_POST['clear_filters']) || isset($_POST['group_id']) || isset($_POST['group_name'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_FILTER_NONCE], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    // filters
    $group_id = Groups_Options::get_user_option('groups_group_id', null);
    $group_name = Groups_Options::get_user_option('groups_group_name', null);
    if (isset($_POST['clear_filters'])) {
        Groups_Options::delete_user_option('groups_group_id');
        Groups_Options::delete_user_option('groups_group_name');
        $group_id = null;
        $group_name = null;
    } else {
        if (isset($_POST['submitted'])) {
            // filter by name
            if (!empty($_POST['group_name'])) {
                $group_name = $_POST['group_name'];
                Groups_Options::update_user_option('groups_group_name', $group_name);
            }
            // filter by group id
            if (!empty($_POST['group_id'])) {
                $group_id = intval($_POST['group_id']);
                Groups_Options::update_user_option('groups_group_id', $group_id);
            } else {
                if (isset($_POST['group_id'])) {
                    // empty && isset => '' => all
                    $group_id = null;
                    Groups_Options::delete_user_option('groups_group_id');
                }
            }
        }
    }
    if (isset($_POST['row_count'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE_1], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    if (isset($_POST['paged'])) {
        if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE_2], 'admin')) {
            wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
        }
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $current_url = remove_query_arg('paged', $current_url);
    $current_url = remove_query_arg('action', $current_url);
    $current_url = remove_query_arg('group_id', $current_url);
    $group_table = _groups_get_tablename('group');
    $output .= '<div class="manage-groups">' . '<div>' . '<h2>' . _x('Groups', 'page-title', GROUPS_PLUGIN_DOMAIN) . '</h2>' . '</div>';
    $output .= Groups_Admin::render_messages();
    $output .= '<div class="manage">' . "<a title='" . __('Click to add a new group', GROUPS_PLUGIN_DOMAIN) . "' class='add button' href='" . esc_url($current_url) . "&action=add'><img class='icon' alt='" . __('Add', GROUPS_PLUGIN_DOMAIN) . "' src='" . GROUPS_PLUGIN_URL . "images/add.png'/><span class='label'>" . __('New Group', GROUPS_PLUGIN_DOMAIN) . "</span></a>" . '</div>';
    $row_count = isset($_POST['row_count']) ? intval($_POST['row_count']) : 0;
    if ($row_count <= 0) {
        $row_count = Groups_Options::get_user_option('groups_per_page', GROUPS_GROUPS_PER_PAGE);
    } else {
        Groups_Options::update_user_option('groups_per_page', $row_count);
    }
    $offset = isset($_GET['offset']) ? intval($_GET['offset']) : 0;
    if ($offset < 0) {
        $offset = 0;
    }
    $paged = isset($_REQUEST['paged']) ? intval($_REQUEST['paged']) : 0;
    if ($paged < 0) {
        $paged = 0;
    }
    $orderby = isset($_GET['orderby']) ? $_GET['orderby'] : null;
    switch ($orderby) {
        case 'group_id':
        case 'name':
            break;
        default:
            $orderby = 'name';
    }
    $order = isset($_GET['order']) ? $_GET['order'] : null;
    switch ($order) {
        case 'asc':
        case 'ASC':
            $switch_order = 'DESC';
            break;
        case 'desc':
        case 'DESC':
            $switch_order = 'ASC';
            break;
        default:
            $order = 'ASC';
            $switch_order = 'DESC';
    }
    $filters = array(" 1=%d ");
    $filter_params = array(1);
    if ($group_id) {
        $filters[] = " {$group_table}.group_id = %d ";
        $filter_params[] = $group_id;
    }
    if ($group_name) {
        $filters[] = " {$group_table}.name LIKE '%%%s%%' ";
        $filter_params[] = $group_name;
    }
    if (!empty($filters)) {
        $filters = " WHERE " . implode(" AND ", $filters);
    } else {
        $filters = '';
    }
    $count_query = $wpdb->prepare("SELECT COUNT(*) FROM {$group_table} {$filters}", $filter_params);
    $count = $wpdb->get_var($count_query);
    if ($count > $row_count) {
        $paginate = true;
    } else {
        $paginate = false;
    }
    $pages = ceil($count / $row_count);
    if ($paged > $pages) {
        $paged = $pages;
    }
    if ($paged != 0) {
        $offset = ($paged - 1) * $row_count;
    }
    $query = $wpdb->prepare("SELECT * FROM {$group_table}\n\t\t{$filters}\n\t\tORDER BY {$orderby} {$order}\n\t\tLIMIT {$row_count} OFFSET {$offset}", $filter_params);
    $results = $wpdb->get_results($query, OBJECT);
    $column_display_names = array('group_id' => __('Id', GROUPS_PLUGIN_DOMAIN), 'name' => __('Group', GROUPS_PLUGIN_DOMAIN), 'description' => __('Description', GROUPS_PLUGIN_DOMAIN), 'capabilities' => __('Capabilities', GROUPS_PLUGIN_DOMAIN), 'edit' => __('Edit', GROUPS_PLUGIN_DOMAIN), 'remove' => __('Remove', GROUPS_PLUGIN_DOMAIN));
    $output .= '<div class="groups-overview">';
    $output .= '<div class="filters">' . '<label class="description" for="setfilters">' . __('Filters', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<form id="setfilters" action="" method="post">' . '<p>' . '<label class="group-id-filter" for="group_id">' . __('Group Id', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input class="group-id-filter" name="group_id" type="text" value="' . esc_attr($group_id) . '"/>' . '<label class="group-name-filter" for="group_name">' . __('Group Name', GROUPS_PLUGIN_DOMAIN) . '</label>' . '<input class="group-name-filter" name="group_name" type="text" value="' . $group_name . '"/>' . '</p>' . '<p>' . wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_FILTER_NONCE, true, false) . '<input class="button" type="submit" value="' . __('Apply', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input class="button" type="submit" name="clear_filters" value="' . __('Clear', GROUPS_PLUGIN_DOMAIN) . '"/>' . '<input type="hidden" value="submitted" name="submitted"/>' . '</p>' . '</form>' . '</div>';
    if ($paginate) {
        require_once GROUPS_CORE_LIB . '/class-groups-pagination.php';
        $pagination = new Groups_Pagination($count, null, $row_count);
        $output .= '<form id="posts-filter" method="post" action="">';
        $output .= '<div>';
        $output .= wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_NONCE_2, true, false);
        $output .= '</div>';
        $output .= '<div class="tablenav top">';
        $output .= $pagination->pagination('top');
        $output .= '</div>';
        $output .= '</form>';
    }
    $output .= '<div class="page-options right">';
    $output .= '<form id="setrowcount" action="" method="post">';
    $output .= '<div>';
    $output .= '<label for="row_count">' . __('Results per page', GROUPS_PLUGIN_DOMAIN) . '</label>';
    $output .= '<input name="row_count" type="text" size="2" value="' . esc_attr($row_count) . '" />';
    $output .= wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_NONCE_1, true, false);
    $output .= '<input class="button" type="submit" value="' . __('Apply', GROUPS_PLUGIN_DOMAIN) . '"/>';
    $output .= '</div>';
    $output .= '</form>';
    $output .= '</div>';
    $capability_table = _groups_get_tablename("capability");
    $group_capability_table = _groups_get_tablename("group_capability");
    // capabilities select
    $capabilities = $wpdb->get_results("SELECT * FROM {$capability_table} ORDER BY capability");
    $capabilities_select = sprintf('<select class="select capability" name="capability_id[]" multiple="multiple" placeholder="%s" data-placeholder="%s">', esc_attr(__('Capabilities &hellip;', GROUPS_PLUGIN_DOMAIN)), esc_attr(__('Capabilities &hellip;', GROUPS_PLUGIN_DOMAIN)));
    foreach ($capabilities as $capability) {
        $capabilities_select .= sprintf('<option value="%s">%s</option>', esc_attr($capability->capability_id), wp_filter_nohtml_kses($capability->capability));
    }
    $capabilities_select .= '</select>';
    $capabilities_select .= Groups_UIE::render_select('.select.capability');
    $output .= '<form id="groups-action" method="post" action="">';
    $output .= '<div class="tablenav top">';
    $output .= '<div class="groups-bulk-container">';
    $output .= '<div class="capabilities-select-container">';
    $output .= $capabilities_select;
    $output .= wp_nonce_field('admin', GROUPS_ADMIN_GROUPS_ACTION_NONCE, true, false);
    $output .= '</div>';
    $output .= '<select class="bulk-action" name="bulk-action">';
    $output .= '<option selected="selected" value="-1">' . __('Bulk Actions', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '<option value="remove-group">' . __('Remove group', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '<option value="add-capability">' . __('Add capability', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '<option value="remove-capability">' . __('Remove capability', GROUPS_PLUGIN_DOMAIN) . '</option>';
    $output .= '</select>';
    $output .= sprintf('<input class="button" type="submit" name="bulk" value="%s" />', __('Apply', GROUPS_PLUGIN_DOMAIN));
    $output .= '<input type="hidden" name="action" value="groups-action"/>';
    $output .= '</div>';
    $output .= '</div>';
    $output .= '<table id="" class="wp-list-table widefat fixed" cellspacing="0">';
    $output .= '<thead>';
    $output .= '<tr>';
    $output .= '<th id="cb" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>';
    foreach ($column_display_names as $key => $column_display_name) {
        $options = array('orderby' => $key, 'order' => $switch_order);
        $class = $key;
        if (!in_array($key, array('capabilities', 'edit', 'remove'))) {
            if (strcmp($key, $orderby) == 0) {
                $lorder = strtolower($order);
                $class = "{$key} manage-column sorted {$lorder}";
            } else {
                $class = "{$key} manage-column sortable";
            }
            $column_display_name = '<a href="' . esc_url(add_query_arg($options, $current_url)) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';
        }
        $output .= "<th scope='col' class='{$class}'>{$column_display_name}</th>";
    }
    $output .= '</tr>';
    $output .= '</thead>';
    $output .= '<tbody>';
    if (count($results) > 0) {
        for ($i = 0; $i < count($results); $i++) {
            $result = $results[$i];
            $output .= '<tr class="' . ($i % 2 == 0 ? 'even' : 'odd') . '">';
            $output .= '<th class="check-column">';
            $output .= '<input type="checkbox" value="' . esc_attr($result->group_id) . '" name="group_ids[]"/>';
            $output .= '</th>';
            $output .= "<td class='group-id'>";
            $output .= $result->group_id;
            $output .= "</td>";
            $output .= "<td class='group-name'>" . stripslashes(wp_filter_nohtml_kses($result->name)) . "</td>";
            $output .= "<td class='group-description'>" . stripslashes(wp_filter_nohtml_kses($result->description)) . "</td>";
            $output .= '<td class="capabilities">';
            $group = new Groups_Group($result->group_id);
            $group_capabilities = $group->capabilities;
            $group_capabilities_deep = $group->capabilities_deep;
            usort($group_capabilities_deep, array('Groups_Utility', 'cmp'));
            if (count($group_capabilities_deep) > 0) {
                $output .= '<ul>';
                foreach ($group_capabilities_deep as $group_capability) {
                    $output .= '<li>';
                    $class = '';
                    if (empty($group_capabilities) || !in_array($group_capability, $group_capabilities)) {
                        $class = 'inherited';
                    }
                    $output .= sprintf('<span class="%s">', $class);
                    if (isset($group_capability->capability) && isset($group_capability->capability->capability)) {
                        $output .= wp_filter_nohtml_kses($group_capability->capability->capability);
                    }
                    $output .= '</span>';
                    $output .= '</li>';
                }
                $output .= '</ul>';
            } else {
                $output .= __('This group has no capabilities.', GROUPS_PLUGIN_DOMAIN);
            }
            $output .= '</td>';
            $output .= "<td class='edit'>";
            $output .= "<a href='" . esc_url(add_query_arg('paged', $paged, $current_url)) . "&action=edit&group_id=" . $result->group_id . "' alt='" . __('Edit', GROUPS_PLUGIN_DOMAIN) . "'><img src='" . GROUPS_PLUGIN_URL . "images/edit.png'/></a>";
            $output .= "</td>";
            $output .= "<td class='remove'>";
            if ($result->name !== Groups_Registered::REGISTERED_GROUP_NAME) {
                $output .= "<a href='" . esc_url($current_url) . "&action=remove&group_id=" . $result->group_id . "' alt='" . __('Remove', GROUPS_PLUGIN_DOMAIN) . "'><img src='" . GROUPS_PLUGIN_URL . "images/remove.png'/></a>";
            }
            $output .= "</td>";
            $output .= '</tr>';
        }
    } else {
        $output .= '<tr><td colspan="7">' . __('There are no results.', GROUPS_PLUGIN_DOMAIN) . '</td></tr>';
    }
    $output .= '</tbody>';
    $output .= '</table>';
    $output .= Groups_UIE::render_add_titles('.groups-overview table td');
    $output .= '</form>';
    // #groups-action
    if ($paginate) {
        require_once GROUPS_CORE_LIB . '/class-groups-pagination.php';
        $pagination = new Groups_Pagination($count, null, $row_count);
        $output .= '<div class="tablenav bottom">';
        $output .= $pagination->pagination('bottom');
        $output .= '</div>';
    }
    $output .= '</div>';
    // .groups-overview
    $output .= '</div>';
    // .manage-groups
    echo $output;
    Groups_Help::footer();
}
 /**
  * Sort helper - comparison by group name for given group ids.
  * @param int $group_id1
  * @param int $group_id2
  * @return int
  */
 public static function bucket_cmp($group_id1, $group_id2)
 {
     $result = 0;
     if ($g1 = Groups_Group::read($group_id1)) {
         if ($g2 = Groups_Group::read($group_id2)) {
             if (isset($g1->name) && isset($g2->name)) {
                 $result = strcmp($g1->name, $g2->name);
             }
         }
     }
     return $result;
 }
/**
 * Handle edit form submission.
 */
function groups_admin_groups_edit_submit()
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE], 'groups-edit')) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $group_id = isset($_POST['group-id-field']) ? $_POST['group-id-field'] : null;
    $group = Groups_Group::read($group_id);
    if ($group) {
        $group_id = $group->group_id;
        if ($group->name !== Groups_Registered::REGISTERED_GROUP_NAME) {
            $name = isset($_POST['name-field']) ? $_POST['name-field'] : null;
        } else {
            $name = Groups_Registered::REGISTERED_GROUP_NAME;
        }
        $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : null;
        $description = isset($_POST['description-field']) ? $_POST['description-field'] : '';
        if (empty($name)) {
            Groups_Admin::add_message(__('The <em>Name</em> must not be empty.', GROUPS_PLUGIN_DOMAIN), 'error');
            return false;
        }
        if ($other_group = Groups_Group::read_by_name($name)) {
            if ($other_group->group_id != $group_id) {
                Groups_Admin::add_message(sprintf(__('The <em>%s</em> group already exists and cannot be used to name this one.', GROUPS_PLUGIN_DOMAIN), stripslashes(wp_filter_nohtml_kses($other_group->name))), 'error');
                return false;
            }
        }
        $group_id = Groups_Group::update(compact("group_id", "name", "parent_id", "description"));
        if ($group_id) {
            $capability_table = _groups_get_tablename("capability");
            $group_capability_table = _groups_get_tablename("group_capability");
            $group_capabilities = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$capability_table} WHERE capability_id IN ( SELECT capability_id FROM {$group_capability_table} WHERE group_id = %d )", Groups_Utility::id($group_id)));
            $group_capabilities_array = array();
            foreach ($group_capabilities as $group_capability) {
                $group_capabilities_array[] = $group_capability->capability_id;
            }
            $caps = array();
            if (isset($_POST['capability_ids'])) {
                $caps = $_POST['capability_ids'];
            }
            // delete
            foreach ($group_capabilities_array as $group_cap) {
                if (!in_array($group_cap, $caps)) {
                    Groups_Group_Capability::delete($group_id, $group_cap);
                }
            }
            // add
            foreach ($caps as $cap) {
                if (!in_array($cap, $group_capabilities_array)) {
                    Groups_Group_Capability::create(array('group_id' => $group_id, 'capability_id' => $cap));
                }
            }
        }
        return $group_id;
    } else {
        return false;
    }
}
 /**
  * Save capability options.
  * 
  * @param int $post_id
  * @param mixed $post post data (not used here)
  */
 public static function save_post($post_id = null, $post = null)
 {
     if (defined("DOING_AUTOSAVE") && DOING_AUTOSAVE) {
     } else {
         $post_type = get_post_type($post_id);
         $post_type_object = get_post_type_object($post_type);
         if ($post_type_object && $post_type != 'attachment') {
             $post_types_option = Groups_Options::get_option(Groups_Post_Access::POST_TYPES, array());
             if (!isset($post_types_option[$post_type]['add_meta_box']) || $post_types_option[$post_type]['add_meta_box']) {
                 if (isset($_POST[self::NONCE]) && wp_verify_nonce($_POST[self::NONCE], self::SET_CAPABILITY)) {
                     $post_type = isset($_POST["post_type"]) ? $_POST["post_type"] : null;
                     if ($post_type !== null) {
                         // See http://codex.wordpress.org/Function_Reference/current_user_can 20130119 WP 3.5
                         // "... Some capability checks (like 'edit_post' or 'delete_page') require this [the post ID] be provided."
                         // If the post ID is not provided, it will throw:
                         // PHP Notice:  Undefined offset: 0 in /var/www/groups-forums/wp-includes/capabilities.php on line 1067
                         $edit_post_type = 'edit_' . $post_type;
                         if ($post_type_object = get_post_type_object($post_type)) {
                             if (!isset($post_type_object->capabilities)) {
                                 // get_post_type_capabilities() (WP 3.8) will throw a warning
                                 // when trying to merge the missing property otherwise. It's either a
                                 // bug or the function's documentation should make it clear that you
                                 // have to provide that.
                                 $post_type_object->capabilities = array();
                             }
                             $caps_object = get_post_type_capabilities($post_type_object);
                             if (isset($caps_object->edit_post)) {
                                 $edit_post_type = $caps_object->edit_post;
                             }
                         }
                         if (current_user_can($edit_post_type, $post_id)) {
                             // quick-create ?
                             if (current_user_can(GROUPS_ADMINISTER_GROUPS)) {
                                 if (!empty($_POST['quick-group-capability'])) {
                                     $creator_id = get_current_user_id();
                                     $datetime = date('Y-m-d H:i:s', time());
                                     $name = ucfirst(strtolower(trim($_POST['quick-group-capability'])));
                                     if (strlen($name) > 0) {
                                         // create or obtain the group
                                         if ($group = Groups_Group::read_by_name($name)) {
                                         } else {
                                             if ($group_id = Groups_Group::create(compact('creator_id', 'datetime', 'name'))) {
                                                 $group = Groups_Group::read($group_id);
                                             }
                                         }
                                         // create or obtain the capability
                                         $name = strtolower($name);
                                         if ($capability = Groups_Capability::read_by_capability($name)) {
                                         } else {
                                             if ($capability_id = Groups_Capability::create(array('capability' => $name))) {
                                                 $capability = Groups_Capability::read($capability_id);
                                             }
                                         }
                                         if ($group && $capability) {
                                             // add the capability to the group
                                             if (!Groups_Group_Capability::read($group->group_id, $capability->capability_id)) {
                                                 Groups_Group_Capability::create(array('group_id' => $group->group_id, 'capability_id' => $capability->capability_id));
                                             }
                                             // enable the capability for access restriction
                                             $valid_read_caps = Groups_Options::get_option(Groups_Post_Access::READ_POST_CAPABILITIES, array(Groups_Post_Access::READ_POST_CAPABILITY));
                                             if (!in_array($capability->capability, $valid_read_caps)) {
                                                 $valid_read_caps[] = $capability->capability;
                                             }
                                             Groups_Options::update_option(Groups_Post_Access::READ_POST_CAPABILITIES, $valid_read_caps);
                                             // add the current user to the group
                                             Groups_User_Group::create(array('user_id' => get_current_user_id(), 'group_id' => $group->group_id));
                                             // put the capability ID in $_POST[self::CAPABILITY] so it is treated below
                                             if (empty($_POST[self::CAPABILITY])) {
                                                 $_POST[self::CAPABILITY] = array();
                                             }
                                             if (!in_array($capability->capability_id, $_POST[self::CAPABILITY])) {
                                                 $_POST[self::CAPABILITY][] = $capability->capability_id;
                                             }
                                         }
                                     }
                                 }
                             }
                             // set
                             if (self::user_can_restrict()) {
                                 $valid_read_caps = self::get_valid_read_caps_for_user();
                                 foreach ($valid_read_caps as $valid_read_cap) {
                                     if ($capability = Groups_Capability::read_by_capability($valid_read_cap)) {
                                         if (!empty($_POST[self::CAPABILITY]) && is_array($_POST[self::CAPABILITY]) && in_array($capability->capability_id, $_POST[self::CAPABILITY])) {
                                             Groups_Post_Access::create(array('post_id' => $post_id, 'capability' => $capability->capability));
                                         } else {
                                             Groups_Post_Access::delete($post_id, $capability->capability);
                                         }
                                     }
                                 }
                             }
                             // show groups
                             Groups_Options::update_user_option(self::SHOW_GROUPS, !empty($_POST[self::SHOW_GROUPS]));
                         }
                     }
                 }
             }
         }
     }
 }
/**
 * Handle add group form submission.
 * @return int new group's id or false if unsuccessful
 */
function groups_admin_groups_add_submit()
{
    global $wpdb;
    if (!current_user_can(GROUPS_ADMINISTER_GROUPS)) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    if (!wp_verify_nonce($_POST[GROUPS_ADMIN_GROUPS_NONCE], 'groups-add')) {
        wp_die(__('Access denied.', GROUPS_PLUGIN_DOMAIN));
    }
    $creator_id = get_current_user_id();
    $datetime = date('Y-m-d H:i:s', time());
    $parent_id = isset($_POST['parent-id-field']) ? $_POST['parent-id-field'] : null;
    $description = isset($_POST['description-field']) ? $_POST['description-field'] : '';
    $name = isset($_POST['name-field']) ? $_POST['name-field'] : null;
    $group_id = Groups_Group::create(compact("creator_id", "datetime", "parent_id", "description", "name"));
    if ($group_id) {
        if (!empty($_POST['capability_ids'])) {
            $caps = $_POST['capability_ids'];
            foreach ($caps as $cap) {
                Groups_Group_Capability::create(array('group_id' => $group_id, 'capability_id' => $cap));
            }
        }
        do_action('groups_admin_groups_add_submit_success', $group_id);
    } else {
        if (!$name) {
            Groups_Admin::add_message(__('The name must not be empty.', GROUPS_PLUGIN_DOMAIN), 'error');
        } else {
            if (Groups_Group::read_by_name($name)) {
                Groups_Admin::add_message(sprintf(__('The <em>%s</em> group already exists.', GROUPS_PLUGIN_DOMAIN), stripslashes(wp_filter_nohtml_kses($name))), 'error');
            }
        }
    }
    return $group_id;
}
Esempio n. 26
0
 /**
  * Update group.
  * 
  * @param array $map group attribute, must contain group_id
  * @return group_id on success, otherwise false
  */
 public static function update($map)
 {
     global $wpdb;
     extract($map);
     $result = false;
     if (isset($group_id) && !empty($name)) {
         $old_group = Groups_Group::read($group_id);
         $group_table = _groups_get_tablename('group');
         if (!isset($description) || $description === null) {
             $description = '';
         }
         $wpdb->query($wpdb->prepare("UPDATE {$group_table} SET name = %s, description = %s WHERE group_id = %d", $name, $description, Groups_Utility::id($group_id)));
         if (empty($parent_id)) {
             $wpdb->query($wpdb->prepare("UPDATE {$group_table} SET parent_id = NULL WHERE group_id = %d", Groups_Utility::id($group_id)));
         } else {
             // Prohibit circular dependencies:
             // This group cannot have a parent that is its successor
             // at any level in its successor hierarchy.
             // S(g)  : successor of group g
             // S*(g) : successors of group g, any level deep
             // P(g)  : parent of g
             // ---
             // It must hold: !( P(g) in S*(g) )
             // Find all successors of this group
             $groups = $wpdb->get_var("SELECT COUNT(*) FROM {$group_table}");
             if ($groups !== null) {
                 $group_ids = array();
                 $group_ids[] = Groups_Utility::id($group_id);
                 $iterations = 0;
                 $old_group_ids_count = 0;
                 while ($iterations < $groups && count($group_ids) > 0 && count($group_ids) !== $old_group_ids_count) {
                     $iterations++;
                     $old_group_ids_count = count($group_ids);
                     $id_list = implode(",", $group_ids);
                     // We can trust ourselves here, no need to use prepare()
                     // but careful if this query is modified!
                     $successor_group_ids = $wpdb->get_results("SELECT group_id FROM {$group_table} WHERE parent_id IS NOT NULL AND parent_id IN ({$id_list})");
                     if ($successor_group_ids) {
                         foreach ($successor_group_ids as $successor_group_id) {
                             $successor_group_id = Groups_Utility::id($successor_group_id->group_id);
                             if (!in_array($successor_group_id, $group_ids)) {
                                 $group_ids[] = $successor_group_id;
                             }
                         }
                     }
                 }
                 // only add if condition holds
                 if (!in_array(Groups_Utility::id($parent_id), $group_ids)) {
                     $wpdb->query($wpdb->prepare("UPDATE {$group_table} SET parent_id = %d WHERE group_id = %d", Groups_Utility::id($parent_id), Groups_Utility::id($group_id)));
                 }
             }
         }
         $result = $group_id;
         if (!empty($name)) {
             Groups_Cache::delete(self::READ_BY_NAME . '_' . $name, self::CACHE_GROUP);
         }
         if (!empty($old_group) && !empty($old_group->name)) {
             Groups_Cache::delete(self::READ_BY_NAME . '_' . $old_group->name, self::CACHE_GROUP);
         }
         do_action("groups_updated_group", $result);
     }
     return $result;
 }
Esempio n. 27
0
 /**
  * Persist a group.
  * 
  * Parameters:
  * - name (required) - the group's name
  * - creator_id (optional) - defaults to the current user's id
  * - datetime (optional) - defaults to now
  * - description (optional)
  * - parent_id (optional)
  * 
  * @param array $map attributes
  * @return group_id on success, otherwise false
  */
 public static function create($map)
 {
     global $wpdb;
     extract($map);
     $result = false;
     $error = false;
     if (!empty($name)) {
         $group_table = _groups_get_tablename("group");
         $data = array('name' => $name);
         $formats = array('%s');
         if (!isset($creator_id)) {
             $creator_id = get_current_user_id();
         }
         if (isset($creator_id)) {
             $data['creator_id'] = Groups_Utility::id($creator_id);
             $formats[] = '%d';
         }
         if (!isset($datetime)) {
             $datetime = date('Y-m-d H:i:s', time());
         }
         if (isset($datetime)) {
             $data['datetime'] = $datetime;
             $formats[] = '%s';
         }
         if (!empty($description)) {
             $data['description'] = $description;
             $formats[] = '%s';
         }
         if (!empty($parent_id)) {
             // only allow to set an existing parent group (that is from the same blog)
             $parent_group_id = $wpdb->get_var($wpdb->prepare("SELECT group_id FROM {$group_table} WHERE group_id = %d", Groups_Utility::id($parent_id)));
             if ($parent_group_id === $parent_id) {
                 $data['parent_id'] = Groups_Utility::id($parent_id);
                 $formats[] = '%d';
             } else {
                 $error = true;
             }
         }
         // no duplicate names
         $duplicate = Groups_Group::read_by_name($name);
         if ($duplicate) {
             $error = true;
         }
         if (!$error) {
             if ($wpdb->insert($group_table, $data, $formats)) {
                 if ($result = $wpdb->get_var("SELECT LAST_INSERT_ID()")) {
                     do_action("groups_created_group", $result);
                 }
             }
         }
     }
     return $result;
 }
 /**
  * Update group-capability relation.
  * 
  * This changes nothing so as of now it's pointless to even call this.
  * 
  * @param array $map
  * @return true if successful, false otherwise
  */
 public static function update($map)
 {
     $result = false;
     if (!empty($group_id) && !empty($capability_id)) {
         // make sure group and capability exist
         if (Groups_Group::read($group_id) && Groups_Capability::read($capability_id)) {
             $result = true;
             do_action("groups_updated_group_capability", $group_id, $capability_id);
         }
     }
     return $result;
 }
 /**
  * Renders a table with subscription information.
  * @param array $options
  * @param int $n will be set to the number of subscriptions found
  */
 public static function render($options, &$n)
 {
     global $wpdb;
     $output = '';
     if (isset($options['user_id'])) {
         $user = new WP_User($options['user_id']);
     } else {
         return $output;
     }
     $statuses = array('active');
     $show_all = false;
     if (isset($options['status'])) {
         $status = $options['status'];
         if (is_string($status)) {
             if (trim($status) === '*') {
                 $statuses = array('active', 'on-hold', 'cancelled', 'trash', 'deleted', 'switched');
             } else {
                 $statuses = array();
                 $_statuses = explode(',', $status);
                 foreach ($_statuses as $status) {
                     $status = strtolower(trim($status));
                     switch ($status) {
                         case 'active':
                         case 'on-hold':
                         case 'cancelled':
                         case 'trash':
                         case 'deleted':
                         case 'switched':
                             $statuses[] = $status;
                             break;
                     }
                 }
             }
         }
     }
     $exclude_cancelled_after_end_of_prepaid_term = isset($options['exclude_cancelled_after_end_of_prepaid_term']) && ($options['exclude_cancelled_after_end_of_prepaid_term'] === true || $options['exclude_cancelled_after_end_of_prepaid_term'] == 'true' || $options['exclude_cancelled_after_end_of_prepaid_term'] == 'yes');
     $include_cancelled_orders = isset($options['include_cancelled_orders']) && ($options['include_cancelled_orders'] === true || $options['include_cancelled_orders'] == 'true' || $options['include_cancelled_orders'] == 'yes');
     $include_refunded_orders = isset($options['include_refunded_orders']) && ($options['include_refunded_orders'] === true || $options['include_refunded_orders'] == 'true' || $options['include_refunded_orders'] == 'yes');
     if (function_exists('wcs_get_users_subscriptions')) {
         $results = array();
         foreach (wcs_get_users_subscriptions($user->ID) as $subscription) {
             $results[wcs_get_old_subscription_key($subscription)] = wcs_get_subscription_in_deprecated_structure($subscription);
         }
     } else {
         $results = WC_Subscriptions_Manager::get_users_subscriptions($user->ID);
     }
     // pre-filter by status
     $_results = array();
     foreach ($results as $result_key => $result) {
         $valid = false;
         if (in_array($result['status'], $statuses)) {
             $valid = true;
         }
         // exclude subscriptions from cancelled or refunded orders
         if (isset($result['order_id'])) {
             if ($order = Groups_WS_Helper::get_order($result['order_id'])) {
                 switch ($order->status) {
                     case 'cancelled':
                         if (!$include_cancelled_orders) {
                             $valid = false;
                         }
                         break;
                     case 'refunded':
                         if (!$include_refunded_orders) {
                             $valid = false;
                         }
                         break;
                 }
             }
         }
         if ($exclude_cancelled_after_end_of_prepaid_term && $result['status'] == 'cancelled') {
             $hook_args = array('user_id' => (int) $user->ID, 'subscription_key' => $result_key);
             $end_timestamp = wp_next_scheduled('scheduled_subscription_end_of_prepaid_term', $hook_args);
             if ($end_timestamp === false || $end_timestamp <= time()) {
                 $valid = false;
             }
         }
         if ($valid) {
             $_results[$result_key] = $result;
         }
     }
     $results = $_results;
     $n = count($results);
     if ($n > 0) {
         $column_display_names = array('status' => __('Status', GROUPS_WS_PLUGIN_DOMAIN), 'title' => __('Subscription', GROUPS_WS_PLUGIN_DOMAIN), 'start_date' => __('Start Date', GROUPS_WS_PLUGIN_DOMAIN), 'expiry_date' => __('Expiration', GROUPS_WS_PLUGIN_DOMAIN), 'end_date' => __('End Date', GROUPS_WS_PLUGIN_DOMAIN), 'trial_expiry_date' => __('Trial Expiration', GROUPS_WS_PLUGIN_DOMAIN), 'groups' => __('Groups', GROUPS_WS_PLUGIN_DOMAIN), 'order_id' => __('Order', GROUPS_WS_PLUGIN_DOMAIN));
         if (isset($options['columns']) && $options['columns'] !== null) {
             if (is_string($options['columns'])) {
                 $columns = explode(',', $options['columns']);
                 $_columns = array();
                 foreach ($columns as $column) {
                     $_columns[] = trim($column);
                 }
                 $options['columns'] = $_columns;
             }
             $new_columns = array();
             foreach ($options['columns'] as $key) {
                 if (key_exists($key, $column_display_names)) {
                     $new_columns[$key] = $column_display_names[$key];
                 }
             }
             $column_display_names = $new_columns;
         }
         if (count($column_display_names) > 0) {
             $output .= '<table class="subscriptions">';
             $output .= '<thead>';
             $output .= '<tr>';
             foreach ($column_display_names as $key => $column_display_name) {
                 $output .= "<th scope='col' class='{$key}'>{$column_display_name}</th>";
             }
             $output .= '</tr>';
             $output .= '</thead>';
             $output .= '<tbody>';
             $i = 0;
             foreach ($results as $result_key => $result) {
                 $order = Groups_WS_Helper::get_order($result['order_id']);
                 if ($order) {
                     $order_item = WC_Subscriptions_Order::get_item_by_product_id($order, $result['product_id']);
                     $product = $order->get_product_from_item($order_item);
                     $output .= '<tr class="' . ($i % 2 == 0 ? 'even' : 'odd') . '">';
                     foreach ($column_display_names as $column_key => $column_title) {
                         $output .= sprintf('<td class="%s">', $column_key);
                         switch ($column_key) {
                             case 'status':
                                 $output .= WC_Subscriptions_Manager::get_status_to_display($result['status'], $result_key, $user->ID);
                                 break;
                             case 'title':
                                 $output .= WC_Subscriptions_Order::get_item_name($result['order_id'], $result['product_id']);
                                 if (isset($product->variation_data)) {
                                     $column_content .= '<br />';
                                     if (function_exists('wc_get_formatted_variation')) {
                                         $column_content .= wc_get_formatted_variation($product->variation_data, true);
                                     } else {
                                         $column_content .= woocommerce_get_formatted_variation($product->variation_data, true);
                                     }
                                 }
                                 break;
                             case 'start_date':
                             case 'expiry_date':
                             case 'end_date':
                                 if ($column_key == 'expiry_date' && $result[$column_key] == 0) {
                                     $output .= __('Never', GROUPS_WS_PLUGIN_DOMAIN);
                                 } else {
                                     if ($column_key == 'end_date' && $result[$column_key] == 0) {
                                         $output .= __('Not yet ended', GROUPS_WS_PLUGIN_DOMAIN);
                                     } else {
                                         $user_timestamp = strtotime($result[$column_key]) + get_option('gmt_offset') * 3600;
                                         $output .= sprintf('<time title="%s">%s</time>', esc_attr($user_timestamp), date_i18n(get_option('date_format'), $user_timestamp));
                                     }
                                 }
                                 break;
                             case 'trial_expiry_date':
                                 $trial_expiration = WC_Subscriptions_Manager::get_trial_expiration_date($result_key, $user->ID, 'timestamp');
                                 if (empty($trial_expiration)) {
                                     $output .= '-';
                                 } else {
                                     $trial_expiration = $trial_expiration + get_option('gmt_offset') * 3600;
                                     $output .= sprintf('<time title="%s">%s</time>', esc_attr($trial_expiration), date_i18n(get_option('date_format'), $trial_expiration));
                                 }
                                 break;
                             case 'groups':
                                 if ($product_groups = get_post_meta($result['product_id'], '_groups_groups', false)) {
                                     if (count($product_groups) > 0) {
                                         $output .= '<ul>';
                                         foreach ($product_groups as $group_id) {
                                             if ($group = Groups_Group::read($group_id)) {
                                                 $output .= '<li>' . wp_filter_nohtml_kses($group->name) . '</li>';
                                             }
                                         }
                                         $output .= '</ul>';
                                     }
                                 }
                                 break;
                             case 'order_id':
                                 $output .= sprintf(__('Order %d', GROUPS_WS_PLUGIN_DOMAIN), $result['order_id']);
                                 break;
                         }
                         $output .= '</td>';
                     }
                     $output .= '</tr>';
                     $i++;
                 }
             }
             $output .= '</tbody>';
             $output .= '</table>';
         }
     }
     return $output;
 }