templates_path = UM_PATH . 'includes/admin/templates/'; add_action( 'admin_init', array( &$this, 'admin_init' ), 0 ); $prefix = is_network_admin() ? 'network_admin_' : ''; add_filter( "{$prefix}plugin_action_links_" . UM_PLUGIN, array( &$this, 'plugin_links' ) ); add_action( 'um_admin_do_action__user_cache', array( &$this, 'user_cache' ) ); add_action( 'um_admin_do_action__user_status_cache', array( &$this, 'user_status_cache' ) ); add_action( 'um_admin_do_action__purge_temp', array( &$this, 'purge_temp' ) ); add_action( 'um_admin_do_action__manual_upgrades_request', array( &$this, 'manual_upgrades_request' ) ); add_action( 'um_admin_do_action__duplicate_form', array( &$this, 'duplicate_form' ) ); add_action( 'um_admin_do_action__check_templates_version', array( &$this, 'check_templates_version' ) ); add_action( 'um_admin_do_action__install_core_pages', array( &$this, 'install_core_pages' ) ); add_action( 'um_admin_do_action__install_predefined_page', array( &$this, 'install_predefined_page' ) ); add_action( 'parent_file', array( &$this, 'parent_file' ), 9 ); add_filter( 'gettext', array( &$this, 'gettext' ), 10, 4 ); add_filter( 'post_updated_messages', array( &$this, 'post_updated_messages' ) ); } public function includes() { $this->actions_listener(); $this->enqueue(); $this->notices(); $this->secure(); $this->site_health(); $this->users_columns(); } public function init_variables() { $this->role_meta = apply_filters( 'um_role_meta_map', array( '_um_priority' => array( 'sanitize' => 'int', ), '_um_can_access_wpadmin' => array( 'sanitize' => 'bool', ), '_um_can_not_see_adminbar' => array( 'sanitize' => 'bool', ), '_um_can_edit_everyone' => array( 'sanitize' => 'bool', ), '_um_can_edit_roles' => array( 'sanitize' => array( $this, 'sanitize_existed_role' ), ), '_um_can_delete_everyone' => array( 'sanitize' => 'bool', ), '_um_can_delete_roles' => array( 'sanitize' => array( $this, 'sanitize_existed_role' ), ), '_um_can_edit_profile' => array( 'sanitize' => 'bool', ), '_um_can_delete_profile' => array( 'sanitize' => 'bool', ), '_um_can_view_all' => array( 'sanitize' => 'bool', ), '_um_can_view_roles' => array( 'sanitize' => array( $this, 'sanitize_existed_role' ), ), '_um_can_make_private_profile' => array( 'sanitize' => 'bool', ), '_um_can_access_private_profile' => array( 'sanitize' => 'bool', ), '_um_profile_noindex' => array( 'sanitize' => array( $this, 'sanitize_profile_noindex' ), ), '_um_default_homepage' => array( 'sanitize' => 'bool', ), '_um_redirect_homepage' => array( 'sanitize' => 'url', ), '_um_status' => array( 'sanitize' => 'sanitize_array_key', 'default' => 'approved', 'array' => array( 'approved', 'checkmail', 'pending' ), ), '_um_auto_approve_act' => array( 'sanitize' => 'sanitize_array_key', 'default' => 'redirect_profile', 'array' => array( 'redirect_profile', 'redirect_url' ), ), '_um_auto_approve_url' => array( 'sanitize' => 'url', ), '_um_login_email_activate' => array( 'sanitize' => 'bool', ), '_um_checkmail_action' => array( 'sanitize' => 'sanitize_array_key', 'default' => 'show_message', 'array' => array( 'show_message', 'redirect_url' ), ), '_um_checkmail_message' => array( 'sanitize' => 'textarea', ), '_um_checkmail_url' => array( 'sanitize' => 'url', ), '_um_url_email_activate' => array( 'sanitize' => 'url', ), '_um_pending_action' => array( 'sanitize' => 'sanitize_array_key', 'default' => 'show_message', 'array' => array( 'show_message', 'redirect_url' ), ), '_um_pending_message' => array( 'sanitize' => 'textarea', ), '_um_pending_url' => array( 'sanitize' => 'url', ), '_um_after_login' => array( 'sanitize' => 'sanitize_array_key', 'default' => 'redirect_profile', 'array' => array( 'redirect_profile', 'redirect_url', 'refresh', 'redirect_admin' ), ), '_um_login_redirect_url' => array( 'sanitize' => 'url', ), '_um_after_logout' => array( 'sanitize' => 'sanitize_array_key', 'default' => 'redirect_home', 'array' => array( 'redirect_home', 'redirect_url' ), ), '_um_logout_redirect_url' => array( 'sanitize' => 'url', ), '_um_after_delete' => array( 'sanitize' => 'sanitize_array_key', 'default' => 'redirect_home', 'array' => array( 'redirect_home', 'redirect_url' ), ), '_um_delete_redirect_url' => array( 'sanitize' => 'url', ), 'wp_capabilities' => array( 'sanitize' => array( $this, 'sanitize_wp_capabilities' ), ), ) ); $this->restriction_post_meta = apply_filters( 'um_restriction_post_meta_map', array( '_um_custom_access_settings' => array( 'sanitize' => 'bool', ), '_um_accessible' => array( 'sanitize' => 'int', ), '_um_access_roles' => array( 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ), ), '_um_noaccess_action' => array( 'sanitize' => 'int', ), '_um_restrict_by_custom_message' => array( 'sanitize' => 'int', ), '_um_restrict_custom_message' => array( 'sanitize' => 'wp_kses', ), '_um_access_redirect' => array( 'sanitize' => 'int', ), '_um_access_redirect_url' => array( 'sanitize' => 'url', ), '_um_access_hide_from_queries' => array( 'sanitize' => 'bool', ), ) ); $this->restriction_term_meta = apply_filters( 'um_restriction_term_meta_map', array( '_um_custom_access_settings' => array( 'sanitize' => 'bool', ), '_um_accessible' => array( 'sanitize' => 'int', ), '_um_access_roles' => array( 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ), ), '_um_noaccess_action' => array( 'sanitize' => 'int', ), '_um_restrict_by_custom_message' => array( 'sanitize' => 'int', ), '_um_restrict_custom_message' => array( 'sanitize' => 'wp_kses', ), '_um_access_redirect' => array( 'sanitize' => 'int', ), '_um_access_redirect_url' => array( 'sanitize' => 'url', ), '_um_access_hide_from_queries' => array( 'sanitize' => 'bool', ), ) ); $this->member_directory_meta = apply_filters( 'um_member_directory_meta_map', array( '_um_directory_template' => array( 'sanitize' => 'text', ), '_um_mode' => array( 'sanitize' => 'key', ), '_um_view_types' => array( 'sanitize' => array( $this, 'sanitize_md_view_types' ), ), '_um_default_view' => array( 'sanitize' => 'key', ), '_um_roles' => array( 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ), ), '_um_has_profile_photo' => array( 'sanitize' => 'bool', ), '_um_show_these_users' => array( 'sanitize' => 'textarea', ), '_um_exclude_these_users' => array( 'sanitize' => 'textarea', ), '_um_must_search' => array( 'sanitize' => 'bool', ), '_um_max_users' => array( 'sanitize' => 'absint', ), '_um_profiles_per_page' => array( 'sanitize' => 'absint', ), '_um_profiles_per_page_mobile' => array( 'sanitize' => 'absint', ), '_um_directory_header' => array( 'sanitize' => 'text', ), '_um_directory_header_single' => array( 'sanitize' => 'text', ), '_um_directory_no_users' => array( 'sanitize' => 'text', ), '_um_profile_photo' => array( 'sanitize' => 'bool', ), '_um_cover_photos' => array( 'sanitize' => 'bool', ), '_um_show_name' => array( 'sanitize' => 'bool', ), '_um_show_tagline' => array( 'sanitize' => 'bool', ), '_um_tagline_fields' => array( 'sanitize' => array( $this, 'sanitize_user_field' ), ), '_um_show_userinfo' => array( 'sanitize' => 'bool', ), '_um_reveal_fields' => array( 'sanitize' => array( $this, 'sanitize_user_field' ), ), '_um_show_social' => array( 'sanitize' => 'bool', ), '_um_userinfo_animate' => array( 'sanitize' => 'bool', ), '_um_search' => array( 'sanitize' => 'bool', ), '_um_roles_can_search' => array( 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ), ), '_um_filters' => array( 'sanitize' => 'bool', ), '_um_roles_can_filter' => array( 'sanitize' => array( $this, 'sanitize_restriction_existed_role' ), ), '_um_search_fields' => array( 'sanitize' => array( $this, 'sanitize_filter_fields' ), ), '_um_filters_expanded' => array( 'sanitize' => 'bool', ), '_um_filters_is_collapsible' => array( 'sanitize' => 'bool', ), '_um_search_filters' => array( 'sanitize' => array( $this, 'sanitize_filter_fields' ), ), '_um_sortby' => array( 'sanitize' => 'text', ), '_um_sortby_custom' => array( 'sanitize' => 'text', ), '_um_sortby_custom_label' => array( 'sanitize' => 'text', ), '_um_sortby_custom_type' => array( 'sanitize' => 'text', ), '_um_sortby_custom_order' => array( 'sanitize' => 'text', ), '_um_enable_sorting' => array( 'sanitize' => 'bool', ), '_um_sorting_fields' => array( 'sanitize' => array( $this, 'sanitize_md_sorting_fields' ), ), ) ); $this->form_meta = apply_filters( 'um_form_meta_map', array( '_um_mode' => array( 'sanitize' => 'key', ), '_um_register_use_gdpr' => array( 'sanitize' => 'bool', ), '_um_register_use_gdpr_content_id' => array( 'sanitize' => 'absint', ), '_um_register_use_gdpr_toggle_show' => array( 'sanitize' => 'text', ), '_um_register_use_gdpr_toggle_hide' => array( 'sanitize' => 'text', ), '_um_register_use_gdpr_agreement' => array( 'sanitize' => 'text', ), '_um_register_use_gdpr_error_text' => array( 'sanitize' => 'text', ), '_um_register_use_custom_settings' => array( 'sanitize' => 'bool', ), '_um_register_role' => array( 'sanitize' => 'key', ), '_um_register_template' => array( 'sanitize' => 'text', ), '_um_register_max_width' => array( 'sanitize' => 'text', ), '_um_register_icons' => array( 'sanitize' => 'key', ), '_um_register_primary_btn_word' => array( 'sanitize' => 'text', ), '_um_register_secondary_btn' => array( 'sanitize' => 'bool', ), '_um_register_secondary_btn_word' => array( 'sanitize' => 'text', ), '_um_login_after_login' => array( 'sanitize' => 'key', ), '_um_login_redirect_url' => array( 'sanitize' => 'url', ), '_um_login_use_custom_settings' => array( 'sanitize' => 'bool', ), '_um_login_template' => array( 'sanitize' => 'text', ), '_um_login_max_width' => array( 'sanitize' => 'text', ), '_um_login_icons' => array( 'sanitize' => 'key', ), '_um_login_primary_btn_word' => array( 'sanitize' => 'text', ), '_um_login_secondary_btn' => array( 'sanitize' => 'bool', ), '_um_login_secondary_btn_word' => array( 'sanitize' => 'text', ), '_um_login_forgot_pass_link' => array( 'sanitize' => 'bool', ), '_um_login_show_rememberme' => array( 'sanitize' => 'bool', ), '_um_profile_metafields' => array( 'sanitize' => array( $this, 'sanitize_user_field' ), ), '_um_profile_use_custom_settings' => array( 'sanitize' => 'bool', ), '_um_profile_role' => array( 'sanitize' => array( $this, 'sanitize_existed_role' ), ), '_um_profile_template' => array( 'sanitize' => 'text', ), '_um_profile_max_width' => array( 'sanitize' => 'text', ), '_um_profile_area_max_width' => array( 'sanitize' => 'text', ), '_um_profile_icons' => array( 'sanitize' => 'key', ), '_um_profile_primary_btn_word' => array( 'sanitize' => 'text', ), '_um_profile_secondary_btn' => array( 'sanitize' => 'bool', ), '_um_profile_secondary_btn_word' => array( 'sanitize' => 'text', ), '_um_profile_cover_enabled' => array( 'sanitize' => 'bool', ), '_um_profile_coversize' => array( 'sanitize' => 'absint', ), '_um_profile_cover_ratio' => array( 'sanitize' => 'text', ), '_um_profile_disable_photo_upload' => array( 'sanitize' => 'bool', ), '_um_profile_photosize' => array( 'sanitize' => array( $this, 'sanitize_photosize' ), ), '_um_profile_photo_required' => array( 'sanitize' => 'bool', ), '_um_profile_show_name' => array( 'sanitize' => 'bool', ), '_um_profile_show_social_links' => array( 'sanitize' => 'bool', ), '_um_profile_show_bio' => array( 'sanitize' => 'bool', ), ) ); $this->builder_input = apply_filters( 'um_builder_input_map', array( '_in_row' => array( 'sanitize' => 'key', ), '_in_sub_row' => array( 'sanitize' => 'absint', ), '_in_column' => array( 'sanitize' => 'absint', ), '_in_group' => array( 'sanitize' => 'absint', ), '_visibility' => array( 'sanitize' => 'key', ), '_conditional_action' => array( 'sanitize' => 'key', ), '_conditional_action1' => array( 'sanitize' => 'key', ), '_conditional_action2' => array( 'sanitize' => 'key', ), '_conditional_action3' => array( 'sanitize' => 'key', ), '_conditional_action4' => array( 'sanitize' => 'key', ), '_conditional_field' => array( 'sanitize' => 'text', ), '_conditional_field1' => array( 'sanitize' => 'text', ), '_conditional_field2' => array( 'sanitize' => 'text', ), '_conditional_field3' => array( 'sanitize' => 'text', ), '_conditional_field4' => array( 'sanitize' => 'text', ), '_conditional_operator' => array( 'sanitize' => 'text', ), '_conditional_operator1' => array( 'sanitize' => 'text', ), '_conditional_operator2' => array( 'sanitize' => 'text', ), '_conditional_operator3' => array( 'sanitize' => 'text', ), '_conditional_operator4' => array( 'sanitize' => 'text', ), '_conditional_value' => array( 'sanitize' => 'text', ), '_conditional_value1' => array( 'sanitize' => 'text', ), '_conditional_value2' => array( 'sanitize' => 'text', ), '_conditional_value3' => array( 'sanitize' => 'text', ), '_conditional_value4' => array( 'sanitize' => 'text', ), '_validate' => array( 'sanitize' => 'key', ), '_custom_validate' => array( 'sanitize' => 'text', ), '_icon' => array( 'sanitize' => 'text', ), '_css_class' => array( 'sanitize' => 'text', ), '_width' => array( 'sanitize' => 'absint', ), '_divider_text' => array( 'sanitize' => 'text', ), '_padding' => array( 'sanitize' => 'text', ), '_margin' => array( 'sanitize' => 'text', ), '_border' => array( 'sanitize' => 'text', ), '_borderstyle' => array( 'sanitize' => 'key', ), '_borderradius' => array( 'sanitize' => 'text', ), '_bordercolor' => array( 'sanitize' => 'text', ), '_heading' => array( 'sanitize' => 'bool', ), '_heading_text' => array( 'sanitize' => 'text', ), '_background' => array( 'sanitize' => 'text', ), '_heading_background_color' => array( 'sanitize' => 'text', ), '_heading_text_color' => array( 'sanitize' => 'text', ), '_text_color' => array( 'sanitize' => 'text', ), '_icon_color' => array( 'sanitize' => 'text', ), '_color' => array( 'sanitize' => 'text', ), '_url_text' => array( 'sanitize' => 'text', ), '_url_target' => array( 'sanitize' => 'key', ), '_url_rel' => array( 'sanitize' => 'key', ), '_force_good_pass' => array( 'sanitize' => 'bool', ), '_force_confirm_pass' => array( 'sanitize' => 'bool', ), '_style' => array( 'sanitize' => 'key', ), '_intervals' => array( 'sanitize' => 'absint', ), '_format' => array( 'sanitize' => 'text', ), '_format_custom' => array( 'sanitize' => 'text', ), '_pretty_format' => array( 'sanitize' => 'bool', ), '_disabled_weekdays' => array( 'sanitize' => 'absint', ), '_years' => array( 'sanitize' => 'absint', ), '_years_x' => array( 'sanitize' => 'key', ), '_range_start' => array( 'sanitize' => 'text', ), '_range_end' => array( 'sanitize' => 'text', ), '_range' => array( 'sanitize' => 'key', ), '_content' => array( 'sanitize' => 'textarea', ), '_crop' => array( 'sanitize' => 'int', ), '_allowed_types' => array( 'sanitize' => 'key', ), '_upload_text' => array( 'sanitize' => 'text', ), '_upload_help_text' => array( 'sanitize' => 'text', ), '_button_text' => array( 'sanitize' => 'text', ), '_max_size' => array( 'sanitize' => 'empty_absint', ), '_height' => array( 'sanitize' => 'text', ), '_spacing' => array( 'sanitize' => 'text', ), '_is_multi' => array( 'sanitize' => 'bool', ), '_max_selections' => array( 'sanitize' => 'empty_absint', ), '_min_selections' => array( 'sanitize' => 'empty_absint', ), '_max_entries' => array( 'sanitize' => 'empty_absint', ), '_max_words' => array( 'sanitize' => 'empty_absint', ), '_min' => array( 'sanitize' => 'empty_int', ), '_max' => array( 'sanitize' => 'empty_int', ), '_min_chars' => array( 'sanitize' => 'empty_absint', ), '_max_chars' => array( 'sanitize' => 'empty_absint', ), '_html' => array( 'sanitize' => 'bool', ), '_options' => array( 'sanitize' => 'textarea', ), '_title' => array( 'sanitize' => 'text', ), '_id' => array( 'sanitize' => 'text', ), '_metakey' => array( 'sanitize' => 'text', ), '_help' => array( 'sanitize' => 'text', ), '_default' => array( 'sanitize' => 'text', ), '_label' => array( 'sanitize' => 'text', ), '_label_confirm_pass' => array( 'sanitize' => 'text', ), '_placeholder' => array( 'sanitize' => 'text', ), '_public' => array( 'sanitize' => 'text', ), '_roles' => array( 'sanitize' => array( $this, 'sanitize_existed_role' ), ), '_required' => array( 'sanitize' => 'bool', ), '_editable' => array( 'sanitize' => 'bool', ), '_number' => array( 'sanitize' => 'absint', ), '_custom_dropdown_options_source' => array( 'sanitize' => 'text', ), '_parent_dropdown_relationship' => array( 'sanitize' => 'text', ), ) ); } /** * @param array|string $value * * @return array|string */ public function sanitize_md_sorting_fields( $value ) { $filter_fields = array_merge( UM()->member_directory()->sort_fields, array( 'other' => __( 'Other (Custom Field)', 'ultimate-member' ) ) ); $filter_fields = array_keys( $filter_fields ); if ( '' !== $value ) { $value = array_filter( $value, function( $v, $k ) use ( $filter_fields ) { if ( 'other_data' === $k ) { return true; } else { return in_array( sanitize_text_field( $v ), $filter_fields, true ); } }, ARRAY_FILTER_USE_BOTH ); $value = array_map( function( $item ) { if ( is_array( $item ) ) { if ( isset( $item['meta_key'] ) ) { $item['meta_key'] = sanitize_text_field( $item['meta_key'] ); } if ( isset( $item['label'] ) ) { $item['label'] = sanitize_text_field( $item['label'] ); } if ( isset( $item['order'] ) ) { $item['order'] = sanitize_text_field( $item['order'] ); } if ( isset( $item['data_type'] ) ) { $item['data_type'] = sanitize_text_field( $item['data_type'] ); } return $item; } else { return sanitize_text_field( $item ); } }, $value ); } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_filter_fields( $value ) { $filter_fields = array_keys( UM()->member_directory()->filter_fields ); if ( '' !== $value ) { $value = array_filter( $value, function( $v, $k ) use ( $filter_fields ) { return in_array( sanitize_text_field( $v ), $filter_fields, true ); }, ARRAY_FILTER_USE_BOTH ); $value = array_map( 'sanitize_text_field', $value ); } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_user_field( $value ) { $user_fields = array_keys( UM()->builtin()->all_user_fields() ); if ( '' !== $value ) { $value = array_filter( $value, function( $v, $k ) use ( $user_fields ) { return in_array( sanitize_text_field( $v ), $user_fields, true ); }, ARRAY_FILTER_USE_BOTH ); $value = array_map( 'sanitize_text_field', $value ); } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_md_view_types( $value ) { $view_types = array_map( function ( $item ) { return $item['title']; }, UM()->member_directory()->view_types ); $view_types = array_keys( $view_types ); if ( '' !== $value ) { $value = array_filter( $value, function( $v, $k ) use ( $view_types ) { return in_array( sanitize_key( $k ), $view_types, true ) && 1 === (int) $v; }, ARRAY_FILTER_USE_BOTH ); $value = array_map( 'sanitize_key', $value ); } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_photosize( $value ) { $sizes = UM()->files()->get_profile_photo_size( 'photo_thumb_sizes' ); $sizes = array_keys( $sizes ); if ( '' !== $value ) { $value = in_array( absint( $value ), $sizes, true ) ? absint( $value ) : ''; } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_cover_photosize( $value ) { $sizes = UM()->files()->get_profile_photo_size( 'cover_thumb_sizes' ); $sizes = array_keys( $sizes ); if ( '' !== $value ) { $value = in_array( absint( $value ), $sizes, true ) ? absint( $value ) : ''; } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_restriction_existed_role( $value ) { $all_roles = array_keys( UM()->roles()->get_roles() ); if ( '' !== $value ) { $value = array_filter( $value, function( $v, $k ) use ( $all_roles ) { return in_array( sanitize_key( $k ), $all_roles, true ) && 1 === (int) $v; }, ARRAY_FILTER_USE_BOTH ); $value = array_map( 'sanitize_key', $value ); } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_existed_role( $value ) { $all_roles = array_keys( UM()->roles()->get_roles() ); if ( '' !== $value ) { $value = array_filter( $value, function( $v, $k ) use ( $all_roles ) { return in_array( sanitize_key( $v ), $all_roles, true ); }, ARRAY_FILTER_USE_BOTH ); $value = array_map( 'sanitize_key', $value ); } return $value; } /** * @param array|string $value * * @return array|string */ public function sanitize_tabs_privacy( $value ) { $all_privacy = array_keys( UM()->profile()->tabs_privacy() ); if ( '' !== $value ) { $value = in_array( absint( $value ), $all_privacy, true ) ? absint( $value ) : ''; } return $value; } /** * @param $value * * @return bool|string */ public function sanitize_profile_noindex( $value ) { $value = '' !== $value ? (bool) $value : $value; return $value; } /** * @param $value * * @return array */ public function sanitize_wp_capabilities( $value ) { $value = array_map( 'boolval', array_filter( $value ) ); return $value; } /** * @param $value * * @return array */ public function sanitize_wp_capabilities_assoc( $value ) { $value = array_map( 'sanitize_key', array_filter( $value ) ); return $value; } /** * Sanitize role meta fields when wp-admin form has been submitted * * @param array $data * * @return array */ public function sanitize_role_meta( $data ) { $sanitized = array(); foreach ( $data as $k => $v ) { if ( ! array_key_exists( $k, $this->role_meta ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( ! array_key_exists( 'sanitize', $this->role_meta[ $k ] ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( is_callable( $this->role_meta[ $k ]['sanitize'], true, $callable_name ) ) { add_filter( 'um_role_meta_sanitize_' . $k, $this->role_meta[ $k ]['sanitize'], 10, 1 ); } switch ( $this->role_meta[ $k ]['sanitize'] ) { default: $sanitized[ $k ] = apply_filters( 'um_role_meta_sanitize_' . $k, $data[ $k ] ); break; case 'int': $sanitized[ $k ] = (int) $v; break; case 'bool': $sanitized[ $k ] = (bool) $v; break; case 'url': $sanitized[ $k ] = esc_url_raw( $v ); break; case 'textarea': $sanitized[ $k ] = sanitize_textarea_field( $v ); break; case 'sanitize_array_key': if ( ! array_key_exists( 'default', $this->role_meta[ $k ] ) || ! array_key_exists( 'array', $this->role_meta[ $k ] ) ) { continue 2; } $sanitized[ $k ] = ! in_array( sanitize_key( $v ), $this->role_meta[ $k ]['array'], true ) ? $this->role_meta[ $k ]['default'] : sanitize_key( $v ); break; } } $data = $sanitized; $data = apply_filters( 'um_save_role_meta_sanitize', $data ); return $data; } /** * Sanitize post restriction meta fields when wp-admin form has been submitted * * @param array $data * * @return array */ public function sanitize_post_restriction_meta( $data ) { $sanitized = array(); foreach ( $data as $k => $v ) { if ( ! array_key_exists( $k, $this->restriction_post_meta ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( ! array_key_exists( 'sanitize', $this->restriction_post_meta[ $k ] ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( is_callable( $this->restriction_post_meta[ $k ]['sanitize'], true, $callable_name ) ) { add_filter( 'um_restriction_post_meta_sanitize_' . $k, $this->restriction_post_meta[ $k ]['sanitize'], 10, 1 ); } switch ( $this->restriction_post_meta[ $k ]['sanitize'] ) { default: $sanitized[ $k ] = apply_filters( 'um_restriction_post_meta_sanitize_' . $k, $data[ $k ] ); break; case 'int': $sanitized[ $k ] = (int) $v; break; case 'bool': $sanitized[ $k ] = (bool) $v; break; case 'url': $sanitized[ $k ] = esc_url_raw( $v ); break; case 'textarea': $sanitized[ $k ] = sanitize_textarea_field( $v ); break; case 'wp_kses': $sanitized[ $k ] = wp_kses_post( $v ); break; } } $data = $sanitized; $data = apply_filters( 'um_save_restriction_post_meta_sanitize', $data ); return $data; } /** * Sanitize term restriction meta fields when wp-admin form has been submitted * * @param array $data * * @return array */ public function sanitize_term_restriction_meta( $data ) { $sanitized = array(); foreach ( $data as $k => $v ) { if ( ! array_key_exists( $k, $this->restriction_term_meta ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( ! array_key_exists( 'sanitize', $this->restriction_term_meta[ $k ] ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( is_callable( $this->restriction_term_meta[ $k ]['sanitize'], true, $callable_name ) ) { add_filter( 'um_restriction_term_meta_sanitize_' . $k, $this->restriction_term_meta[ $k ]['sanitize'], 10, 1 ); } switch ( $this->restriction_term_meta[ $k ]['sanitize'] ) { default: $sanitized[ $k ] = apply_filters( 'um_restriction_term_meta_sanitize_' . $k, $data[ $k ] ); break; case 'int': $sanitized[ $k ] = (int) $v; break; case 'bool': $sanitized[ $k ] = (bool) $v; break; case 'url': $sanitized[ $k ] = esc_url_raw( $v ); break; case 'textarea': $sanitized[ $k ] = sanitize_textarea_field( $v ); break; case 'wp_kses': $sanitized[ $k ] = wp_kses_post( $v ); break; } } $data = $sanitized; $data = apply_filters( 'um_save_restriction_term_meta_sanitize', $data ); return $data; } /** * Sanitize member directory meta when wp-admin form has been submitted * * @todo checking all sanitize types * * @param array $data * * @return array */ public function sanitize_member_directory_meta( $data ) { $sanitized = array(); foreach ( $data as $k => $v ) { if ( ! array_key_exists( $k, $this->member_directory_meta ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( ! array_key_exists( 'sanitize', $this->member_directory_meta[ $k ] ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( is_callable( $this->member_directory_meta[ $k ]['sanitize'], true, $callable_name ) ) { add_filter( 'um_member_directory_meta_sanitize_' . $k, $this->member_directory_meta[ $k ]['sanitize'], 10, 1 ); } switch ( $this->member_directory_meta[ $k ]['sanitize'] ) { default: $sanitized[ $k ] = apply_filters( 'um_member_directory_meta_sanitize_' . $k, $data[ $k ] ); break; case 'int': $sanitized[ $k ] = (int) $v; break; case 'bool': $sanitized[ $k ] = (bool) $v; break; case 'url': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'esc_url_raw', $v ); } else { $sanitized[ $k ] = esc_url_raw( $v ); } break; case 'text': $sanitized[ $k ] = sanitize_text_field( $v ); break; case 'textarea': $sanitized[ $k ] = sanitize_textarea_field( $v ); break; case 'key': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'sanitize_key', $v ); } else { $sanitized[ $k ] = sanitize_key( $v ); } break; case 'absint': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'absint', $v ); } else { $sanitized[ $k ] = absint( $v ); } break; } } $data = $sanitized; $data = apply_filters( 'um_save_member_directory_meta_sanitize', $data ); return $data; } /** * Sanitize builder field meta when wp-admin form has been submitted * * @todo checking all sanitize types * * @param array $data * * @return array */ public function sanitize_builder_field_meta( $data ) { $sanitized = array(); foreach ( $data as $k => $v ) { if ( ! array_key_exists( $k, $this->builder_input ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( ! array_key_exists( 'sanitize', $this->builder_input[ $k ] ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( is_callable( $this->builder_input[ $k ]['sanitize'], true, $callable_name ) ) { add_filter( 'um_builder_input_sanitize_' . $k, $this->builder_input[ $k ]['sanitize'], 10, 1 ); } switch ( $this->builder_input[ $k ]['sanitize'] ) { default: $sanitized[ $k ] = apply_filters( 'um_builder_input_sanitize_' . $k, $data[ $k ] ); break; case 'int': $sanitized[ $k ] = (int) $v; break; case 'empty_int': $sanitized[ $k ] = ( '' !== $v ) ? (int) $v : ''; break; case 'bool': $sanitized[ $k ] = (bool) $v; break; case 'url': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'esc_url_raw', $v ); } else { $sanitized[ $k ] = esc_url_raw( $v ); } break; case 'text': $sanitized[ $k ] = sanitize_text_field( $v ); break; case 'textarea': $sanitized[ $k ] = sanitize_textarea_field( $v ); break; case 'wp_kses': $sanitized[ $k ] = wp_kses_post( $v ); break; case 'key': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'sanitize_key', $v ); } else { $sanitized[ $k ] = sanitize_key( $v ); } break; case 'absint': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'absint', $v ); } else { $sanitized[ $k ] = absint( $v ); } break; case 'empty_absint': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'absint', $v ); } else { $sanitized[ $k ] = ( '' !== $v ) ? absint( $v ) : ''; } break; } } $data = $sanitized; $data = apply_filters( 'um_save_builder_input_sanitize', $data ); return $data; } /** * Sanitize form meta when wp-admin form has been submitted * * @todo checking all sanitize types * * @param array $data * * @return array */ public function sanitize_form_meta( $data ) { $sanitized = array(); foreach ( $data as $k => $v ) { if ( ! array_key_exists( $k, $this->form_meta ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( ! array_key_exists( 'sanitize', $this->form_meta[ $k ] ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( is_callable( $this->form_meta[ $k ]['sanitize'], true, $callable_name ) ) { add_filter( 'um_form_meta_sanitize_' . $k, $this->form_meta[ $k ]['sanitize'], 10, 1 ); } switch ( $this->form_meta[ $k ]['sanitize'] ) { default: $sanitized[ $k ] = apply_filters( 'um_form_meta_sanitize_' . $k, $data[ $k ] ); break; case 'int': $sanitized[ $k ] = (int) $v; break; case 'bool': $sanitized[ $k ] = (bool) $v; break; case 'url': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'esc_url_raw', $v ); } else { $sanitized[ $k ] = esc_url_raw( $v ); } break; case 'text': $sanitized[ $k ] = sanitize_text_field( $v ); break; case 'textarea': $sanitized[ $k ] = sanitize_textarea_field( $v ); break; case 'key': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'sanitize_key', $v ); } else { $sanitized[ $k ] = sanitize_key( $v ); } break; case 'absint': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'absint', $v ); } else { $sanitized[ $k ] = absint( $v ); } break; } } $data = $sanitized; $data = apply_filters( 'um_save_form_meta_sanitize', $data ); return $data; } /** * Sanitize options when wp-admin form has been submitted * * @todo checking all sanitize types * * @param array $data * * @return array */ public function sanitize_options( $data ) { $sanitized = array(); foreach ( $data as $k => $v ) { if ( ! array_key_exists( $k, UM()->admin_settings()->settings_map ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( ! array_key_exists( 'sanitize', UM()->admin_settings()->settings_map[ $k ] ) ) { // @todo remove since 2.2.x and leave only continue $sanitized[ $k ] = $v; continue; } if ( is_callable( UM()->admin_settings()->settings_map[ $k ]['sanitize'], true, $callable_name ) ) { add_filter( 'um_settings_sanitize_' . $k, UM()->admin_settings()->settings_map[ $k ]['sanitize'], 10, 1 ); } switch ( UM()->admin_settings()->settings_map[ $k ]['sanitize'] ) { default: $sanitized[ $k ] = apply_filters( 'um_settings_sanitize_' . $k, $v ); break; case 'int': $sanitized[ $k ] = (int) $v; break; case 'absint': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'absint', $v ); } else { $sanitized[ $k ] = absint( $v ); } break; case 'empty_absint': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'absint', $v ); } else { $sanitized[ $k ] = ( '' !== $v ) ? absint( $v ) : ''; } break; case 'key': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'sanitize_key', $v ); } else { $sanitized[ $k ] = sanitize_key( $v ); } break; case 'bool': $sanitized[ $k ] = (bool) $v; break; case 'url': if ( is_array( $v ) ) { $sanitized[ $k ] = array_map( 'esc_url_raw', $v ); } else { $sanitized[ $k ] = esc_url_raw( $v ); } break; case 'wp_kses': $sanitized[ $k ] = wp_kses_post( $v ); break; case 'textarea': $sanitized[ $k ] = sanitize_textarea_field( $v ); break; case 'text': $sanitized[ $k ] = sanitize_text_field( $v ); break; } } $data = $sanitized; $data = apply_filters( 'um_save_settings_sanitize', $data ); return $data; } /** * */ public function manual_upgrades_request() { $last_request = get_option( 'um_last_manual_upgrades_request', false ); if ( empty( $last_request ) || time() > $last_request + DAY_IN_SECONDS ) { if ( is_multisite() ) { $blogs_ids = get_sites(); foreach ( $blogs_ids as $b ) { switch_to_blog( $b->blog_id ); wp_clean_update_cache(); UM()->plugin_updater()->um_checklicenses(); update_option( 'um_last_manual_upgrades_request', time() ); restore_current_blog(); } } else { wp_clean_update_cache(); UM()->plugin_updater()->um_checklicenses(); update_option( 'um_last_manual_upgrades_request', time() ); } $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'um_got_updates', ), admin_url( 'admin.php' ) ); } else { $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'um_often_updates', ), admin_url( 'admin.php' ) ); } wp_safe_redirect( $url ); exit; } /** * Core pages installation. */ public function install_core_pages() { UM()->setup()->install_default_pages(); // Auto dismiss 'wrong_pages' notice if it's visible $this->dismiss_wrong_pages(); $url = add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } /** * Install predefined page based on $_REQUEST['um_page_slug'] argument. */ public function install_predefined_page() { if ( ! current_user_can( 'manage_options' ) ) { $url = add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } $predefined_pages = array_keys( UM()->config()->get( 'predefined_pages' ) ); // phpcs:ignore WordPress.Security.NonceVerification -- early nonce verification based on `um_adm_action` $page_slug = array_key_exists( 'um_page_slug', $_REQUEST ) ? sanitize_key( $_REQUEST['um_page_slug'] ) : ''; if ( empty( $page_slug ) || ! in_array( $page_slug, $predefined_pages, true ) ) { $url = add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } $post_ids = new WP_Query( array( 'post_type' => 'page', 'meta_query' => array( array( 'key' => '_um_core', 'value' => $page_slug, ), ), 'posts_per_page' => -1, 'fields' => 'ids', ) ); $post_ids = $post_ids->get_posts(); if ( ! empty( $post_ids ) ) { foreach ( $post_ids as $post_id ) { delete_post_meta( $post_id, '_um_core' ); } } UM()->setup()->predefined_page( $page_slug ); // Auto dismiss 'wrong_pages' notice if it's visible $this->dismiss_wrong_pages(); $url = add_query_arg( array( 'page' => 'um_options', 'update' => 'um_settings_updated', ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } /** * Dismiss 'wrong_pages' notice if it's visible. */ public function dismiss_wrong_pages() { // Check empty pages in settings. $empty_pages = array(); $predefined_pages = array_keys( UM()->config()->get( 'predefined_pages' ) ); foreach ( $predefined_pages as $slug ) { $page_id = um_get_predefined_page_id( $slug ); if ( ! $page_id ) { $empty_pages[] = $slug; continue; } $page = get_post( $page_id ); if ( ! $page ) { $empty_pages[] = $slug; continue; } } // If there aren't empty pages - then hide pages notice if ( empty( $empty_pages ) ) { $hidden_notices = get_option( 'um_hidden_admin_notices', array() ); if ( ! is_array( $hidden_notices ) ) { $hidden_notices = array(); } $hidden_notices[] = 'wrong_pages'; update_option( 'um_hidden_admin_notices', $hidden_notices ); } } /** * Clear all users cache. */ public function user_cache() { global $wpdb; $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'um_cache_userdata_%'" ); $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'um_cleared_cache', ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } /** * Clear all users statuses count cache. */ public function user_status_cache() { $statuses = array( 'approved', 'awaiting_admin_review', 'awaiting_email_confirmation', 'inactive', 'rejected', 'pending_dot', // not real status key, just for the transient 'unassigned', // not real status key, just for the transient ); foreach ( $statuses as $status ) { delete_transient( "um_count_users_{$status}" ); } delete_transient( 'um_count_users_all' ); do_action( 'um_flush_user_status_cache' ); $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'um_cleared_status_cache', ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } /** * Purge temp uploads dir. */ public function purge_temp() { UM()->files()->remove_dir( UM()->files()->upload_temp ); $url = add_query_arg( array( 'page' => 'ultimatemember', 'update' => 'um_purged_temp', ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } /** * Duplicate form */ public function duplicate_form() { if ( empty( $_REQUEST['post_id'] ) || empty( $_REQUEST['_wpnonce'] ) || ! wp_verify_nonce( $_REQUEST['_wpnonce'], "um-duplicate_form{$_REQUEST['post_id']}" ) ) { die( esc_html__( 'Security check', 'ultimate-member' ) ); } if ( ! is_numeric( $_REQUEST['post_id'] ) ) { die( esc_html__( 'Wrong ID', 'ultimate-member' ) ); } $post_id = absint( $_REQUEST['post_id'] ); $n = array( 'post_type' => 'um_form', // translators: %s - Form title 'post_title' => sprintf( __( 'Duplicate of %s', 'ultimate-member' ), get_the_title( $post_id ) ), 'post_status' => 'publish', 'post_author' => get_current_user_id(), 'meta_input' => array( '_um_mode' => get_post_meta( $post_id, '_um_mode', true ), ), ); $n_id = wp_insert_post( $n ); $n_fields = get_post_custom( $post_id ); foreach ( $n_fields as $key => $value ) { if ( '_um_custom_fields' === $key ) { $the_value = maybe_unserialize( $value[0] ); } else { $the_value = $value[0]; } update_post_meta( $n_id, $key, $the_value ); } delete_post_meta( $n_id, '_um_core' ); $url = add_query_arg( array( 'post_type' => 'um_form', 'update' => 'um_form_duplicated', ), admin_url( 'edit.php' ) ); wp_safe_redirect( $url ); exit; } /** * Manual check templates versions. */ public function check_templates_version() { UM()->common()->theme()->flush_transient_templates_data(); $url = add_query_arg( array( 'page' => 'um_options', 'tab' => 'advanced', 'section' => 'override_templates', ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } /** * Add any custom links to plugin page. * * @param array $links * * @return array */ public function plugin_links( $links ) { $more_links[] = '' . esc_html__( 'Docs', 'ultimate-member' ) . ''; $more_links[] = '' . esc_html__( 'Settings', 'ultimate-member' ) . ''; $links = $more_links + $links; return $links; } /** * Init admin action/filters + request handlers */ public function admin_init() { $this->init_variables(); if ( ! empty( $_REQUEST['um_adm_action'] ) && is_admin() && current_user_can( 'manage_options' ) ) { $action = sanitize_key( $_REQUEST['um_adm_action'] ); $individual_nonce_actions = array( 'duplicate_form', ); $individual_nonce_actions = apply_filters( 'um_adm_action_individual_nonce_actions', $individual_nonce_actions ); // Some actions have their own nonce. Verify individually. if ( ! in_array( $action, $individual_nonce_actions, true ) ) { if ( empty( $_REQUEST['_wpnonce'] ) || ! wp_verify_nonce( $_REQUEST['_wpnonce'], $action ) ) { wp_die( esc_attr__( 'Security Check', 'ultimate-member' ) ); } } /** * UM hook * * @type action * @title um_admin_do_action__ * @description Make some action on custom admin action * @input_vars * [{"var":"$action","type":"string","desc":"Admin Action"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_admin_do_action__', 'function_name', 10, 1 ); * @example * */ do_action( 'um_admin_do_action__', $action ); /** * UM hook * * @type action * @title um_admin_do_action__{$action} * @description Make some action on custom admin $action * @input_vars * [{"var":"$action","type":"string","desc":"Admin Action"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_admin_do_action__{$action}', 'function_name', 10, 1 ); * @example * */ do_action( "um_admin_do_action__{$action}", $action ); } } /** * Updated post messages * * @param array $messages * * @return array */ public function post_updated_messages( $messages ) { global $post_ID; $post_type = get_post_type( $post_ID ); if ( 'um_form' === $post_type ) { $messages['um_form'] = array( 0 => '', 1 => __( 'Form updated.', 'ultimate-member' ), 2 => __( 'Custom field updated.', 'ultimate-member' ), 3 => __( 'Custom field deleted.', 'ultimate-member' ), 4 => __( 'Form updated.', 'ultimate-member' ), 5 => isset( $_GET['revision'] ) ? __( 'Form restored to revision.', 'ultimate-member' ) : false, 6 => __( 'Form created.', 'ultimate-member' ), 7 => __( 'Form saved.', 'ultimate-member' ), 8 => __( 'Form submitted.', 'ultimate-member' ), 9 => __( 'Form scheduled.', 'ultimate-member' ), 10 => __( 'Form draft updated.', 'ultimate-member' ), ); } return $messages; } /** * Gettext filters * * @param $translation * @param $text * @param $domain * * @return string */ public function gettext( $translation, $text, $domain ) { global $post; if ( isset( $post->post_type ) && $this->screen()->is_own_post_type() ) { $translations = get_translations_for_domain( $domain ); if ( $text == 'Publish' ) { return $translations->translate( 'Create' ); } elseif ( $text == 'Move to Trash' ) { return $translations->translate( 'Delete' ); } } return $translation; } /** * Fix parent file for correct highlighting * * @param $parent_file * * @return string */ public function parent_file( $parent_file ) { global $current_screen; $screen_id = $current_screen->id; if ( strstr( $screen_id, 'um_' ) ) { $parent_file = 'ultimatemember'; } return $parent_file; } /** * @since 2.8.7 * * @return Actions_Listener */ public function actions_listener() { if ( empty( UM()->classes['um\admin\actions_listener'] ) ) { UM()->classes['um\admin\actions_listener'] = new Actions_Listener(); } return UM()->classes['um\admin\actions_listener']; } /** * @since 2.7.0 * * @return Enqueue */ public function enqueue() { if ( empty( UM()->classes['um\admin\enqueue'] ) ) { UM()->classes['um\admin\enqueue'] = new Enqueue(); } return UM()->classes['um\admin\enqueue']; } /** * @since 2.0 * * @return core\Admin_Notices() */ public function notices() { if ( empty( UM()->classes['admin_notices'] ) ) { UM()->classes['admin_notices'] = new core\Admin_Notices(); } return UM()->classes['admin_notices']; } /** * @since 2.8.0 * * @return Screen */ public function screen() { if ( empty( UM()->classes['um\admin\screen'] ) ) { UM()->classes['um\admin\screen'] = new Screen(); } return UM()->classes['um\admin\screen']; } /** * @since 2.6.8 * * @return Secure */ public function secure() { if ( empty( UM()->classes['um\admin\secure'] ) ) { UM()->classes['um\admin\secure'] = new Secure(); } return UM()->classes['um\admin\secure']; } /** * @since 2.7.0 * * @return Site_Health */ public function site_health() { if ( empty( UM()->classes['um\admin\site_health'] ) ) { UM()->classes['um\admin\site_health'] = new Site_Health(); } return UM()->classes['um\admin\site_health']; } /** * @since 2.8.7 * * @return Users_Columns */ public function users_columns() { if ( empty( UM()->classes['um\admin\users_columns'] ) ) { UM()->classes['um\admin\users_columns'] = new Users_Columns(); } return UM()->classes['um\admin\users_columns']; } } }