ID ) ) && ( !learndash_is_admin_user( $current_user->ID ) ) ) {
exit;
}
$group_email_data = json_decode( stripslashes( $_POST['group_email_data'] ), true );
if ( ( !isset( $group_email_data['group_id'] ) ) || ( empty( $group_email_data['group_id'] ) ) )
die();
$group_email_data['group_id'] = intval( $group_email_data['group_id'] );
if ( ( !isset( $group_email_data['email_subject'] ) ) || ( empty( $group_email_data['email_subject'] ) ) )
die();
$group_email_data['email_subject'] = wp_strip_all_tags( stripcslashes( $group_email_data['email_subject'] ) );
if ( ( !isset( $group_email_data['email_message'] ) ) || ( empty( $group_email_data['email_message'] ) ) )
die();
$group_email_data['email_message'] = wpautop( stripcslashes( $group_email_data['email_message'] ) );
if ( ( !isset( $_POST['nonce'] ) ) || ( empty( $_POST['nonce'] ) )
|| ( !wp_verify_nonce( $_POST['nonce'], 'group_email_nonce_'. $group_email_data['group_id'] .'_'. $current_user->ID ) ) ) {
die();
}
$group_admin_ids = learndash_get_groups_administrator_ids( $group_email_data['group_id'] );
if ( in_array( $current_user->ID, $group_admin_ids ) === false ) {
die();
}
$mail_args = array(
'to' => $current_user->user_email,
'subject' => $group_email_data['email_subject'],
'message' => $group_email_data['email_message'],
'attachments' => '',
'headers' => array(
'MIME-Version: 1.0',
'content-type: text/html',
'From: '. $current_user->display_name . ' <' . $current_user->user_email . '>',
'Reply-to: '. $current_user->display_name . ' <' . $current_user->user_email . '>'
)
);
$group_user_ids = learndash_get_groups_user_ids( $group_email_data['group_id'] );
if ( !empty( $group_user_ids ) ) {
$email_addresses = array();
foreach ( $group_user_ids as $user_id ) {
$user = get_user_by( 'id', $user_id );
if ( $user ) {
$email_addresses[] = 'Bcc: '. sanitize_email( $user->user_email );
}
}
$group_email_error = null;
add_action('wp_mail_failed', function ( $mail_error ) {
global $group_email_error;
$group_email_error = $mail_error;
});
if ( $email_addresses ) {
$mail_args['headers'] = array_merge( $mail_args['headers'], $email_addresses );
$mail_args = apply_filters( 'ld_group_email_users_args', $mail_args );
if ( !empty( $mail_args ) ) {
do_action( 'ld_group_email_users_before', $mail_args );
$mail_ret = wp_mail( $mail_args['to'], $mail_args['subject'], $mail_args['message'], $mail_args['headers'], $mail_args['attachments'] );
do_action( 'ld_group_email_users_after', $mail_args, $mail_ret );
if ( !$mail_ret ) {
$group_email_error_message = '';
if ( is_wp_error( $group_email_error ) ) {
$group_email_error_message = $group_email_error->get_error_message();
}
wp_send_json_error(
array(
'message' => sprintf( wp_kses_post( __( 'Error: Email(s) not sent. Please try again or check with your hosting provider.
wp_mail() returned %d.
Error: %s', 'learndash' ) ), $mail_ret, $group_email_error_message )
)
);
} else {
wp_send_json_success(
array(
'message' => sprintf( wp_kses_post( __( 'Success: Email sent to %d group users.', 'learndash' ) ), count( $email_addresses ) )
)
);
}
} else {
wp_send_json_error(
array(
'message' => __( 'Mail Args empty. Unepected condition from filter: ld_group_email_users_args', 'learndash' )
)
);
}
} else {
wp_send_json_error(
array(
'message' => esc_html__( 'No users in group.', 'learndash' )
)
);
}
}
wp_send_json_error();
die();
}
}
add_action( 'wp_ajax_learndash_group_emails', 'learndash_group_emails' );
/**
* Register groups post type
*
* @since 2.1.0
*/
function learndash_groups_post_content() {
$labels = array(
'name' => esc_html__( 'Groups', 'learndash' ),
'singular_name' => esc_html__( 'Group', 'learndash' ),
'add_new' => esc_html__( 'Add New', 'learndash' ),
'add_new_item' => esc_html__( 'Add New Group', 'learndash' ),
'edit_item' => esc_html__( 'Edit Group', 'learndash' ),
'new_item' => esc_html__( 'New Group', 'learndash' ),
'all_items' => esc_html__( 'Groups', 'learndash' ),
'updated' => esc_html__( 'Group Updated.', 'learndash' ),
'view_item' => esc_html__( 'View Group', 'learndash' ),
'view_items' => esc_html__( 'View Groups', 'learndash' ),
'search_items' => esc_html__( 'Search Group', 'learndash' ),
'not_found' => esc_html__( 'No Group found', 'learndash' ),
'not_found_in_trash' => esc_html__( 'No Group found in the Trash', 'learndash' ),
'parent_item_colon' => '',
'menu_name' => esc_html__( 'Groups', 'learndash' ),
'item_published' => esc_html__( 'Group Published', 'learndash' ),
'item_published_privately' => esc_html__( 'Group Published Privately', 'learndash' ),
'item_reverted_to_draft' => esc_html__( 'Group Reverted to Draft', 'learndash' ),
'item_scheduled' => esc_html__( 'Group Scheduled', 'learndash' ),
'item_updated' => esc_html__( 'Group Updated', 'learndash' ),
);
$capabilities = array(
'read_post' => 'read_group',
'publish_posts' => 'publish_groups',
'edit_posts' => 'edit_groups',
'edit_others_posts' => 'edit_others_groups',
'delete_posts' => 'delete_groups',
'delete_others_posts' => 'delete_others_groups',
'read_private_posts' => 'read_private_groups',
'delete_post' => 'delete_group',
'edit_published_posts' => 'edit_published_groups',
'delete_published_posts' => 'delete_published_groups',
);
if ( is_admin() ) {
$admin_role = get_role( 'administrator' );
if ( ( $admin_role ) && ( $admin_role instanceof WP_Role ) ) {
if ( ! $admin_role->has_cap( 'edit_groups' ) ) {
foreach ( $capabilities as $key => $cap ) {
$admin_role->add_cap( $cap );
}
}
}
}
$args = array(
'labels' => $labels,
'description' => esc_html__( 'Holds LearnDash user Groups', 'learndash' ),
'public' => false,
'menu_position' => 10,
'show_in_menu' => true,
'show_in_nav_menus' => false,
'supports' => array( 'title', 'editor' ), //, 'custom-fields', 'author'
'has_archive' => false,
'exclude_from_search' => true,
'publicly_queryable' => false,
'show_ui' => true,
'capability_type' => 'group',
'capabilities' => $capabilities,
'map_meta_cap' => true,
'show_in_rest' => LearnDash_REST_API::enabled( 'groups' ) || LearnDash_REST_API::gutenberg_enabled( 'groups' ),
//'rest_base' => LearnDash_Settings_Section::get_section_setting('LearnDash_Settings_Section_Permalinks', 'courses' ),
'rest_controller_class' => LearnDash_REST_API::get_controller( 'groups' ),
);
/**
* Filter post type registration args
*
* @var array $args
*/
$args = apply_filters( 'learndash_post_args_groups', $args );
$args = apply_filters( 'learndash-cpt-options', $args, 'groups' );
/**
* Filter via the common 'learndash_post_args' used for most all other
* post_types in LearnDash
*
* @since 2.5.8
*/
// Removed. The world is not ready for this filter.
//$post_args = array( 'groups' => $args );
//$post_args = apply_filters( 'learndash_post_args', $post_args );
//if ( isset( $post_args['groups'] ) )
// $args = $post_args['groups'];
register_post_type( 'groups', $args );
}
add_action( 'init', 'learndash_groups_post_content' );
/**
* Add Group Leader role
*
* @since 2.1.0
*/
function learndash_add_group_admin_role() {
$group_leader = get_role( 'group_leader' );
if ( is_null( $group_leader ) ) {
$group_leader = add_role( 'group_leader', 'Group Leader', array( 'read' => true, 'group_leader' => true ) );
} else {
$group_leader->add_cap( 'group_leader', true );
}
}
//add_action( 'init', 'learndash_add_group_admin_role' );
add_action( 'learndash_activated', 'learndash_add_group_admin_role' );
/**
* All group leader access to backend
*
* WooCommerce prevent access to dashboard for all non-admin user roles. This filter allows
* us to check if the current user is group_leader and override WC access
*
* @since 2.2.0.1
* @param bool $prevent_access value from WC.
* @return bool adjusted value based on user's access/role
*/
function learndash_check_group_leader_access( $prevent_access ) {
if (learndash_is_group_leader_user('group_leader' ) ) {
if (defined('LEARNDASH_GROUP_LEADER_DASHBOARD_ACCESS')) {
if (LEARNDASH_GROUP_LEADER_DASHBOARD_ACCESS == true) {
$prevent_access = false;
} else if (LEARNDASH_GROUP_LEADER_DASHBOARD_ACCESS == false) {
$prevent_access = true;
}
} else {
$prevent_access = false;
}
}
return $prevent_access;
}
add_filter( 'woocommerce_prevent_admin_access', 'learndash_check_group_leader_access', 20, 1 );
/**
* Get all group leaders user ids
*
* @return array of group leaders user ids
* @since 2.1.2
*/
function learndash_all_group_leader_ids() {
$group_leader_user_ids = array();
$group_leader_users = learndash_all_group_leaders();
if (!empty($group_leader_users)) {
$group_leader_user_ids = wp_list_pluck( $group_users, 'ID' );
}
return $group_leader_user_ids;
}
/**
* Get all group leaders
*
* @return array of group leaders user objects
*/
function learndash_all_group_leaders() {
$transient_key = "learndash_group_leaders";
//$group_user_objects = get_transient( $transient_key );
$group_user_objects = LDLMS_Transients::get( $transient_key );
if ( $group_user_objects === false ) {
$user_query_args = array(
'role' => 'group_leader',
'orderby' => 'display_name',
'order' => 'ASC'
);
$user_query = new WP_User_Query( $user_query_args );
if ( isset( $user_query->results ) ) {
$group_user_objects = $user_query->results;
} else {
$group_user_objects = array();
}
LDLMS_Transients::set( $transient_key, $group_user_objects, MINUTE_IN_SECONDS );
}
return $group_user_objects;
}
/**
* Outputs list of group users in a table
*
* @since 2.1.0
*
* @param int $group_id
* @return string
*/
function learndash_group_user_list( $group_id ) {
global $wpdb;
global $learndash_shortcode_used;
$learndash_shortcode_used = true;
$current_user = wp_get_current_user();
if ( ( !learndash_is_admin_user( $current_user ) ) && ( !learndash_is_group_leader_user( $current_user ) ) ) {
return esc_html__( 'Please login as a Group Administrator', 'learndash' );
}
$users = learndash_get_groups_users( $group_id );
if ( ! empty( $users ) ) {
?>
| user_login;?> | user_email;?> |
'. print_r( $group_courses_intersect, true) .''); $group_courses_add = array_diff( $group_courses_new, $group_courses_intersect ); //error_log('group_courses_add
'. print_r($group_courses_add, true) .''); if ( !empty( $group_courses_add ) ) { foreach ( $group_courses_add as $course_id ) { //update_post_meta( $course_id, 'learndash_group_enrolled_' . $group_id, $group_id ); ld_update_course_group_access( $course_id, $group_id, false ); } } $group_courses_remove = array_diff( $group_courses_old, $group_courses_intersect ); //error_log('group_courses_remove
'. print_r($group_courses_remove, true) .''); if ( !empty( $group_courses_remove ) ) { foreach ( $group_courses_remove as $course_id ) { //update_post_meta( $course_id, 'learndash_group_enrolled_' . $group_id, $group_id ); ld_update_course_group_access( $course_id, $group_id, true ); } } // Finally clear our cache for other services $transient_key = "learndash_group_courses_" . $group_id; delete_transient( $transient_key ); } } /** * Group all the related course ids for a set of groups_ids * * @since 2.3 * * @param int $user_id he user_id to get the associated groups then course ids. If not provided will user current user id * @param array $group_ids an array of group ids to source the course ids from. If not provided will use group ids based on user_id access. * @return array an array of course_ids. */ function learndash_get_groups_courses_ids( $user_id = 0, $group_ids = array() ) { $course_ids = array(); if ( empty( $user_id ) ) { // If the current user is not able to be determined. Then abort. if ( !is_user_logged_in() ) return $course_ids; $user_id = get_current_user_id(); } if ( learndash_is_group_leader_user( $user_id ) ) { $group_leader_group_ids = learndash_get_administrators_group_ids( $user_id ); // If user is group leader and the group ids is empty, nothing else to do. abort. if ( empty( $group_leader_group_ids ) ) return $course_ids; if ( empty( $group_ids ) ) { $group_ids = $group_leader_group_ids; } else { $group_ids = array_intersect( $group_leader_group_ids, $group_ids ); } } else if ( learndash_is_admin_user( $user_id ) ) { } else { return $course_ids; } if ( !empty( $group_ids ) ) { foreach ( $group_ids as $group_id ) { $group_course_ids = learndash_group_enrolled_courses( $group_id ); if ( !empty( $group_course_ids ) ) { $course_ids = array_merge( $course_ids, $group_course_ids ); } } } if ( !empty( $course_ids ) ) { $course_ids = array_unique( $course_ids ); } return $course_ids; } /** * Is a group enrolled in a certain course * * @since 2.1.0 * * @param int $group_id * @param int $course_id * @return bool */ function learndash_group_has_course( $group_id, $course_id ) { return get_post_meta( $course_id, 'learndash_group_enrolled_' . $group_id, true ); } /** * Gets timestamp of when course is available to group * * @since 2.1.0 * * @param int $group_id * @param int $course_id * @return string time stamp */ function learndash_group_course_access_from( $group_id, $course_id ) { return get_post_meta( $course_id, 'learndash_group_enrolled_' . $group_id, true ); } /** * Does a course belong to a group the user is in * * @since 2.1.0 * * @param int $user_id * @param int $course_id * @return bool */ function learndash_user_group_enrolled_to_course( $user_id, $course_id ) { $group_ids = learndash_get_users_group_ids( $user_id ); if ( !empty( $group_ids ) ) { foreach ( $group_ids as $group_id ) { if ( learndash_group_has_course( $group_id, $course_id ) ) { return true; } } } return false; } /** * Gets timestamp of when course is available to a user in a group * * @since 2.1.0 * * @param int $user_id * @param int $course_id * @return string timestamp */ function learndash_user_group_enrolled_to_course_from( $user_id, $course_id ) { $group_ids = learndash_get_users_group_ids( $user_id ); $enrolled_from = time() + 10000; foreach ( $group_ids as $group_id ) { $enrolled_from_temp = learndash_group_course_access_from( $group_id, $course_id ); if ( ! empty( $enrolled_from_temp ) && $enrolled_from_temp < $enrolled_from ) { $enrolled_from = $enrolled_from_temp; } } if ( $enrolled_from <= time() ) { $user = get_userdata( $user_id ); $user_registered = strtotime( $user->user_registered ); if ( $user_registered > $enrolled_from ) { return $user_registered; } else { return $enrolled_from; } } else { return null; } } /** * Get group ids that the user is an administrator of * * @since 2.1.0 * * @param int $user_id * @return array list of group ids */ function learndash_get_administrators_group_ids( $user_id, $_MENU = false ) { global $wpdb; $group_ids = array(); if ( !empty( $user_id ) ) { if ( ( learndash_is_admin_user( $user_id ) ) && ( $_MENU != true ) ) { $group_ids = learndash_get_groups( true, $user_id ); } else { // LD 2.3 rewrote this double query to be a simple join $sql_str = $wpdb->prepare( "SELECT usermeta.meta_value as group_ids FROM ". $wpdb->usermeta ." as usermeta INNER JOIN ". $wpdb->posts ." as posts ON posts.ID=usermeta.meta_value WHERE user_id = %d AND meta_key LIKE %s AND posts.post_status = 'publish'", $user_id, 'learndash_group_leaders_%'); $group_ids = $wpdb->get_col( $sql_str ); } } return $group_ids; } /** * Set group ids that the user is an administrator of * * @since 2.2.1 * * @param int $user_id * @param array list of group ids */ function learndash_set_administrators_group_ids( $user_id, $leader_groups_new = array() ) { global $wpdb; if ( !empty($user_id ) ) { $leader_groups_old = learndash_get_administrators_group_ids( $user_id, true ); $leader_groups_intersect = array_intersect( $leader_groups_new, $leader_groups_old ); $leader_groups_add = array_diff( $leader_groups_new, $leader_groups_intersect ); if ( !empty( $leader_groups_add ) ) { foreach ( $leader_groups_add as $group_id ) { ld_update_leader_group_access( $user_id, $group_id, false); } } $leader_groups_remove = array_diff( $leader_groups_old, $leader_groups_intersect ); if ( !empty( $leader_groups_remove ) ) { foreach ( $leader_groups_remove as $group_id ) { ld_update_leader_group_access( $user_id, $group_id, true); } } // Finally clear our cache for other services //$transient_key = "learndash_user_groups_" . $user_id; //delete_transient( $transient_key ); } return array(); } /** * Get all groups * * @since 2.1.0 * * @param bool $id_only return id's only * @return array groups */ function learndash_get_groups( $id_only = false, $current_user_id = 0 ) { if ( empty( $current_user_id ) ) { if ( !is_user_logged_in() ) return array(); $current_user_id = get_current_user_id(); } if ( learndash_is_group_leader_user( $current_user_id ) ) { return learndash_get_administrators_group_ids( $current_user_id ); } else if ( learndash_is_admin_user( $current_user_id ) ) { $groups_query_args = array( 'post_type' => 'groups', 'nopaging' => true ); if ( $id_only ) { $groups_query_args['fields'] = 'ids'; } $groups_query = new WP_Query( $groups_query_args ); return $groups_query->posts; } } /** * Get a users group id's * * @since 2.1.0 * * @param int $user_id * @return array list of groups user belongs to */ function learndash_get_users_group_ids( $user_id = 0, $bypass_transient = false ) { global $wpdb; $user_group_ids = array(); if ( !empty( $user_id ) ) { $transient_key = "learndash_user_groups_" . $user_id; if (!$bypass_transient) { $user_group_ids_transient = LDLMS_Transients::get( $transient_key ); } else { $user_group_ids_transient = false; } if ( $user_group_ids_transient === false ) { $sql_str = $wpdb->prepare("SELECT meta_value FROM ". $wpdb->usermeta ." WHERE meta_key LIKE %s AND user_id = %d and meta_value != ''", 'learndash_group_users_%', $user_id ); $col = $wpdb->get_col( $sql_str ); if ( ! empty( $col) && ! empty( $col[0] ) ) { $sql_str = "SELECT ID FROM $wpdb->posts WHERE post_type='groups' AND post_status = 'publish' AND ID IN (" . implode( ',', $col ) . ')'; $user_group_ids = $wpdb->get_col( $sql_str ); } LDLMS_Transients::set( $transient_key, $user_group_ids, MINUTE_IN_SECONDS ); } else { $user_group_ids = $user_group_ids_transient; } } return $user_group_ids; } function learndash_set_users_group_ids( $user_id = 0, $user_groups_new = array() ) { if ( !empty($user_id ) ) { $user_groups_old = learndash_get_users_group_ids( $user_id, true ); $user_groups_intersect = array_intersect( $user_groups_new, $user_groups_old ); $user_groups_add = array_diff( $user_groups_new, $user_groups_intersect ); if ( !empty( $user_groups_add ) ) { foreach ( $user_groups_add as $group_id ) { ld_update_group_access( $user_id, $group_id, false); } } $user_groups_remove = array_diff( $user_groups_old, $user_groups_intersect ); if ( !empty( $user_groups_remove ) ) { foreach ( $user_groups_remove as $group_id ) { ld_update_group_access( $user_id, $group_id, true); } } // Finally clear our cache for other services $transient_key = "learndash_user_groups_" . $user_id; delete_transient( $transient_key ); } } /** * Get a Course group id's * * @since 2.2.1 * * @param int $course_id * @return array list of groups user belongs to */ function learndash_get_course_groups( $course_id = 0, $bypass_transient = false ) { global $wpdb; $course_groups_ids = array(); $course_id = absint( $course_id ); if ( !empty( $course_id ) ) { $transient_key = "learndash_course_groups_" . $course_id; if (!$bypass_transient) { $course_groups_ids_transient = LDLMS_Transients::get( $transient_key ); } else { $course_groups_ids_transient = false; } if ( $course_groups_ids_transient === false ) { // For Groups the meta_value is a datetime. So we need mysql to parse the meta_key to get the group_id $sql_str = $wpdb->prepare("SELECT DISTINCT REPLACE(meta_key, 'learndash_group_enrolled_', '') FROM ". $wpdb->postmeta ." WHERE meta_key LIKE %s AND post_id = %d and meta_value != ''", 'learndash_group_enrolled_%', $course_id ); $col = $wpdb->get_col( $sql_str ); if ( ! empty( $col) && ! empty( $col[0] ) ) { $col = array_map( 'absint', $col ); $sql_str = "SELECT ID FROM $wpdb->posts WHERE post_type='groups' AND post_status = 'publish' AND ID IN (" . implode( ',', $col ) . ')'; $course_groups_ids = $wpdb->get_col( $sql_str ); if ( ! empty( $course_groups_ids ) ) { $course_groups_ids = array_map( 'absint', $course_groups_ids ); } LDLMS_Transients::set( $transient_key, $course_groups_ids, MINUTE_IN_SECONDS ); } } else { $course_groups_ids = $course_groups_ids_transient; } } return $course_groups_ids; } function learndash_set_course_groups( $course_id = 0, $course_groups_new = array() ) { if ( !empty($course_id ) ) { $course_groups_old = learndash_get_course_groups( $course_id, true ); //error_log('course_groups_old
'. print_r($course_groups_old, true) .''); $course_groups_intersect = array_intersect( $course_groups_new, $course_groups_old ); //error_log('course_groups_intersect
'. print_r($course_groups_intersect, true) .''); $course_groups_add = array_diff( $course_groups_new, $course_groups_intersect ); //error_log('course_groups_add
'. print_r($course_groups_add, true) .''); if ( !empty( $course_groups_add ) ) { foreach ( $course_groups_add as $group_id ) { //ld_update_group_access( $user_id, $group_id, false); ld_update_course_group_access( $course_id, $group_id, false ); } } $course_groups_remove = array_diff( $course_groups_old, $course_groups_intersect ); //error_log('course_groups_remove
'. print_r($course_groups_remove, true) .''); if ( !empty( $course_groups_remove ) ) { foreach ( $course_groups_remove as $group_id ) { //ld_update_group_access( $user_id, $group_id, true); ld_update_course_group_access( $course_id, $group_id, true ); } } // Finally clear our cache for other services $transient_key = "learndash_course_groups_" . $course_id; delete_transient( $transient_key ); } } /** * Get users ids that belong to a group * * @since 2.1.0 * * @param int $group_id * @param bool $bypass_transient to ignore transient cache * @return array array of user ids that belong to group */ function learndash_get_groups_user_ids( $group_id = 0, $bypass_transient = false) { $group_user_ids = array(); if (!empty( $group_id ) ) { $group_users = learndash_get_groups_users( $group_id, $bypass_transient ); if (!empty( $group_users ) ) { $group_user_ids = wp_list_pluck( $group_users, 'ID' ); } } return $group_user_ids; } /** * Get users objects that belong to a group * * @since 2.1.2 * * @param int $group_id * @param bool $bypass_transient to ignore transient cache * @return array list of users objects that belong to group */ function learndash_get_groups_users( $group_id, $bypass_transient = false ) { //echo "group_id[". $group_id ."] [". $bypass_transient ."]
"; print_r($group_users_objects); echo ""; if ( $group_users_objects === false ) { // Changed in v2.3 we no longer exclude ALL group leaders from groups. // A group leader CAN be a member of a group user list. // For this group get the group leaders. They will be excluded from the regular users. //$group_leader_user_ids = learndash_get_groups_administrator_ids( $group_id ); $user_query_args = array( //'exclude' => $group_leader_user_ids, 'orderby' => 'display_name', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'learndash_group_users_'. intval( $group_id ), 'compare' => 'EXISTS', ) ) ); $user_query = new WP_User_Query( $user_query_args ); if ( isset( $user_query->results ) ) { $group_users_objects = $user_query->results; } else { $group_users_objects = array(); } if (!$bypass_transient) { LDLMS_Transients::set( $transient_key, $group_users_objects, MINUTE_IN_SECONDS ); } } return $group_users_objects; } /** * Set Group Users users * * @since 2.1.2 * * @param int $group_id * @param array list of users objects * @return none */ function learndash_set_groups_users( $group_id = 0, $group_users_new = array() ) { update_post_meta( $group_id, 'learndash_group_users_' . $group_id, $group_users_new); $group_users_old = learndash_get_groups_user_ids( $group_id, true ); $group_users_intersect = array_intersect( $group_users_new, $group_users_old ); $group_users_add = array_diff( $group_users_new, $group_users_intersect ); if ( !empty( $group_users_add ) ) { foreach ( $group_users_add as $user_id ) { //update_user_meta( $user_id, 'learndash_group_users_' . $group_id, $group_id ); ld_update_group_access( $user_id, $group_id, false); } } $group_users_remove = array_diff( $group_users_old, $group_users_intersect ); if ( !empty( $group_users_remove ) ) { foreach ( $group_users_remove as $user_id ) { //delete_user_meta( $user_id, 'learndash_group_users_' . $group_id, null ); ld_update_group_access( $user_id, $group_id, true); } /** * Action hook for remove group users * * $group_id int ID of the group * $group_users_remove array User IDs that are removed from group */ do_action( 'learndash_remove_group_users', $group_id, $group_users_remove ); } // Finally clear our cache for other services $transient_key = "learndash_group_users_" . $group_id; delete_transient( $transient_key ); } /** * Get admin id's that belong to group * * @since 2.1.0 * * @param int $group_id * @param bool $bypass_transient to ignore transient cache * @return array array of goup leader user ids */ function learndash_get_groups_administrator_ids( $group_id, $bypass_transient = false ) { /* global $wpdb; if ( is_numeric( $group_id ) ) { return $wpdb->get_col( " SELECT user_id FROM $wpdb->usermeta WHERE meta_key = 'learndash_group_leaders_" . $group_id . "' AND meta_value = '" . $group_id . "'" ); } else { return array(); } */ $group_leader_user_ids = array(); if ( !empty( $group_id ) ) { $group_leader_users = learndash_get_groups_administrators( $group_id, $bypass_transient ); if ( !empty( $group_leader_users ) ) { $group_leader_user_ids = wp_list_pluck( $group_leader_users, 'ID' ); } } return $group_leader_user_ids; } /** * Get group_leader user objects that belong to group * * @since 2.1.2 * * @param int $group_id * @param bool $bypass_transient to ignore transient cache * @return array array of group leader user objects */ function learndash_get_groups_administrators( $group_id, $bypass_transient = false ) { $transient_key = "learndash_group_leaders_" . $group_id; if ( !$bypass_transient ) { $group_user_objects = LDLMS_Transients::get( $transient_key ); } else { $group_user_objects = false; } if ( $group_user_objects === false ) { $user_query_args = array( //'role' => 'group_leader', 'orderby' => 'display_name', 'order' => 'ASC', 'meta_query' => array( array( 'key' => 'learndash_group_leaders_'. intval( $group_id ), 'value' => intval( $group_id ), 'compare' => '=', 'type' => 'NUMERIC' ) ) ); $user_query = new WP_User_Query( $user_query_args ); if ( isset( $user_query->results ) ) { $group_user_objects = $user_query->results; } else { $group_user_objects = array(); } if ( !$bypass_transient ) { LDLMS_Transients::set( $transient_key, $group_user_objects, MINUTE_IN_SECONDS ); } } return $group_user_objects; } /** * Set Group Leader/Administrator users * * @since 2.1.2 * * @param int $group_id * @param array list of users objects * @return none */ function learndash_set_groups_administrators( $group_id = 0, $group_leaders_new = array() ) { if (!empty( $group_id )) { $group_leaders_old = learndash_get_groups_administrator_ids( $group_id, true ); $group_leaders_intersect = array_intersect( $group_leaders_new, $group_leaders_old ); //error_log('$group_leaders_intersect
'. print_r( $group_leaders_intersect, true) .''); $group_leaders_add = array_diff( $group_leaders_new, $group_leaders_intersect ); //error_log('group_leaders_add
'. print_r($group_leaders_add, true) .''); if ( !empty( $group_leaders_add ) ) { foreach ( $group_leaders_add as $user_id ) { update_user_meta( $user_id, 'learndash_group_leaders_' . $group_id, $group_id ); } } $group_leaders_remove = array_diff( $group_leaders_old, $group_leaders_intersect ); //error_log('group_leaders_remove
'. print_r( $group_leaders_remove, true) .''); if ( !empty( $group_leaders_remove ) ) { foreach ( $group_leaders_remove as $user_id ) { delete_user_meta( $user_id, 'learndash_group_leaders_' . $group_id, $group_id ); } } // Finally clear our cache for other services $transient_key = "learndash_group_leaders_" . $group_id; delete_transient( $transient_key ); } } /** * Is user a group leader * Replaces is_group_leader * @since 2.3 * * @param int|object $user * @return bool true if user is group leader, else false */ function learndash_is_group_leader_user( $user = 0 ) { $user_id = 0; if ( ( is_numeric( $user ) ) && ( !empty( $user ) ) ) { $user_id = $user; } else if ($user instanceof WP_User) { $user_id = $user->ID; } else { $user_id = get_current_user_id(); } if ( ( !empty( $user_id ) ) && ( !learndash_is_admin_user( $user_id ) ) && ( defined( 'LEARNDASH_GROUP_LEADER_CAPABILITY_CHECK' ) ) && ( LEARNDASH_GROUP_LEADER_CAPABILITY_CHECK != '' ) ) { return user_can( $user_id, LEARNDASH_GROUP_LEADER_CAPABILITY_CHECK ); } } function learndash_is_admin_user( $user = 0 ) { $user_id = 0; if ( ( is_numeric( $user ) ) && ( !empty( $user ) ) ) { $user_id = $user; } else if ($user instanceof WP_User) { $user_id = $user->ID; } else { $user_id = get_current_user_id(); } if ( ( !empty( $user_id ) ) && ( defined( 'LEARNDASH_ADMIN_CAPABILITY_CHECK' ) ) && ( LEARNDASH_ADMIN_CAPABILITY_CHECK != '' ) ) { return user_can( $user_id, LEARNDASH_ADMIN_CAPABILITY_CHECK ); } } /** * Is group leader an admin of a group this user belongs to * * @since 2.1.0 * * @param int $group_leader_id * @param int $user_id * @return bool */ function learndash_is_group_leader_of_user( $group_leader_id, $user_id ) { $admin_groups = learndash_get_administrators_group_ids( $group_leader_id ); $has_admin_groups = ! empty( $admin_groups ) && is_array( $admin_groups ) && ! empty( $admin_groups[0] ); foreach ( $admin_groups as $group_id ) { $learndash_is_user_in_group = learndash_is_user_in_group( $user_id, $group_id ); if ( $learndash_is_user_in_group ) { return true; } } return false; } /** * Does user belong to group * * @since 2.1.0 * * @param int $user_id * @param int $group_id * @return bool */ function learndash_is_user_in_group( $user_id, $group_id ) { return get_user_meta( $user_id, 'learndash_group_users_' . $group_id, true ); } /** * Shortcode to HTML output of display a users list of groups * * @since 2.1.0 * * @param array $attr shortcode attributes * @return string shortcode output */ function learndash_user_groups( $attr ) { global $learndash_shortcode_used; $learndash_shortcode_used = true; $shortcode_atts = shortcode_atts( array( 'user_id' => '', ), $attr ); extract( $shortcode_atts ); if ( empty( $user_id ) ) { $user_id = get_current_user_id(); } if ( empty( $user_id ) ) { return ''; } $admin_groups = learndash_get_administrators_group_ids( $user_id ); $user_groups = learndash_get_users_group_ids( $user_id ); $has_admin_groups = ! empty( $admin_groups ) && is_array( $admin_groups ) && ! empty( $admin_groups[0] ); $has_user_groups = ! empty( $user_groups ) && is_array( $user_groups ) && ! empty( $user_groups[0] ); return SFWD_LMS::get_template('user_groups_shortcode', array( 'admin_groups' => $admin_groups, 'user_groups' => $user_groups, 'has_admin_groups' => $has_admin_groups, 'has_user_groups' => $has_user_groups, ) ); } add_shortcode( 'user_groups', 'learndash_user_groups' ); /** * Delete group id from all users meta when group is deleted * * @todo restrict function to only run if post type is grou * will run against db everytime a post is deleted * * @since 2.1.0 * * @param int $pid id of group * @return bool successful deletion */ function learndash_delete_group( $pid ) { global $wpdb; if ( ! empty( $pid ) && is_numeric( $pid ) ) { $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => 'learndash_group_users_' . $pid, 'meta_value' => $pid ) ); $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => 'learndash_group_leaders_' . $pid, 'meta_value' => $pid ) ); } return true; } add_action( 'delete_post', 'learndash_delete_group', 10 ); /** * Update a users group access * * @since 2.1.0 * * @param int $user_id * @param int $group_id * @param bool $remove */ function ld_update_group_access( $user_id, $group_id, $remove = false ) { if ( $remove ) { delete_user_meta( $user_id, 'learndash_group_users_' . $group_id ); /** * Run actions after group access is removed for user * * @since 2.1.0 * * @param int $user_id */ do_action( 'ld_removed_group_access', $user_id, $group_id ); } else { update_user_meta( $user_id, 'learndash_group_users_' . $group_id, $group_id ); /** * Run actions after group access is added for user * * @since 2.1.0 * * @param int $user_id */ do_action( 'ld_added_group_access', $user_id, $group_id ); } } /** * Update a users group access * * @since 2.1.0 * * @param int $user_id * @param int $group_id * @param bool $remove */ function ld_update_course_group_access( $course_id, $group_id, $remove = false ) { if ( $remove ) { delete_post_meta( $course_id, 'learndash_group_enrolled_' . $group_id ); /** * Run actions after group access is removed for user * * @since 2.1.0 * * @param int $user_id */ do_action( 'ld_removed_course_group_access', $course_id, $group_id ); } else { update_post_meta( $course_id, 'learndash_group_enrolled_' . $group_id, time() ); /** * Run actions after group access is added for user * * @since 2.1.0 * * @param int $user_id */ do_action( 'ld_added_course_group_access', $course_id, $group_id ); } } /** * Update a group leader group access * * @since 2.2.1 * * @param int $user_id * @param int $group_id * @param bool $remove */ function ld_update_leader_group_access( $user_id, $group_id, $remove = false ) { if ( $remove ) { delete_user_meta( $user_id, 'learndash_group_leaders_' . $group_id ); /** * Run actions after group access is removed for user * * @since 2.1.0 * * @param int $user_id */ do_action( 'ld_removed_leader_group_access', $user_id, $group_id ); } else { update_user_meta( $user_id, 'learndash_group_leaders_' . $group_id, $group_id ); /** * Run actions after group access is added for user * * @since 2.1.0 * * @param int $user_id */ do_action( 'ld_added_leader_group_access', $user_id, $group_id ); } } /** * For a given Course and if course is associated with a group(s) get all user_ids * * @since 2.3 * * @param int $course_id * @return array array of user_ids */ function get_course_groups_users_access( $course_id = 0 ) { $user_ids = array(); if ( !empty( $course_id ) ) { $course_groups = learndash_get_course_groups( $course_id ); //error_log('course_groups
'. print_r($course_groups, true) .''); if ( !empty( $course_groups ) ) { foreach( $course_groups as $group_id ) { $group_users_ids = learndash_get_groups_user_ids( $group_id ); if ( !empty( $group_users_ids ) ) { $user_ids = array_merge( $user_ids, $group_users_ids ); } } } } if ( !empty( $user_ids ) ) { $user_ids = array_unique( $user_ids ); } return $user_ids; } /** * Get all Quizzes related to Group Courses * * Given a group ID will determine all Quizzes associated with Courses of the group * * @since 2.3 * * @param int $group_id * @return array array of quiz_ids */ function learndash_get_group_course_quiz_ids( $group_id = 0 ) { $group_quiz_ids = array(); if ( !empty( $group_id ) ) { $group_course_ids = learndash_group_enrolled_courses( intval( $group_id ) ); if ( !empty( $group_course_ids ) ) { foreach( $group_course_ids as $course_id ) { $group_quiz_query_args = array( 'post_type' => 'sfwd-quiz', 'nopaging' => true, 'fields' => 'ids', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'course_id', 'value' => $course_id, 'compare' => '=', ), array( 'key' => 'ld_course_' . $course_id, 'value' => $course_id, 'compare' => '=', ) ) ); $group_quiz_query = new WP_Query( $group_quiz_query_args ); if ( ! empty( $group_quiz_query->posts ) ) { $group_quiz_ids = array_merge( $group_quiz_ids, $group_quiz_query->posts ); $group_quiz_ids = array_unique( $group_quiz_ids ); } } } } return $group_quiz_ids; }