pmpro_hooks(); $this->wp_hooks(); } /** * Hooks that run only when PMPro is active. * * @since 1.4.2 */ function pmpro_hooks() { add_action( 'pmpro_save_membership_level', array( $this, 'edit_level' ) ); add_action( 'pmpro_delete_membership_level', array( $this, 'delete_level' ) ); if ( defined( 'PMPRO_VERSION' ) && version_compare( '2.5.8', PMPRO_VERSION, '>' ) ) { // Use legacy functionality to update roles on level change. add_action( 'pmpro_after_change_membership_level', array($this, 'user_change_level' ), 10, 2 ); } else { add_action( 'pmpro_after_all_membership_level_changes', array( $this, 'after_all_level_changes' ), 10, 1 ); } add_action( 'pmpro_membership_level_after_other_settings', array( 'PMPRO_Roles', 'level_settings' ) ); } /** * Hooks that may need to run without PMPro activated. * * @return void */ function wp_hooks() { add_action( 'admin_enqueue_scripts', array($this, 'enqueue_admin_scripts' ) ); add_action( 'init', array( $this, 'load_text_domain' ) ); add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( 'PMPRO_Roles', 'add_action_links' ) ); add_action( 'wp_ajax_' . PMPRO_Roles::$ajaction, array( $this, 'install' ) ); add_filter( 'plugin_row_meta', array( 'PMPRO_Roles', 'plugin_row_meta' ), 10, 2 ); add_filter( 'editable_roles', array( 'PMPRO_Roles', 'remove_list_roles' ), 10, 1 ); add_action( 'admin_init', array( 'PMPRO_Roles', 'delete_and_deactivate' ) ); } /** * Load plugin text domain for translations. * @since 1.3 */ function load_text_domain() { load_plugin_textdomain( 'pmpro-roles', false, basename( dirname( __FILE__ ) ) . '/languages' ); } /** * Javascript for admin area. */ function enqueue_admin_scripts($hook) { if( 'toplevel_page_pmpro-membershiplevels' != $hook ) { return; } wp_enqueue_script( PMPRO_Roles::$plugin_prefix.'admin', plugin_dir_url( __FILE__ ) . '/admin.js' ); wp_enqueue_style( PMPRO_Roles::$plugin_prefix.'admin', plugin_dir_url( __FILE__ ) . '/admin.css' ); $nonce = wp_create_nonce( PMPRO_Roles::$ajaction ); $vars = array( 'desc' => esc_html__('Levels not matching up, or missing?', PMPRO_Roles::$plugin_slug ), 'repair' => esc_html__('Repair', PMPRO_Roles::$plugin_slug ), 'working' => esc_html__('Working...', PMPRO_Roles::$plugin_slug ), 'done' => esc_html__('Done!', PMPRO_Roles::$plugin_slug ), 'fixed' => esc_html__( 'role connections were needed/repaired.', PMPRO_Roles::$plugin_slug ), 'failed' => esc_html__( 'An error occurred while repairing roles.', PMPRO_Roles::$plugin_slug ), 'ajaction' => PMPRO_Roles::$ajaction, 'nonce' => $nonce, ); $key = PMPRO_Roles::$plugin_prefix.'vars'; wp_localize_script( PMPRO_Roles::$plugin_prefix . 'admin', 'key', array( 'key'=>$key ) ); wp_localize_script( PMPRO_Roles::$plugin_prefix . 'admin', $key, $vars ); } /** * Get an array of roles set for a given level. * @since 1.4.1 * @param int $level_id The ID of the level to check for. */ public static function get_roles_for_level( $level_id ) { // In case a level object is passed in. if ( is_object( $level_id ) && ! empty( $level_id->id ) ) { $level_id = $level_id->id; } // Fail if no level. if ( empty( $level_id ) ) { return array(); } $roles = get_option( self::$plugin_prefix . $level_id ); // Default to the role created for this level. if ( empty( $roles ) ) { $roles = array(); $level = pmpro_getLevel( $level_id ); if ( ! empty( $level ) ) { $roles[ self::$role_key . $level_id ] = $level->name; } } return $roles; } /** * Settings for the edit level admin screen. Creates and saves role selection per level. * @since 1.3 */ function edit_level( $saveid ) { //by being here, we know we already have the $_REQUEST we need, so no need to check. $capabilities = self::capabilities( self::$role_key . $saveid ); if ( ! empty( $_REQUEST['pmpro_roles_level_present'] ) ) { if ( ! empty( $_REQUEST['pmpro_roles_level'] ) ) { $level_roles = $_REQUEST['pmpro_roles_level']; } else { // If no role chosen, use the default. $level_roles = array(); $level_roles[ self::$role_key . $saveid ] = sanitize_text_field( $_REQUEST['name'] ); } //created a new level if( $_REQUEST['edit'] < 0 ) { foreach( $level_roles as $role_key => $role_name ){ if( $role_key === 'pmpro_draft_role' ){ add_role( PMPRO_Roles::$role_key.$saveid, sanitize_text_field( $_REQUEST['name'] ), array( 'read' => true ) ); } if ( $role_key === 'pmpro_role_'. $saveid ) { $capabilities = PMPRO_Roles::capabilities( $role_key ); add_role( $role_key, $role_name, $capabilities ); } } } else { global $wpdb; //have to get all roles and find ours because get_role() doesn't yield the role's "pretty" name, only its index. $roles = get_option( $wpdb->get_blog_prefix() . 'user_roles' ); if(!is_array( $roles ) ) return; foreach( $level_roles as $role_key => $role_name ){ if( !isset( $roles[$role_key] ) ){ $capabilities = PMPRO_Roles::capabilities( $role_key ); add_role( $role_key, sanitize_text_field( $_REQUEST['name'] ), $capabilities[$role_key] ); return; } if( ( strpos( $role_key, PMPRO_Roles::$role_key ) !== FALSE ) && sanitize_text_field( $_REQUEST['name'] ) !== $role_name ) { PMPRO_Roles::update_role_name( $role_key, sanitize_text_field( $_REQUEST['name'] ) ); } } } if( !empty( $level_roles['pmpro_draft_role'] ) ){ unset( $level_roles['pmpro_draft_role'] ); $level_roles[PMPRO_Roles::$role_key.$saveid] = sanitize_text_field( $_REQUEST['name'] ); } update_option( 'pmpro_roles_'.$saveid, $level_roles ); } } /** * Delete custom PMPro role on level delete. * @since 1.0 */ function delete_level( $delete_id ) { $role_key = PMPRO_Roles::$role_key . $delete_id; if( !empty( $role_key ) ){ remove_role( $role_key ); } delete_option( 'pmpro_roles_' . $delete_id ); do_action( 'pmpro_roles_delete_membership_level', $delete_id ); } /** * Update a PMPro Roles Name if level name changes. * @since 1.3 */ function update_role_name( $role, $name ){ if( strpos( $role, PMPRO_Roles::$role_key ) !== FALSE ) { $roles_array = get_option( 'wp_user_roles', true ); if( !empty( $roles_array[$role] ) ){ $roles_array[$role]['name'] = sanitize_text_field( $name ); $updated = update_option( 'wp_user_roles', $roles_array ); } } } /** * Update users' roles after their membership levels are changed. * * @param array $old_user_levels $user_id => array $old_levels */ function after_all_level_changes( $old_user_levels ) { foreach ( $old_user_levels as $user_id => $old_levels ) { // Get the user who changed levels. $user = new WP_User( $user_id ); // Ignore administrators. if ( in_array( 'administrator', $user->roles ) ) { continue; } // Get the user's current active membership levels. $new_levels = pmpro_getMembershipLevelsForUser( $user_id ); $new_roles = array(); $old_roles = array(); // Build an array of all roles assigned to the user's old membership levels. foreach ( $old_levels as $old_level ) { $old_level_roles = self::get_roles_for_level( $old_level->id ); if ( ! empty( $old_level_roles ) && is_array( $old_level_roles ) ) { $old_roles = array_merge( $old_roles, array_keys( $old_level_roles ) ); } } // Build an array of all roles assigned to the user's new membership levels. foreach ( $new_levels as $new_level ) { $new_level_roles = self::get_roles_for_level( $new_level->id ); if ( ! empty( $new_level_roles ) && is_array( $new_level_roles ) ) { $new_roles = array_merge( $new_roles, array_keys( $new_level_roles ) ); } } // Remove duplicates in the array of old and new roles. $old_roles = array_unique( $old_roles ); $new_roles = array_unique( $new_roles ); // Build a unique array of roles to add and remove from user. $add_roles = $new_roles; $remove_roles = array_values( array_diff( $old_roles, $new_roles ) ); // Add roles to user. foreach ( $add_roles as $add_role ) { $user->add_role( $add_role ); } // Remove roles from user. foreach ( $remove_roles as $remove_role ) { $user->remove_role( $remove_role ); } // Handle case where role can be "simplified" to a single role. $default_role = apply_filters( 'pmpro_roles_downgraded_role', get_option( 'default_role' ) ); if ( in_array( $default_role, $user->roles, true ) && count( $user->roles ) == 2 ) { $user->remove_role( $default_role ); } // Handle case where user has no role. if ( empty( $user->roles ) ) { $user->add_role( $default_role ); } // Allows user's to be inside the foreach loop and hook in to do things. do_action( 'pmpro_roles_after_role_change', $user, $old_user_levels, $old_roles, $new_roles ); } } /** * Change user role based on level change. (Now supports MMPU) * No longer being used if PMPro version >= 2.5.8. * * @since 1.0 */ function user_change_level($level_id, $user_id){ global $pmpro_checkout_levels; //get user object $wp_user_object = new WP_User($user_id); //ignore admins if( in_array( 'administrator', $wp_user_object->roles ) ) return; // Check if user is cancelling. if( defined( 'PMPROMMPU_DIR' ) && !empty( $_REQUEST['levelstocancel'] ) ) { //Adds support for MMPU $levels_to_cancel = explode( " ", $_REQUEST['levelstocancel'] ); if( !empty( $levels_to_cancel ) ){ foreach( $levels_to_cancel as $ltc ){ $wp_user_object->remove_role( PMPRO_Roles::$role_key.intval( $ltc ) ); } } } else if( $level_id == 0 ) { $default_role = apply_filters( 'pmpro_roles_downgraded_role', get_option( 'default_role' ) ); $wp_user_object->set_role( $default_role ); } else { if( !empty( $pmpro_checkout_levels ) ){ //Adds support for MMPU foreach( $pmpro_checkout_levels as $co_level ){ $roles = self::get_roles_for_level( $co_level->id ); if( is_array( $roles ) && ! empty( $roles ) ){ foreach( $roles as $role_key => $role_name ){ $wp_user_object->add_role( $role_key ); } } else { $wp_user_object->set_role( PMPRO_Roles::$role_key . $co_level->id ); } } } else if( $level_id > 0 ){ $roles = self::get_roles_for_level( $level_id ); if( is_array( $roles ) && ! empty( $roles ) ){ $count = 1; foreach( $roles as $role_key => $role_name ){ if( $count == 1 ){ $wp_user_object->set_role( $role_key ); } else { $wp_user_object->add_role( $role_key ); } $count++; } } else { $wp_user_object->set_role( PMPRO_Roles::$role_key.intval( $level_id ) ); } } } } /** * Show a list of all available roles as a checkbox inside level settings. * @since 1.3 */ public static function level_settings() { ?>
array ( 'href' => array(), 'target' => array(), 'title' => array(), ), ); echo sprintf( wp_kses( __( 'Choose one or more roles to be assigned for members of this level. Visit the documentation page for more information.', 'pmpro-roles' ), $allowed_pmpro_roles_description_html ), 'https://www.paidmembershipspro.com/add-ons/pmpro-roles//?utm_source=plugin&utm_medium=pmpro-membershiplevels&utm_campaign=add-ons&utm_content=pmpro-roles' ); ?>
|
5 ) {
$classes[] = "pmpro_scrollable";
}
$class = implode( ' ', array_unique( $classes ) );
?>
/>
$role ) {
$checked = '';
//Backwards compat here, if $saved_roles is empty, set the default level's role as checked
if ( empty( $saved_roles ) ) {
if ( PMPRO_Roles::$role_key.$level_id == $key ) {
$checked = 'checked=true';
}
}
if ( isset( $saved_roles[$key] ) ) {
$checked = 'checked=true';
}
if ( $exclude_other_pmpro_roles ) {
//excluding the pmpro_role_ roles here
if ( $key != 'pmpro_role_' . $level_id ) { //Show this one first
?>
/>
/>
|
.