timestamp = time(); } /** * Standard checkbox field * * @param integer $id * @param string $title * @param bool $checked */ function checkbox( $id, $title, $checked = true ) { /** * Set value on form submission */ if ( isset( $_REQUEST[ $id ] ) ) { $checked = (bool) $_REQUEST[ $id ]; } $class = $checked ? 'um-icon-android-checkbox-outline' : 'um-icon-android-checkbox-outline-blank'; ?>
builtin()->get_all_user_fields(); foreach ( $fields as $field => $args ) { if ( array_key_exists( 'advanced', $args ) && 'social' === $args['advanced'] ) { $social[ $field ] = $args; } } foreach ( $social as $k => $arr ) { if ( um_profile( $k ) ) { if ( array_key_exists( 'match', $arr ) ) { $match = is_array( $arr['match'] ) ? $arr['match'][0] : $arr['match']; } else { $match = null; } $arr['url_target'] = isset( $arr['url_target'] ) ? $arr['url_target'] : '_blank'; ?> '; $fields = UM()->builtin()->get_specific_fields( $field ); $output = null; foreach ( $fields as $key => $data ) { $output .= $this->edit_field( $key, $data ); } echo $output; echo ''; } /** * Get hidden field * * @param string $key * @param string $value * * @return string */ function disabled_hidden_field( $key, $value ) { return ''; } /** * Updates a field globally * * @param integer $id * @param array $args */ function globally_update_field( $id, $args ) { $fields = UM()->builtin()->saved_fields; $fields[ $id ] = $args; if ( array_key_exists( 'custom_dropdown_options_source', $args ) ) { if ( function_exists( wp_unslash( $args['custom_dropdown_options_source'] ) ) ) { if ( ! $this->is_source_blacklisted( $args['custom_dropdown_options_source'] ) ) { $allowed_callbacks = UM()->options()->get( 'allowed_choice_callbacks' ); if ( ! empty( $allowed_callbacks ) ) { $allowed_callbacks = array_map( 'rtrim', explode( "\n", $allowed_callbacks ) ); $allowed_callbacks[] = $args['custom_dropdown_options_source']; } else { $allowed_callbacks = array( $args['custom_dropdown_options_source'] ); } $allowed_callbacks = array_unique( $allowed_callbacks ); $allowed_callbacks = implode( "\r\n", $allowed_callbacks ); UM()->options()->update( 'allowed_choice_callbacks', $allowed_callbacks ); } } } unset( $fields[ $id ]['in_row'] ); unset( $fields[ $id ]['in_sub_row'] ); unset( $fields[ $id ]['in_column'] ); unset( $fields[ $id ]['in_group'] ); unset( $fields[ $id ]['position'] ); do_action( 'um_add_new_field', $id, $args ); update_option( 'um_fields', $fields ); } /** * Updates a field in form only * * @param integer $id * @param array $args * @param integer $form_id */ function update_field( $id, $args, $form_id ) { $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); if ( $args['type'] == 'row' ) { if ( isset( $fields[ $id ] ) ) { $old_args = $fields[ $id ]; foreach ( $old_args as $k => $v ) { if ( ! in_array( $k, array( 'sub_rows', 'cols' ) ) ) { unset( $old_args[ $k ] ); } } $args = array_merge( $old_args, $args ); } } // custom fields support if ( isset( UM()->builtin()->predefined_fields[ $id ] ) && isset( UM()->builtin()->predefined_fields[ $id ]['custom'] ) ) { $args = array_merge( UM()->builtin()->predefined_fields[ $id ], $args ); } if ( array_key_exists( 'custom_dropdown_options_source', $args ) ) { if ( function_exists( wp_unslash( $args['custom_dropdown_options_source'] ) ) ) { if ( ! $this->is_source_blacklisted( $args['custom_dropdown_options_source'] ) ) { $allowed_callbacks = UM()->options()->get( 'allowed_choice_callbacks' ); if ( ! empty( $allowed_callbacks ) ) { $allowed_callbacks = array_map( 'rtrim', explode( "\n", $allowed_callbacks ) ); $allowed_callbacks[] = $args['custom_dropdown_options_source']; } else { $allowed_callbacks = array( $args['custom_dropdown_options_source'] ); } $allowed_callbacks = array_unique( $allowed_callbacks ); $allowed_callbacks = implode( "\r\n", $allowed_callbacks ); UM()->options()->update( 'allowed_choice_callbacks', $allowed_callbacks ); $args['custom_dropdown_options_source'] = wp_unslash( $args['custom_dropdown_options_source'] ); } } } $fields[ $id ] = $args; // for group field only if ( $args['type'] == 'group' ) { $fields[ $id ]['in_group'] = ''; } UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); } /** * Deletes a field in form only * * @param string $id * @param int $form_id */ public function delete_field_from_form( $id, $form_id ) { $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); if ( isset( $fields[ $id ] ) ) { $condition_fields = get_option( 'um_fields', array() ); if( ! is_array( $condition_fields ) ) $condition_fields = array(); foreach ( $condition_fields as $key => $value ) { $deleted_field = array_search( $id, $value ); if ( $key != $id && $deleted_field != false ) { $deleted_field_id = str_replace( 'conditional_field', '', $deleted_field ); if ( $deleted_field_id == '' ) { $arr_id = 0; } else { $arr_id = $deleted_field_id; } unset( $condition_fields[ $key ][ 'conditional_action' . $deleted_field_id ] ); unset( $condition_fields[ $key ][ $deleted_field ] ); unset( $condition_fields[ $key ][ 'conditional_operator' . $deleted_field_id ] ); unset( $condition_fields[ $key ][ 'conditional_value' . $deleted_field_id ] ); unset( $condition_fields[ $key ]['conditions'][ $arr_id ] ); unset( $fields[ $key ][ 'conditional_action' . $deleted_field_id ] ); unset( $fields[ $key ][ $deleted_field ] ); unset( $fields[ $key ][ 'conditional_operator' . $deleted_field_id ] ); unset( $fields[ $key ][ 'conditional_value' . $deleted_field_id ] ); unset( $fields[ $key ]['conditions'][ $arr_id ] ); } } update_option( 'um_fields' , $condition_fields ); unset( $fields[ $id ] ); UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); } } /** * Deletes a field from custom fields. * * @param string $id */ public function delete_field_from_db( $id ) { $fields = UM()->builtin()->saved_fields; if ( isset( $fields[ $id ] ) ) { $args = $fields[ $id ]; unset( $fields[ $id ] ); do_action( 'um_delete_custom_field', $id, $args ); update_option( 'um_fields', $fields ); global $wpdb; $forms = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'um_form'" ); foreach ( $forms as $form_id ) { $form_fields = get_post_meta( $form_id, '_um_custom_fields', true ); unset( $form_fields[ $id ] ); update_post_meta( $form_id, '_um_custom_fields', $form_fields ); } $directories = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'um_directory'" ); foreach ( $directories as $directory_id ) { // Frontend filters $directory_search_fields = get_post_meta( $directory_id, '_um_search_fields', true ); $directory_search_fields = ! is_array( $directory_search_fields ) ? array() : $directory_search_fields; $directory_search_fields = array_values( array_diff( $directory_search_fields, array( $id ) ) ); update_post_meta( $directory_id, '_um_search_fields', $directory_search_fields ); // Admin filtering $directory_search_filters = get_post_meta( $directory_id, '_um_search_filters', true ); if ( isset( $directory_search_filters[ $id ] ) ) { unset( $directory_search_filters[ $id ] ); } update_post_meta( $directory_id, '_um_search_filters', $directory_search_filters ); // display in tagline $directory_reveal_fields = get_post_meta( $directory_id, '_um_reveal_fields', true ); $directory_reveal_fields = ! is_array( $directory_reveal_fields ) ? array() : $directory_reveal_fields; $directory_reveal_fields = array_values( array_diff( $directory_reveal_fields, array( $id ) ) ); update_post_meta( $directory_id, '_um_reveal_fields', $directory_reveal_fields ); // extra user information section $directory_tagline_fields = get_post_meta( $directory_id, '_um_tagline_fields', true ); $directory_tagline_fields = ! is_array( $directory_tagline_fields ) ? array() : $directory_tagline_fields; $directory_tagline_fields = array_values( array_diff( $directory_tagline_fields, array( $id ) ) ); update_post_meta( $directory_id, '_um_tagline_fields', $directory_tagline_fields ); // Custom fields selected in "Choose field(s) to enable in sorting" $directory_sorting_fields = get_post_meta( $directory_id, '_um_sorting_fields', true ); $directory_sorting_fields = ! is_array( $directory_sorting_fields ) ? array() : $directory_sorting_fields; foreach ( $directory_sorting_fields as $key => $sorting_data ) { if ( is_array( $sorting_data ) && array_key_exists( $id, $sorting_data ) ) { unset( $directory_sorting_fields[ $key ] ); } } $directory_sorting_fields = array_values( $directory_sorting_fields ); update_post_meta( $directory_id, '_um_sorting_fields', $directory_sorting_fields ); // If "Default sort users by" = "Other (Custom Field)" is selected when delete this custom field and set default sorting $directory_sortby_custom = get_post_meta( $directory_id, '_um_sortby_custom', true ); if ( $directory_sortby_custom === $id ) { $directory_sortby = get_post_meta( $directory_id, '_um_sortby', true ); if ( 'other' === $directory_sortby ) { update_post_meta( $directory_id, '_um_sortby', 'user_registered_desc' ); } update_post_meta( $directory_id, '_um_sortby_custom', '' ); update_post_meta( $directory_id, '_um_sortby_custom_label', '' ); update_post_meta( $directory_id, '_um_sortby_custom_type', '' ); update_post_meta( $directory_id, '_um_sortby_custom_order', '' ); } } } } /** * Quickly adds a field from custom fields. * * @param string $global_id * @param int $form_id * @param array $position */ private function add_field_from_list( $global_id, $form_id, $position = array() ) { $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); $field_scope = UM()->builtin()->saved_fields; if ( ! isset( $fields[ $global_id ] ) ) { $count = 1; if ( ! empty( $fields ) ) { $count = count( $fields ) + 1; } $fields[ $global_id ] = $field_scope[ $global_id ]; $fields[ $global_id ]['position'] = $count; // Set position. if ( $position ) { foreach ( $position as $key => $val ) { $fields[ $global_id ][ $key ] = $val; } } // add field to form UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); } } /** * Quickly adds a field from pre-defined fields. * * @param string $global_id * @param int $form_id * @param array $position */ private function add_field_from_predefined( $global_id, $form_id, $position = array() ) { $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); if ( empty( $fields ) || ! is_array( $fields ) ) { $fields = array(); } if ( ! isset( $fields[ $global_id ] ) ) { $field_scope = UM()->builtin()->predefined_fields; $count = 1; if ( ! empty( $fields ) ) { $count = count( $fields ) + 1; } $fields[ $global_id ] = $field_scope[ $global_id ]; $fields[ $global_id ]['position'] = $count; // Set position. if ( $position ) { foreach ( $position as $key => $val ) { $fields[ $global_id ][ $key ] = $val; } } // add field to form UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); } } /** * Duplicates a field by meta key. * * @param string $id * @param int $form_id */ private function duplicate_field( $id, $form_id ) { $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); $all_fields = UM()->builtin()->saved_fields; $inc = count( $fields ) + 1; $duplicate = $fields[ $id ]; $new_metakey = $id . '_' . $inc; $new_title = $fields[ $id ]['title'] . ' #' . $inc; $new_position = $inc; $duplicate['title'] = $new_title; $duplicate['metakey'] = $new_metakey; $duplicate['position'] = $new_position; $fields[ $new_metakey ] = $duplicate; $all_fields[ $new_metakey ] = $duplicate; // Not global attributes. unset( $all_fields[ $new_metakey ]['in_row'], $all_fields[ $new_metakey ]['in_sub_row'], $all_fields[ $new_metakey ]['in_column'], $all_fields[ $new_metakey ]['in_group'], $all_fields[ $new_metakey ]['position'] ); do_action( 'um_add_new_field', $new_metakey, $duplicate ); UM()->query()->update_attr( 'custom_fields', $form_id, $fields ); update_option( 'um_fields', $all_fields ); } /** * Generate aria errors attributes. * * @param bool $is_error * @param string $field_id * * @return string */ public function aria_valid_attributes( $is_error, $field_id, $context = 'error' ) { //$context $attr = ' aria-invalid="false" '; if ( $is_error ) { if ( 'notice' === $context ) { $errormessage_id = 'um-notice-for-' . $field_id; } else { $errormessage_id = 'um-error-for-' . $field_id; } $attr = ' aria-invalid="true" aria-errormessage="' . esc_attr( $errormessage_id ) . '" '; } return $attr; } /** * Print field error. * * @since 2.7.0 Added $input_id attribute. * * @param string $text * @param string $input_id * @param bool $force_show * * @return string */ public function field_error( $text, $input_id, $force_show = false ) { if ( empty( $text ) ) { return ''; } $error_id = 'um-error-for-' . $input_id; if ( $force_show ) { $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; return $output; } if ( isset( $this->set_id ) && UM()->form()->processing === $this->set_id ) { $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } else { $output = ''; } if ( ! UM()->form()->processing ) { $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } return $output; } /** * Print field notice. * * @since 2.7.0 Added $input_id attribute. * * @param string $text * @param string $input_id * @param bool $force_show * * @return string */ public function field_notice( $text, $input_id, $force_show = false ) { if ( empty( $text ) ) { return ''; } $notice_id = 'um-notice-for-' . $input_id; if ( $force_show ) { $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; return $output; } if ( isset( $this->set_id ) && UM()->form()->processing === $this->set_id ) { $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } else { $output = ''; } if ( ! UM()->form()->processing ) { $output = '
' . wp_kses( $text, UM()->get_allowed_html( 'templates' ) ) . '
'; } return $output; } /** * Checks if field has a server-side error * * @param string $key * * @return bool */ public function is_error( $key ) { return UM()->form()->has_error( $key ); } /** * Checks if field has a notice * * @param string $key * * @return bool */ public function is_notice( $key ) { return UM()->form()->has_notice( $key ); } /** * Returns field error * * @param string $key * * @return string */ public function show_error( $key ) { if ( empty( UM()->form()->errors ) ) { return ''; } return array_key_exists( $key, UM()->form()->errors ) ? UM()->form()->errors[ $key ] : ''; } /** * Returns field notices * * @param string $key * * @return string */ public function show_notice( $key ) { if ( empty( UM()->form()->notices ) ) { return ''; } return array_key_exists( $key, UM()->form()->notices ) ? UM()->form()->notices[ $key ] : ''; } /** * Display field label. * * @param string $label Field label. * @param string $key Field key. * @param array $data Field data. * * @return string */ public function field_label( $label, $key, $data ) { if ( true === $this->viewing ) { /** * Filters Ultimate Member field label on the Profile form: View mode. * Note: $key it's field metakey. * * @since 2.0.0 * @since 2.8.0 Added $data attribute. * * @hook um_view_label_{$key} * * @param {string} $label Field label. * @param {string} $data Field data. * * @return {string} Field label. * * @example Change first name field label on the Profile form: view mode. * function my_change_first_name_label( $label, $data ) { * $label = 'My label'; * return $label; * } * add_filter( 'um_view_label_first_name', 'my_change_first_name_label', 10, 2 ); */ $label = apply_filters( "um_view_label_{$key}", $label, $data ); } else { /** * Filters Ultimate Member field label on the Profile form: Edit mode. * Note: $key it's field metakey. * * @since 2.0.0 * @since 2.8.0 Added $data attribute. * * @hook um_edit_label_{$key} * * @param {string} $label Field label. * @param {string} $data Field data. * * @return {string} Field label. * * @example Change first name field label on the Profile form: edit mode. * function my_change_first_name_label( $label, $data ) { * $label = 'My label'; * return $label; * } * add_filter( 'um_edit_label_first_name', 'my_change_first_name_label', 10, 2 ); */ $label = apply_filters( "um_edit_label_{$key}", $label, $data ); /** * Filters Ultimate Member field label on the Profile form: Edit mode. * * @since 2.0.0 * * @hook um_edit_label_all_fields * * @param {string} $label Field label. * @param {string} $data Field data. * * @return {string} Field label. * * @example Change first name field label on the Profile form: edit mode. * function my_change_first_name_label( $label, $data ) { * if ( 'first_name' === $data['metakey'] ) { * $label = 'My label'; * } * return $label; * } * add_filter( 'um_edit_label_all_fields', 'my_change_first_name_label', 10, 2 ); */ $label = apply_filters( 'um_edit_label_all_fields', $label, $data ); } $output = null; $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'off' !== $this->field_icons && ( 'label' === $this->field_icons || true === $this->viewing ) ) { $output .= '
'; } $fields_without_metakey = UM()->builtin()->get_fields_without_metakey(); $for_attr = ''; if ( ! in_array( $data['type'], $fields_without_metakey, true ) ) { $for_attr = ' for="' . esc_attr( $key . UM()->form()->form_suffix ) . '"'; } $output .= '' . esc_html__( $label, 'ultimate-member' ); if ( ! $this->viewing && ! empty( $data['required'] ) && UM()->options()->get( 'form_asterisk' ) ) { $output .= '*'; } $output .= ''; if ( ! empty( $data['help'] ) && false === $this->viewing && false === strpos( $key, 'confirm_user_pass' ) ) { if ( ! wp_is_mobile() ) { if ( false === $this->disable_tooltips ) { $output .= ''; } } if ( false !== $this->disable_tooltips || wp_is_mobile() ) { $output .= '' . __( $data['help'], 'ultimate-member' ) . ''; } } $output .= '
'; return $output; } /** * Output field classes. * * @param string $key * @param array $data * @param string $add * * @return string */ public function get_class( $key, $data, $add = null ) { $classes = null; $classes .= 'um-form-field '; if ( $this->is_error( $key ) ) { $classes .= 'um-error '; } else { $classes .= 'valid '; } if ( ! isset( $data['required'] ) ) { $classes .= 'not-required '; } if ( $data['type'] == 'date' ) { $classes .= 'um-datepicker '; } if ( $data['type'] == 'time' ) { $classes .= 'um-timepicker '; } if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && $this->field_icons == 'field' ) { $classes .= 'um-iconed '; } if ( $add ) { $classes .= $add . ' '; } /** * UM hook * * @type filter * @title um_extend_field_classes * @description Change field classes * @input_vars * [{"var":"$classes","type":"string","desc":"Field Classes"}, * {"var":"$key","type":"string","desc":"Field Key"}, * {"var":"$data","type":"array","desc":"Field Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_extend_field_classes', 'function_name', 10, 3 ); * @example * */ $classes = apply_filters( 'um_extend_field_classes', $classes, $key, $data ); return $classes; } /** * Gets field value * * @param string $key * @param boolean $default * @param array $data * * @return mixed */ function field_value( $key, $default = false, $data = null ) { // preview in backend if ( isset( UM()->user()->preview ) && UM()->user()->preview ) { if ( $this->set_mode == 'login' || $this->set_mode == 'register' ) { return ''; } else { $val = um_user( $key ); if ( ! empty( $val ) ) { return $val; } else { return ''; } } } if ( isset( $_SESSION ) && isset( $_SESSION['um_social_profile'][ $key ] ) && isset( $this->set_mode ) && $this->set_mode == 'register' ) { return $_SESSION['um_social_profile'][ $key ]; } $type = ( isset( $data['type'] ) ) ? $data['type'] : ''; // normal state if ( isset( UM()->form()->post_form[ $key ] ) ) { // Show empty value for password fields. if ( 'password' !== $this->set_mode && false !== strpos( $key, 'user_pass' ) ) { return ''; } if ( 'profile' === $this->set_mode ) { if ( ! isset( UM()->form()->post_form['profile_nonce'] ) || false === wp_verify_nonce( UM()->form()->post_form['profile_nonce'], 'um-profile-nonce' . UM()->user()->target_id ) ) { return ''; } } return stripslashes_deep( UM()->form()->post_form[ $key ] ); } elseif ( true === $this->editing && um_user( $key ) ) { // Show empty value for password fields. if ( 'password' === $type || false !== strpos( $key, 'user_pass' ) ) { return ''; } $value = um_user( $key ); /** * UM hook * * @type filter * @title um_edit_{$key}_field_value * @description Change field value on edit by field $key * @input_vars * [{"var":"$value","type":"string","desc":"Field Value"}, * {"var":"$key","type":"string","desc":"Field Key"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_edit_{$key}_field_value', 'function_name', 10, 2 ); * @example * */ $value = apply_filters( "um_edit_{$key}_field_value", $value, $key ); /** * UM hook * * @type filter * @title um_edit_{$type}_field_value * @description Change field value on edit by field $type * @input_vars * [{"var":"$value","type":"string","desc":"Field Value"}, * {"var":"$key","type":"string","desc":"Field Key"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_edit_{$type}_field_value', 'function_name', 10, 2 ); * @example * */ $value = apply_filters( "um_edit_{$type}_field_value", $value, $key ); } elseif ( true === $this->viewing && ( um_user( $key ) || isset( $data['show_anyway'] ) ) ) { return um_filtered_value( $key, $data ); } elseif ( isset( UM()->user()->profile[ $key ] ) ) { $value = UM()->user()->profile[ $key ]; /** * UM hook * * @type filter * @title um_edit_{$key}_field_value * @description Change field value on edit by field $key * @input_vars * [{"var":"$value","type":"string","desc":"Field Value"}, * {"var":"$key","type":"string","desc":"Field Key"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_edit_{$key}_field_value', 'function_name', 10, 2 ); * @example * */ $value = apply_filters( "um_edit_{$key}_field_value", $value, $key ); $value = maybe_unserialize( $value ); } elseif ( $default ) { /** * UM hook * * @type filter * @title um_field_default_value * @description Change field default value * @input_vars * [{"var":"$default","type":"string","desc":"Field Default Value"}, * {"var":"$data","type":"array","desc":"Field Data"}, * {"var":"$type","type":"string","desc":"Field Type"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_field_default_value', 'function_name', 10, 2 ); * @example * */ $default = apply_filters( 'um_field_default_value', $default, $data, $type ); /** * UM hook * * @type filter * @title um_field_{$key}_default_value * @description Change field default value by $key * @input_vars * [{"var":"$default","type":"string","desc":"Field Default Value"}, * {"var":"$data","type":"array","desc":"Field Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_field_{$key}_default_value', 'function_name', 10, 2 ); * @example * */ $default = apply_filters( "um_field_{$key}_default_value", $default, $data ); /** * UM hook * * @type filter * @title um_field_{$type}_default_value * @description Change field default value by $type * @input_vars * [{"var":"$default","type":"string","desc":"Field Default Value"}, * {"var":"$data","type":"array","desc":"Field Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_field_{$type}_default_value', 'function_name', 10, 2 ); * @example * */ $default = apply_filters( "um_field_{$type}_default_value", $default, $data ); } // Default Value for Registration Form and Profile Form editing if ( ! isset( $value ) && ( $this->set_mode == 'register' || true === $this->editing ) ) { /** * UM hook * * @type filter * @title um_edit_{$key}_field_value * @description Change field value on edit by field $key * @input_vars * [{"var":"$value","type":"string","desc":"Field Value"}, * {"var":"$key","type":"string","desc":"Field Key"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_edit_{$key}_field_value', 'function_name', 10, 2 ); * @example * */ $value = apply_filters( "um_edit_{$key}_field_value", $default, $key ); } elseif ( isset( $value ) && is_array( $value ) && ! count( $value ) ) { $value = ''; } elseif ( ! isset( $value ) ) { $value = ''; } /** * UM hook * * @type filter * @title um_field_value * @description Change field value * @input_vars * [{"var":"$value","type":"string","desc":"Field Value"}, * {"var":"$key","type":"string","desc":"Field Key"},, * {"var":"$type","type":"string","desc":"Field Type"} * {"var":"$default","type":"string","desc":"Field Default Value"}, * {"var":"$data","type":"array","desc":"Field Data"}] * @usage add_filter( 'um_field_value', 'function_name', 10, 5 ); */ return apply_filters( 'um_field_value', $value, $default, $key, $type, $data ); } /** * Checks if an option is selected. * * is used by Select, Multiselect and Checkbox fields * * @param string $key * @param string $value * @param array $data * * @return boolean */ public function is_selected( $key, $value, $data ) { global $wpdb; /** * UM hook * * @type filter * @title um_is_selected_filter_key * @description Change is selected filter key * @input_vars * [{"var":"$key","type":"string","desc":"Selected filter key"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_is_selected_filter_key', 'function_name', 10, 1 ); * @example * */ $key = apply_filters( 'um_is_selected_filter_key', $key ); if ( isset( UM()->form()->post_form[ $key ] ) ) { if ( is_array( UM()->form()->post_form[ $key ] ) ) { if ( in_array( $value, UM()->form()->post_form[ $key ] ) ) { return true; } $stripslashed = array_map( 'stripslashes', UM()->form()->post_form[ $key ] ); if ( in_array( $value, $stripslashed ) ) { return true; } if ( in_array( html_entity_decode( $value ), UM()->form()->post_form[ $key ] ) ) { return true; } } else { if ( $value == UM()->form()->post_form[ $key ] ) { return true; } } } else { $field_value = um_user( $key ); if ( ! $field_value ) { $field_value = 0; } if ( $field_value == 0 && $value == '0' ) { $value = (int) $value; } if ( strstr( $key, 'role_' ) || 'role' === $key ) { $role_keys = get_option( 'um_roles', array() ); if ( ! empty( $role_keys ) ) { $field_value = UM()->roles()->get_editable_priority_user_role( um_user( 'ID' ) ); if ( ! empty( $field_value ) ) { $field_value = strtolower( $field_value ); if ( in_array( $field_value, $role_keys, true ) ) { $field_value = 'um_' . $field_value; } } } } /** * UM hook * * @type filter * @title um_is_selected_filter_value * @description Change is selected filter value * @input_vars * [{"var":"$value","type":"string","desc":"Selected filter value"}, * {"var":"$key","type":"string","desc":"Selected filter key"}, * {"var":"$value","type":"string","desc":"Selected filter value"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_is_selected_filter_value', 'function_name', 10, 2 ); * @example * */ $field_value = apply_filters( 'um_is_selected_filter_value', $field_value, $key, $value ); /** * UM hook * * @type filter * @title um_is_selected_filter_data * @description Change is selected filter data * @input_vars * [{"var":"$data","type":"array","desc":"Selected filter value"}, * {"var":"$key","type":"string","desc":"Selected filter key"}, * {"var":"$value","type":"string","desc":"Selected filter value"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_is_selected_filter_data', 'function_name', 10, 3 ); * @example * */ $data = apply_filters( 'um_is_selected_filter_data', $data, $key, $field_value ); if ( false === $this->editing || 'custom' === $this->set_mode ) { // show default on register screen if there is default if ( isset( $data['default'] ) ) { if ( ! is_array( $data['default'] ) && $data['default'] === $value ) { return true; } if ( is_array( $data['default'] ) && in_array( $value, $data['default'] ) ) { return true; } if ( is_array( $data['default'] ) && array_intersect( $data['options'], $data['default'] ) ) { return true; } // default value with comma if ( is_string( $data['default'] ) && strstr( $data['default'], ',' ) ) { $choices = array_map( 'trim', explode( ',', $data['default'] ) ); if ( in_array( $value, $choices ) ) { return true; } } } } else { if ( $field_value && is_array( $field_value ) && ( in_array( $value, $field_value ) || in_array( html_entity_decode( $value ), $field_value ) ) ) { return true; } if ( $field_value == 0 && ! is_array( $field_value ) && $field_value === $value ) { return true; } if ( $field_value && ! is_array( $field_value ) && $field_value == $value ) { return true; } if ( $field_value && ! is_array( $field_value ) && html_entity_decode( $field_value ) == html_entity_decode( $value ) ) { return true; } // show default on edit screen if there isn't meta row in usermeta table $direct_db_value = $wpdb->get_var( $wpdb->prepare( "SELECT ISNULL( meta_value ) FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s", um_user( 'ID' ), $key ) ); if ( ! isset( $direct_db_value ) && isset( $data['default'] ) ) { if ( ! is_array( $data['default'] ) && strstr( $data['default'], ', ' ) ) { $data['default'] = explode( ', ', $data['default'] ); } if ( ! is_array( $data['default'] ) && $data['default'] === $value ) { return true; } if ( is_array( $data['default'] ) && in_array( $value, $data['default'] ) ) { return true; } } } } return false; } /** * Checks if a radio button is selected * * @param string $key * @param string $value * @param array $data * * @return boolean */ function is_radio_checked( $key, $value, $data ) { global $wpdb; if ( isset( UM()->form()->post_form[ $key ] ) ) { if ( is_array( UM()->form()->post_form[ $key ] ) && in_array( $value, UM()->form()->post_form[ $key ] ) ) { return true; } elseif ( $value == UM()->form()->post_form[ $key ] ) { return true; } } else { if ( true === $this->editing && 'custom' !== $this->set_mode ) { if ( um_user( $key ) ) { $um_user_value = um_user( $key ); if ( strstr( $key, 'role_' ) || $key == 'role' ) { $um_user_value = strtolower( UM()->roles()->get_editable_priority_user_role( um_user( 'ID' ) ) ); $role_keys = get_option( 'um_roles', array() ); if ( ! empty( $role_keys ) ) { if ( in_array( $um_user_value, $role_keys ) ) { $um_user_value = 'um_' . $um_user_value; } } } if ( $um_user_value == $value ) { return true; } if ( is_array( $um_user_value ) && in_array( $value, $um_user_value ) ) { return true; } if ( is_array( $um_user_value ) ) { foreach ( $um_user_value as $u ) { if ( $u == html_entity_decode( $value ) ) { return true; } } } } else { // show default on edit screen if there isn't meta row in usermeta table $direct_db_value = $wpdb->get_var( $wpdb->prepare( "SELECT ISNULL( meta_value ) FROM {$wpdb->usermeta} WHERE user_id = %d AND meta_key = %s", um_user( 'ID' ), $key ) ); if ( ! isset( $direct_db_value ) && isset( $data['default'] ) && $data['default'] == $value ) { return true; } } } else { if ( isset( $data['default'] ) && $data['default'] == $value ) { return true; } } } return false; } /** * Get field icon * * @param string $key * * @return string */ function get_field_icon( $key ) { $fields = UM()->builtin()->all_user_fields; if ( isset( $fields[ $key ]['icon'] ) ) { return $fields[ $key ]['icon']; } return ''; } /** * Getting the blacklist of the functions that cannot be used as callback. * All internal PHP functions are insecure for using inside callback functions. * * @return array */ public function dropdown_options_source_blacklist() { $list = get_defined_functions(); $blacklist = ! empty( $list['internal'] ) ? $list['internal'] : array(); $blacklist = apply_filters( 'um_dropdown_options_source_blacklist', $blacklist ); return $blacklist; } /** * Is the dropdown source callback function blacklisted? * * @param string $source Function name * * @return bool */ public function is_source_blacklisted( $source ) { // avoid using different letter case for bypass the blacklist e.g. phpInfo // avoid using root namespace for bypass the blacklist e.g. \phpinfo $source = trim( strtolower( $source ), '\\' ); if ( in_array( $source, $this->dropdown_options_source_blacklist(), true ) ) { return true; } return false; } /** * Gets selected option value from a callback function * * @param string $value * @param array $data * @param string $type * * @return string */ function get_option_value_from_callback( $value, $data, $type ) { if ( in_array( $type, array( 'select', 'multiselect' ) ) && ! empty( $data['custom_dropdown_options_source'] ) ) { if ( $this->is_source_blacklisted( $data['custom_dropdown_options_source'] ) ) { return $value; } $has_custom_source = apply_filters( "um_has_dropdown_options_source__{$data['metakey']}", false ); if ( $has_custom_source ) { /** This filter is documented in includes/core/class-fields.php */ $opts = apply_filters( "um_get_field__{$data['metakey']}", array() ); $arr_options = array_key_exists( 'options', $opts ) ? $opts['options'] : array(); } elseif ( function_exists( $data['custom_dropdown_options_source'] ) ) { if ( isset( $data['parent_dropdown_relationship'] ) ) { $_POST['parent_option_name'] = $data['parent_dropdown_relationship']; $_POST['parent_option'] = um_user( $data['parent_dropdown_relationship'] ); $arr_options = call_user_func( $data['custom_dropdown_options_source'], $data['parent_dropdown_relationship'] ); } else { $arr_options = call_user_func( $data['custom_dropdown_options_source'] ); } } if ( $has_custom_source || function_exists( $data['custom_dropdown_options_source'] ) ) { if ( $type == 'select' ) { if ( ! empty( $arr_options[ $value ] ) ) { return $arr_options[ $value ]; } elseif ( ! empty( $data['default'] ) && empty( $arr_options[ $value ] ) ) { return $arr_options[ $data['default'] ]; } else { return ''; } } elseif ( $type == 'multiselect' ) { if ( is_array( $value ) ) { $values = $value; } else { $values = explode( ', ', $value ); } $arr_paired_options = array(); foreach ( $values as $option ) { if ( isset( $arr_options[ $option ] ) ) { $arr_paired_options[] = $arr_options[ $option ]; } } return implode( ', ', $arr_paired_options ); } } } return $value; } /** * Get select options from a callback function * * @param array $data * @param string $type * * @return array $arr_options */ public function get_options_from_callback( $data, $type ) { $arr_options = array(); if ( ! empty( $data['custom_dropdown_options_source'] ) && in_array( $type, array( 'select', 'multiselect' ), true ) ) { if ( $this->is_source_blacklisted( $data['custom_dropdown_options_source'] ) ) { return $arr_options; } if ( function_exists( $data['custom_dropdown_options_source'] ) ) { if ( isset( $data['parent_dropdown_relationship'] ) ) { $arr_options = call_user_func( $data['custom_dropdown_options_source'], $data['parent_dropdown_relationship'] ); } else { $arr_options = call_user_func( $data['custom_dropdown_options_source'] ); } } } return $arr_options; } /** * Get field type * * @param string $key * * @return string */ function get_field_type( $key ) { $fields = UM()->builtin()->all_user_fields; if ( isset( $fields[ $key ]['type'] ) ) { return $fields[ $key ]['type']; } return ''; } /** * Get field label * * @param string $key Field meta key * * @return string */ public function get_label( $key ) { $label = ''; $fields = UM()->builtin()->all_user_fields; $field_data = array_key_exists( $key, $fields ) ? $fields[ $key ] : array(); if ( array_key_exists( 'label', $field_data ) ) { $label = stripslashes( $field_data['label'] ); } if ( empty( $label ) && array_key_exists( 'title', $field_data ) ) { $label = stripslashes( $field_data['title'] ); } /** * Filters Ultimate Member field label. * * @since 2.0.30 * @since 2.8.0 Added $data attribute. * * @hook um_change_field_label * * @param {string} $label Field label. * @param {string} $key Field key. * @param {array} $data Field data. * * @return {string} Field label. * * @example Change first name field label. * function my_change_field_label( $label, $key, $data ) { * if ( 'first_name' === $key ) { * $label = 'My label'; * } * return $label; * } * add_filter( 'um_change_field_label', 'my_change_field_label', 10, 3 ); */ $label = apply_filters( 'um_change_field_label', $label, $key, $field_data ); return sprintf( __( '%s', 'ultimate-member' ), $label ); } /** * Get field title * * @param string $key * * @return string */ function get_field_title( $key ) { $fields = UM()->builtin()->all_user_fields; if ( isset( $fields[ $key ]['title'] ) ) { return $fields[ $key ]['title']; } if ( isset( $fields[ $key ]['label'] ) ) { return $fields[ $key ]['label']; } return __( 'Custom Field', 'ultimate-member' ); } /** * Get form fields * * @var null|int $form_id * * @return array */ public function get_fields() { if ( empty( $this->set_id ) ) { return array(); } if ( empty( $this->fields[ $this->set_id ] ) ) { /** * Filters the form fields. * * @param {array} $fields Form fields. * @param {int} $form_id Form ID. Since 2.6.11 * * @return {array} Form fields. * * @since 1.3.x * @since 2.6.11 Added Form ID attribute. * @hook um_get_form_fields * * @example Extend form fields. * function my_form_fields( $fields, $form_id ) { * // your code here * return $fields; * } * add_filter( 'um_get_form_fields', 'my_form_fields', 10, 2 ); */ $this->fields[ $this->set_id ] = apply_filters( 'um_get_form_fields', array(), $this->set_id ); } return $this->fields[ $this->set_id ]; } /** * Get specific field * * @param $key * * @return mixed * @throws Exception */ public function get_field( $key ) { $fields = $this->get_fields(); if ( isset( $fields ) && is_array( $fields ) && isset( $fields[ $key ] ) ) { $array = $fields[ $key ]; } else { if ( ! isset( UM()->builtin()->predefined_fields[ $key ] ) && ! isset( UM()->builtin()->all_user_fields[ $key ] ) ) { return ''; } $array = ( isset( UM()->builtin()->predefined_fields[ $key ] ) ) ? UM()->builtin()->predefined_fields[ $key ] : UM()->builtin()->all_user_fields[ $key ]; } if ( empty( $array['type'] ) ) { return ''; } $array['classes'] = null; if ( ! isset( $array['placeholder'] ) ) { $array['placeholder'] = null; } if ( ! isset( $array['required'] ) ) { $array['required'] = null; } if ( ! isset( $array['validate'] ) ) { $array['validate'] = null; } if ( ! isset( $array['default'] ) ) { $array['default'] = null; } if ( isset( $array['conditions'] ) && is_array( $array['conditions'] ) && false === $this->viewing ) { $array['conditional'] = ''; foreach ( $array['conditions'] as $cond_id => $cond ) { $array['conditional'] .= ' data-cond-' . $cond_id . '-action="' . esc_attr( $cond[0] ) . '" data-cond-' . $cond_id . '-field="' . esc_attr( $cond[1] ) . '" data-cond-' . $cond_id . '-operator="' . esc_attr( $cond[2] ) . '" data-cond-' . $cond_id . '-value="' . esc_attr( $cond[3] ) . '"'; } $array['classes'] .= ' um-is-conditional'; } else { $array['conditional'] = null; } $fields_without_metakey = UM()->builtin()->get_fields_without_metakey(); if ( ! in_array( $array['type'], $fields_without_metakey, true ) ) { $array['classes'] .= ' um-field-' . esc_attr( $key ); } $array['classes'] .= ' um-field-' . esc_attr( $array['type'] ); $array['classes'] .= ' um-field-type_' . esc_attr( $array['type'] ); switch ( $array['type'] ) { case 'googlemap': case 'youtube_video': case 'vimeo_video': case 'soundcloud_track': case 'spotify': $array['disabled'] = ''; $array['input'] = 'text'; break; case 'text': $array['disabled'] = ''; if ( 'user_login' === $key && 'account' === $this->set_mode ) { $array['disabled'] = ' disabled="disabled" '; } $array['input'] = 'text'; break; case 'tel': $array['input'] = 'tel'; break; case 'password': $array['input'] = 'password'; break; case 'number': $array['disabled'] = ''; break; case 'url': $array['input'] = 'text'; break; case 'oembed': $array['input'] = 'url'; break; case 'date': $array['input'] = 'text'; if ( ! isset( $array['format'] ) ) { $array['format'] = 'j M Y'; } switch ( $array['format'] ) { case 'j M Y': $js_format = 'd mmm yyyy'; break; case 'j F Y': $js_format = 'd mmmm yyyy'; break; case 'M j Y': $js_format = 'mmm d yyyy'; break; case 'F j Y': $js_format = 'mmmm d yyyy'; break; } $array['js_format'] = $js_format; if ( ! isset( $array['range'] ) ) { $array['range'] = 'years'; } if ( ! isset( $array['years'] ) ) { $array['years'] = 100; } if ( ! isset( $array['years_x'] ) ) { $array['years_x'] = 'past'; } if ( ! isset( $array['disabled_weekdays'] ) ) { $array['disabled_weekdays'] = ''; } if ( ! empty( $array['disabled_weekdays'] ) ) { $array['disabled_weekdays'] = '[' . implode( ',', $array['disabled_weekdays'] ) . ']'; } // When date range is strictly defined if ( $array['range'] == 'date_range' ) { $array['date_min'] = str_replace( '/', ',', $array['range_start'] ); $array['date_max'] = str_replace( '/', ',', $array['range_end'] ); } else { if ( $array['years_x'] == 'past' ) { $date = new \DateTime( date( 'Y-n-d' ) ); $past = $date->modify( '-' . $array['years'] . ' years' ); $past = $date->format( 'Y,n,d' ); $array['date_min'] = $past; $array['date_max'] = date( 'Y,n,d' ); } elseif ( $array['years_x'] == 'future' ) { $date = new \DateTime( date( 'Y-n-d' ) ); $future = $date->modify( '+' . $array['years'] . ' years' ); $future = $date->format( 'Y,n,d' ); $array['date_min'] = date( 'Y,n,d' ); $array['date_max'] = $future; } else { $date = new \DateTime( date( 'Y-n-d' ) ); $date_f = new \DateTime( date( 'Y-n-d' ) ); $past = $date->modify( '-' . ( $array['years'] / 2 ) . ' years' ); $past = $date->format( 'Y,n,d' ); $future = $date_f->modify( '+' . ( $array['years'] / 2 ) . ' years' ); $future = $date_f->format( 'Y,n,d' ); $array['date_min'] = $past; $array['date_max'] = $future; } } break; case 'time': $array['input'] = 'text'; if ( ! isset( $array['format'] ) ) { $array['format'] = 'g:i a'; } switch ( $array['format'] ) { case 'g:i a': $js_format = 'h:i a'; break; case 'g:i A': $js_format = 'h:i A'; break; case 'H:i': $js_format = 'HH:i'; break; } $array['js_format'] = $js_format; if ( ! isset( $array['intervals'] ) ) { $array['intervals'] = 60; } break; case 'textarea': if ( ! isset( $array['height'] ) ) { $array['height'] = '100px'; } break; case 'rating': if ( ! isset( $array['number'] ) ) { $array['number'] = 5; } break; case 'spacing': if ( ! isset( $array['spacing'] ) ) { $array['spacing'] = '20px'; } break; case 'divider': if ( isset( $array['width'] ) ) { $array['borderwidth'] = $array['width']; } else { $array['borderwidth'] = 4; } if ( isset( $array['color'] ) ) { $array['bordercolor'] = $array['color']; } else { $array['bordercolor'] = '#eee'; } if ( isset( $array['style'] ) ) { $array['borderstyle'] = $array['style']; } else { $array['borderstyle'] = 'solid'; } if ( ! isset( $array['divider_text'] ) ) { $array['divider_text'] = ''; } break; case 'image': if ( ! isset( $array['crop'] ) ) { $array['crop'] = 0; } if ( $array['crop'] == 0 ) { $array['crop_data'] = 0; } elseif ( $array['crop'] == 1 ) { $array['crop_data'] = 'square'; } elseif ( $array['crop'] == 2 ) { $array['crop_data'] = 'cover'; } else { $array['crop_data'] = 'user'; } if ( ! isset( $array['modal_size'] ) ) { $array['modal_size'] = 'normal'; } if ( $array['crop'] > 0 ) { $array['crop_class'] = 'crop'; } else { $array['crop_class'] = ''; } if ( ! isset( $array['ratio'] ) ) { $array['ratio'] = 1.0; } if ( ! isset( $array['min_width'] ) ) { $array['min_width'] = ''; } if ( ! isset( $array['min_height'] ) ) { $array['min_height'] = ''; } if ( $array['min_width'] == '' && $array['crop'] == 1 ) { $array['min_width'] = 600; } if ( $array['min_height'] == '' && $array['crop'] == 1 ) { $array['min_height'] = 600; } if ( $array['min_width'] == '' && $array['crop'] == 3 ) { $array['min_width'] = 600; } if ( $array['min_height'] == '' && $array['crop'] == 3 ) { $array['min_height'] = 600; } if ( ! isset( $array['invalid_image'] ) ) { $array['invalid_image'] = __( 'Please upload a valid image!', 'ultimate-member' ); } if ( ! isset( $array['allowed_types'] ) ) { $array['allowed_types'] = 'gif,jpg,jpeg,png'; } else { $array['allowed_types'] = implode( ',', $array['allowed_types'] ); } if ( ! isset( $array['upload_text'] ) ) { $array['upload_text'] = ''; } if ( ! isset( $array['button_text'] ) ) { $array['button_text'] = __( 'Upload', 'ultimate-member' ); } if ( ! isset( $array['extension_error'] ) ) { $array['extension_error'] = __( 'Sorry this is not a valid image.', 'ultimate-member' ); } if ( ! isset( $array['max_size_error'] ) ) { $array['max_size_error'] = __( 'This image is too large!', 'ultimate-member' ); } if ( ! isset( $array['min_size_error'] ) ) { $array['min_size_error'] = __( 'This image is too small!', 'ultimate-member' ); } if ( ! isset( $array['max_files_error'] ) ) { $array['max_files_error'] = __( 'You can only upload one image', 'ultimate-member' ); } if ( empty( $array['max_size'] ) ) { $array['max_size'] = 999999999; } if ( ! isset( $array['upload_help_text'] ) ) { $array['upload_help_text'] = ''; } if ( ! isset( $array['icon'] ) ) { $array['icon'] = ''; } break; case 'file': if ( ! isset( $array['modal_size'] ) ) { $array['modal_size'] = 'normal'; } if ( ! isset( $array['allowed_types'] ) ) { $array['allowed_types'] = 'pdf,txt'; } else { $array['allowed_types'] = implode( ',', $array['allowed_types'] ); } if ( ! isset( $array['upload_text'] ) ) { $array['upload_text'] = ''; } if ( ! isset( $array['button_text'] ) ) { $array['button_text'] = __( 'Upload', 'ultimate-member' ); } if ( ! isset( $array['extension_error'] ) ) { $array['extension_error'] = __( 'Sorry this is not a valid file.', 'ultimate-member' ); } if ( ! isset( $array['max_size_error'] ) ) { $array['max_size_error'] = __( 'This file is too large!', 'ultimate-member' ); } if ( ! isset( $array['min_size_error'] ) ) { $array['min_size_error'] = __( 'This file is too small!', 'ultimate-member' ); } if ( ! isset( $array['max_files_error'] ) ) { $array['max_files_error'] = __( 'You can only upload one file', 'ultimate-member' ); } if ( empty( $array['max_size'] ) ) { $array['max_size'] = 999999999; } if ( ! isset( $array['upload_help_text'] ) ) { $array['upload_help_text'] = ''; } if ( ! isset( $array['icon'] ) ) { $array['icon'] = ''; } break; case 'select': break; case 'multiselect': break; case 'group': if ( ! isset( $array['max_entries'] ) ) { $array['max_entries'] = 0; } break; } if ( ! isset( $array['visibility'] ) ) { $array['visibility'] = 'all'; } /** * Filters the field data by the field type. Where $type is the field's type. * * @param {array} $field_data Field data. * * @return {array} Field data. * * @since 2.0 First hook version applied only for the date type. * @since 2.6.8 Added support for all field type. * * @hook um_get_field_{$type} * * @example Disable all date-type fields. * function my_custom_get_field_date( $field_data ) { * $field_data['disabled'] = ' disabled="disabled" '; * return $field_data; * } * add_filter( 'um_get_field_date', 'my_custom_get_field_date' ); */ $array = apply_filters( "um_get_field_{$array['type']}", $array ); /** * Filters the field data by the metakey. Where $key is the field's metakey. * * @param {array} $field_data Field data. * * @return {array} Field data. * * @since 1.3.x * @hook um_get_field__{$key} * * @example Disable 'first_name' field. * function my_custom_disable_first_name( $field_data ) { * $field_data['disabled'] = ' disabled="disabled" '; * return $field_data; * } * add_filter( 'um_get_field__first_name', 'my_custom_disable_first_name' ); */ return apply_filters( "um_get_field__{$key}", $array ); } /** * @param $option_value * * @return mixed|void */ function filter_field_non_utf8_value( $option_value ) { /** * UM hook * * @type filter * @title um_field_non_utf8_value * @description Change dropdown option text * @input_vars * [{"var":"$value","type":"string","desc":"Option Value"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_field_non_utf8_value', 'function_name', 10, 1 ); * @example * */ return apply_filters( 'um_field_non_utf8_value', $option_value ); } /** * Getting the fields that need to be disabled in edit mode (profile) * * @param bool|int $_um_profile_id * * @return array */ public function get_restricted_fields_for_edit( $_um_profile_id = false ) { static $cache = array(); $cache_key = absint( $_um_profile_id ); if ( array_key_exists( $cache_key, $cache ) ) { return $cache[ $cache_key ]; } // fields that need to be disabled in edit mode (profile) $arr_restricted_fields = array( 'user_email', 'username', 'user_login', 'user_password', '_um_last_login', 'user_registered' ); /** * Filters the form fields that need to be disabled in edit mode (profile). * * @param {array} $fields Form fields. * @param {int} $_um_profile_id User Profile ID. * * @return {array} Form fields. * * @since 2.0 * @hook um_user_profile_restricted_edit_fields * * @example Make user email field editable on the Profile Page. * function my_make_email_editable( $fields, $_um_profile_id ) { * $fields = array_flip( $fields ); * unset( $fields['user_email'] ); * $fields = array_keys( $fields ); * return $fields; * } * add_filter( 'um_user_profile_restricted_edit_fields', 'my_make_email_editable', 10, 2 ); */ $cache[ $cache_key ] = apply_filters( 'um_user_profile_restricted_edit_fields', $arr_restricted_fields, $_um_profile_id ); return $cache[ $cache_key ]; } /** * Gets a field in 'input mode' * * @param string $key * @param array $data * @param bool $rule * @param array $args * * @return string|null * @throws Exception */ public function edit_field( $key, $data, $rule = false, $args = array() ) { global $_um_profile_id; if ( ! empty( $data['is_block'] ) ) { $form_suffix = ''; } else { $form_suffix = UM()->form()->form_suffix; } $output = ''; if ( empty( $_um_profile_id ) ) { $_um_profile_id = um_user( 'ID' ); } if ( ! empty( $data['is_block'] ) && ! is_user_logged_in() ) { $_um_profile_id = 0; } // Get whole field data. if ( isset( $data ) && is_array( $data ) ) { $origin_data = $this->get_field( $key ); if ( is_array( $origin_data ) ) { // Merge data passed with original field data. $data = array_merge( $origin_data, $data ); } } if ( ! isset( $data['type'] ) ) { return ''; } $type = $data['type']; $disabled = ''; if ( isset( $data['disabled'] ) ) { $disabled = $data['disabled']; } if ( isset( $data['in_group'] ) && '' !== $data['in_group'] && 'group' !== $rule ) { return ''; } // forbidden in edit mode? 'edit_forbidden' - it's field attribute predefined in the field data in code if ( isset( $data['edit_forbidden'] ) ) { return ''; } // required option? 'required_opt' - it's field attribute predefined in the field data in code if ( isset( $data['required_opt'] ) ) { $opt = $data['required_opt']; if ( UM()->options()->get( $opt[0] ) !== $opt[1] ) { return ''; } } // required user permission 'required_perm' - it's field attribute predefined in the field data in code if ( isset( $data['required_perm'] ) && ! UM()->roles()->um_user_can( $data['required_perm'] ) ) { return ''; } // fields that need to be disabled in edit mode (profile) (email, username, etc.) $arr_restricted_fields = $this->get_restricted_fields_for_edit( $_um_profile_id ); if ( true === $this->editing && 'profile' === $this->set_mode && in_array( $key, $arr_restricted_fields, true ) ) { return ''; } if ( 'register' !== $this->set_mode && array_key_exists( 'visibility', $data ) && 'view' === $data['visibility'] ) { return ''; } if ( ! um_can_view_field( $data ) ) { return ''; } um_fetch_user( $_um_profile_id ); // Stop return empty values build field attributes: if ( 'register' === $this->set_mode && array_key_exists( 'visibility', $data ) && 'view' === $data['visibility'] ) { um_fetch_user( get_current_user_id() ); if ( ! um_user( 'can_edit_everyone' ) ) { $disabled = ' disabled="disabled" '; } um_fetch_user( $_um_profile_id ); if ( isset( $data['public'] ) && '-2' === $data['public'] && $data['roles'] ) { $current_user_roles = um_user( 'roles' ); if ( ! empty( $current_user_roles ) && count( array_intersect( $current_user_roles, $data['roles'] ) ) > 0 ) { $disabled = ''; } } } if ( true === $this->editing && 'profile' === $this->set_mode ) { if ( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { // It's for a legacy case `array_key_exists( 'editable', $data )`. if ( array_key_exists( 'editable', $data ) && empty( $data['editable'] ) ) { $disabled = ' disabled="disabled" '; } } } /** * Filters a field disabled attribute. * * @since 2.0 * @hook um_is_field_disabled * * @param {string} $disabled Disable global CSS. * @param {array} $data Field data. * * @return {string} Set string to ' disabled="disabled" ' to make a field disabled. * * @example Make a field disabled on the edit mode. * function my_is_field_disabled( $disabled, $data ) { * $disabled = ' disabled="disabled" '; * return $disabled; * } * add_filter( 'um_is_field_disabled', 'my_is_field_disabled', 10, 2 ); */ $disabled = apply_filters( 'um_is_field_disabled', $disabled, $data ); $autocomplete = array_key_exists( 'autocomplete', $data ) ? $data['autocomplete'] : 'off'; $classes = ''; if ( array_key_exists( 'classes', $data ) ) { $classes = explode( ' ', $data['classes'] ); } um_fetch_user( $_um_profile_id ); $input = array_key_exists( 'input', $data ) ? $data['input'] : 'text'; $default = array_key_exists( 'default', $data ) ? $data['default'] : false; $validate = array_key_exists( 'validate', $data ) ? $data['validate'] : ''; $placeholder = array_key_exists( 'placeholder', $data ) ? $data['placeholder'] : ''; $conditional = ''; if ( ! empty( $data['conditional'] ) ) { $conditional = $data['conditional']; } /** * Filters a field type on the edit mode. * * @since 1.3.x * @hook um_hook_for_field_{$type} * * @param {string} $type Field Type. * * @return {string} Field Type. * * @example Change a field type. * function my_field_type( $type ) { * // your code here * return $type; * } * add_filter( 'um_hook_for_field_{$type}', 'my_field_type', 10, 1 ); */ $type = apply_filters( "um_hook_for_field_{$type}", $type ); switch ( $type ) { case 'textarea': case 'multiselect': $field_id = $key; $field_name = $key; $field_value = $this->field_value( $key, $default, $data ); break; case 'select': case 'radio': $form_key = str_replace( array( 'role_select', 'role_radio' ), 'role', $key ); $field_id = $form_key; break; default: $field_id = ''; break; } /** * Filters change core id not allowed duplicate. * * @since 2.0.13 * @hook um_completeness_field_id * * @param {string} $field_id Field id. * @param {array} $data Field Data. * @param {array} $args Optional field arguments. * * @return {string} Field id. * * @example Change field core id. * function function_name( $field_id, $data, $args ) { * // your code here * return $field_id; * } * add_filter( 'um_completeness_field_id', 'function_name', 10, 3 ); */ $field_id = apply_filters( 'um_completeness_field_id', $field_id, $data, $args ); /* Begin by field type */ switch ( $type ) { // Default case for integration. default: $mode = isset( $this->set_mode ) ? $this->set_mode : 'no_mode'; /** * Filters change field html by $mode and field $type * * @since 1.3.x * @hook um_edit_field_{$mode}_{$type} * * @param {string} $output Field HTML. * @param {array} $data Field Data. * * @return {string} Field HTML. * * @example Change field html by $mode and field $type. * function my_edit_field_html( $output, $data ) { * // your code here * return $output; * } * add_filter( 'um_edit_field_{$mode}_{$type}', 'my_edit_field_html', 10, 2 ); */ $output .= apply_filters( "um_edit_field_{$mode}_{$type}", $output, $data ); break; /* Other fields */ case 'googlemap': case 'youtube_video': case 'vimeo_video': case 'spotify': case 'soundcloud_track': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; if ( ! empty( $disabled ) ) { $output .= $this->disabled_hidden_field( $field_name, $field_value ); } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Text and Tel */ case 'text': case 'tel': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; if ( ! empty( $disabled ) ) { $output .= $this->disabled_hidden_field( $field_name, $field_value ); } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Number */ case 'number': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $number_limit = ''; if ( isset( $data['min'] ) ) { $number_limit .= ' min="' . esc_attr( $data['min'] ) . '" '; } if ( isset( $data['max'] ) ) { $number_limit .= ' max="' . esc_attr( $data['max'] ) . '" '; } $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Password */ case 'password': $original_key = $key; if ( 'single_user_password' === $key ) { $key = $original_key; $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); if ( UM()->options()->get( 'toggle_password' ) ) { $output .= '
aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; } else { $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; } else { if ( ( 'account' === $this->set_mode || um_is_core_page( 'account' ) ) && UM()->account()->current_password_is_required( 'password' ) ) { $key = 'current_' . $original_key; $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( __( 'Current Password', 'ultimate-member' ), $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); if ( UM()->options()->get( 'toggle_password' ) ) { $output .= '
aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; } else { $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= ''; } $key = $original_key; $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( ( 'account' === $this->set_mode && um_is_core_page( 'account' ) ) || ( 'password' === $this->set_mode && um_is_core_page( 'password-reset' ) ) ) { $output .= $this->field_label( __( 'New Password', 'ultimate-member' ), $key, $data ); } elseif ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $name = $key . $form_suffix; if ( 'password' === $this->set_mode && um_is_core_page( 'password-reset' ) ) { $name = $key; } $field_value = $this->field_value( $key, $default, $data ); if ( UM()->options()->get( 'toggle_password' ) ) { $output .= '
aria_valid_attributes( $this->is_error( $key ), $name ) . '/>
'; } else { $output .= 'aria_valid_attributes( $this->is_error( $key ), $name ) . '/>
'; } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $name ); } $output .= ''; if ( 'login' !== $this->set_mode && ! empty( $data['force_confirm_pass'] ) ) { $key = 'confirm_' . $original_key; $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( ! empty( $data['label_confirm_pass'] ) ) { $label_confirm_pass = __( $data['label_confirm_pass'], 'ultimate-member' ); $output .= $this->field_label( $label_confirm_pass, $key, $data ); } elseif ( isset( $data['label'] ) ) { $data['label'] = __( $data['label'], 'ultimate-member' ); // translators: %s: label. $output .= $this->field_label( sprintf( __( 'Confirm %s', 'ultimate-member' ), $data['label'] ), $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $name = $key . $form_suffix; if ( 'password' === $this->set_mode && um_is_core_page( 'password-reset' ) ) { $name = $key; } if ( ! empty( $data['label_confirm_pass'] ) ) { $placeholder = __( $data['label_confirm_pass'], 'ultimate-member' ); } elseif ( ! empty( $placeholder ) && ! isset( $data['label'] ) ) { // translators: %s: placeholder. $placeholder = sprintf( __( 'Confirm %s', 'ultimate-member' ), $placeholder ); } elseif ( isset( $data['label'] ) ) { // translators: %s: label. $placeholder = sprintf( __( 'Confirm %s', 'ultimate-member' ), $data['label'] ); } if ( UM()->options()->get( 'toggle_password' ) ) { $output .= '
aria_valid_attributes( $this->is_error( $key ), $name ) . '/>
'; } else { $output .= 'aria_valid_attributes( $this->is_error( $key ), $name ) . '/>'; } $output .= '
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $name ); } $output .= '
'; } } break; /* URL */ case 'oembed': case 'url': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Date */ case 'date': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } // Normalise date format. $value = $this->field_value( $key, $default, $data ); if ( $value ) { // numeric (either unix or YYYYMMDD). ACF uses Ymd format of date inside the meta tables. if ( is_numeric( $value ) && strlen( $value ) !== 8 ) { $unixtimestamp = $value; } else { $unixtimestamp = strtotime( $value ); } // Ultimate Member date field stores the date in metatable in the format Y/m/d. Convert to it before echo. $value = date( 'Y/m/d', $unixtimestamp ); } $field_name = $key . $form_suffix; $disabled_weekdays = ''; if ( isset( $data['disabled_weekdays'] ) && is_array( $data['disabled_weekdays'] ) ) { $disabled_weekdays = '[' . implode( ',', $data['disabled_weekdays'] ) . ']'; } $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Time */ case 'time': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $output .= '
'; } $field_name = $key . $form_suffix; $field_value = $this->field_value( $key, $default, $data ); $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Row */ case 'row': $output .= ''; break; /* Textarea */ case 'textarea': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $field_id = $key; $field_name = $key; $field_value = $this->field_value( $key, $default, $data ); $bio_key = UM()->profile()->get_show_bio_key( $this->global_args ); $output .= '
'; if ( ! empty( $data['html'] ) && $bio_key !== $key ) { $textarea_settings = array( 'media_buttons' => false, 'wpautop' => false, 'editor_class' => $this->get_class( $key, $data ), 'editor_height' => absint( $data['height'] ), 'tinymce' => array( 'toolbar1' => 'formatselect,bullist,numlist,bold,italic,underline,forecolor,blockquote,hr,removeformat,link,unlink,undo,redo', 'toolbar2' => '', ), ); if ( ! empty( $disabled ) ) { $textarea_settings['tinymce']['readonly'] = true; } /** * Filters WP Editor options for textarea init. * * @since 1.3.x * @hook um_form_fields_textarea_settings * * @param {array} $textarea_settings WP Editor settings. * @param {array} $data Field data. Since 2.6.5 * * @return {array} WP Editor settings. * * @example Change WP Editor options. * function function_name( $textarea_settings, $data ) { * // your code here * return $textarea_settings; * } * add_filter( 'um_form_fields_textarea_settings', 'function_name', 10, 2 ); */ $textarea_settings = apply_filters( 'um_form_fields_textarea_settings', $textarea_settings, $data ); $field_value = empty( $field_value ) ? '' : $field_value; // turn on the output buffer ob_start(); // echo the editor to the buffer wp_editor( $field_value, $key, $textarea_settings ); // Add the contents of the buffer to the output variable. $output .= ob_get_clean(); $output .= '
' . esc_html( $placeholder ) . ''; } else { // User 'description' field uses `'; } $output .= '
'; if ( ! empty( $disabled ) ) { $output .= $this->disabled_hidden_field( $field_name, $field_value ); } if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Rating */ case 'rating': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; $output .= '
aria_valid_attributes( $this->is_error( $key ), $key ) . '>
'; $output .= '
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $key ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $key ); } $output .= '
'; break; /* Gap/Space */ case 'spacing': $field_style = array(); if ( array_key_exists( 'spacing', $data ) ) { $field_style = array( 'height' => $data['spacing'] ); } $output .= '
get_atts( $key, $classes, $conditional, $data, $field_style ) . '>
'; break; /* A line divider */ case 'divider': $border_style = ''; if ( array_key_exists( 'borderwidth', $data ) ) { $border_style .= $data['borderwidth'] . 'px'; } if ( array_key_exists( 'borderstyle', $data ) ) { $border_style .= ' ' . $data['borderstyle']; } if ( array_key_exists( 'bordercolor', $data ) ) { $border_style .= ' ' . $data['bordercolor']; } $field_style = array(); if ( ! empty( $border_style ) ) { $field_style = array( 'border-bottom' => $border_style ); } $output .= '
get_atts( $key, $classes, $conditional, $data, $field_style ) . '>'; if ( ! empty( $data['divider_text'] ) ) { $output .= '
' . esc_html( $data['divider_text'] ) . '
'; } $output .= '
'; break; /* Single Image Upload */ case 'image': $output .= '
get_atts( $key, $classes, $conditional, $data ) . ' data-mode="' . esc_attr( $this->set_mode ) . '" data-upload-label="' . ( ! empty( $data['button_text'] ) ? esc_attr( $data['button_text'] ) : esc_attr__( 'Upload', 'ultimate-member' ) ) . '">'; if ( in_array( $key, array( 'profile_photo', 'cover_photo' ), true ) ) { $field_value = ''; } else { $field_value = $this->field_value( $key, $default, $data ); } $field_name = $key . $form_suffix; $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $modal_label = array_key_exists( 'label', $data ) ? $data['label'] : __( 'Upload Photo', 'ultimate-member' ); $output .= '
'; if ( ! empty( $field_value ) && 'empty_file' !== $field_value ) { if ( ! in_array( $key, array( 'profile_photo', 'cover_photo' ), true ) ) { // if ( isset( $this->set_mode ) && 'register' === $this->set_mode ) { // $image_info = get_transient( "um_{$field_value}" ); // } else { // $image_info = um_user( $data['metakey'] . '_metadata' ); // } if ( ( isset( $this->set_mode ) && 'register' === $this->set_mode ) || file_exists( UM()->uploader()->get_core_temp_dir() . DIRECTORY_SEPARATOR . $field_value ) ) { $img_value = UM()->uploader()->get_core_temp_url() . '/' . $this->field_value( $key, $default, $data ); } else { $img_value = UM()->files()->get_download_link( $this->set_id, $key, um_user( 'ID' ) ); } $img = ''; } else { $img = ''; } $output .= '
'; if ( empty( $disabled ) ) { $output .= ''; } $output .= $img; $output .= '
'; if ( empty( $disabled ) ) { $output .= '' . esc_html__( 'Change photo', 'ultimate-member' ) . ''; } } else { $output .= '
'; if ( empty( $disabled ) ) { $output .= ''; } $output .= '
'; if ( empty( $disabled ) ) { $output .= '' . esc_html( $data['button_text'] ) . ''; } } $output .= '
'; /* modal hidden */ if ( empty( $disabled ) ) { if ( ! isset( $data['allowed_types'] ) ) { $allowed_types = 'gif,jpg,jpeg,png'; } elseif ( is_array( $data['allowed_types'] ) ) { $allowed_types = implode( ',', $data['allowed_types'] ); } else { $allowed_types = $data['allowed_types']; } $output .= '
'; $output .= '
' . esc_html( $modal_label ) . '
'; $output .= '
'; if ( isset( $this->set_id ) ) { $set_id = $this->set_id; $set_mode = $this->set_mode; } else { $set_id = 0; $set_mode = ''; } $data_icon = ''; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $data_icon = ' data-icon="' . esc_attr( $data['icon'] ) . '"'; } $nonce = wp_create_nonce( 'um_upload_nonce-' . $this->timestamp ); $output .= '
'; $output .= '
' . esc_html( $data['button_text'] ) . '
'; $output .= ''; $output .= '
'; $output .= '
'; } /* end */ if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Single File Upload */ case 'file': $output .= '
get_atts( $key, $classes, $conditional, $data ) . ' data-mode="' . esc_attr( $this->set_mode ) . '" data-upload-label="' . ( ! empty( $data['button_text'] ) ? esc_attr( $data['button_text'] ) : esc_attr__( 'Upload', 'ultimate-member' ) ) . '">'; $field_name = $key . $form_suffix; $file_field_value = $this->field_value( $key, $default, $data ); $output .= 'aria_valid_attributes( $this->is_error( $key ), $field_name ) . '/>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $modal_label = array_key_exists( 'label', $data ) ? $data['label'] : __( 'Upload File', 'ultimate-member' ); $output .= '
'; if ( ! empty( $file_field_value ) && 'empty_file' !== $file_field_value ) { $file_type = wp_check_filetype( $file_field_value ); if ( um_is_temp_file( $file_field_value ) ) { $file_info = get_transient( "um_{$file_field_value}" ); } else { $file_info = um_user( $data['metakey'] . '_metadata' ); } $file_field_name = $file_field_value; if ( ! empty( $file_info['original_name'] ) ) { $file_field_name = $file_info['original_name']; } if ( ( isset( $this->set_mode ) && 'register' === $this->set_mode ) || file_exists( UM()->uploader()->get_core_temp_dir() . DIRECTORY_SEPARATOR . $file_field_value ) ) { $file_url = UM()->uploader()->get_core_temp_url() . DIRECTORY_SEPARATOR . $file_field_value; $file_dir = UM()->uploader()->get_core_temp_dir() . DIRECTORY_SEPARATOR . $file_field_value; } else { $file_url = UM()->files()->get_download_link( $this->set_id, $key, um_user( 'ID' ) ); $file_dir = UM()->uploader()->get_upload_base_dir() . um_user( 'ID' ) . DIRECTORY_SEPARATOR . $file_field_value; } // Multisite fix for old customers. if ( ! file_exists( $file_dir ) && is_multisite() ) { $file_dir = str_replace( DIRECTORY_SEPARATOR . 'sites' . DIRECTORY_SEPARATOR . get_current_blog_id() . DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, $file_dir ); } if ( file_exists( $file_dir ) ) { $output .= '
'; if ( empty( $disabled ) ) { $output .= ''; } $fonticon_bg = UM()->files()->get_fonticon_bg_by_ext( $file_type['ext'] ); $fonticon = UM()->files()->get_fonticon_by_ext( $file_type['ext'] ); $output .= '
'; } else { $output .= '
' . esc_html__( 'This file has been removed.', 'ultimate-member' ) . '
'; } if ( empty( $disabled ) ) { $output .= '' . esc_html__( 'Change file', 'ultimate-member' ) . ''; } } else { $output .= '
'; if ( empty( $disabled ) ) { $output .= '' . esc_html( $data['button_text'] ) . ''; } } $output .= '
'; /* modal hidden */ if ( empty( $disabled ) ) { if ( ! isset( $data['allowed_types'] ) ) { $allowed_types = 'pdf,txt'; } elseif ( is_array( $data['allowed_types'] ) ) { $allowed_types = implode( ',', $data['allowed_types'] ); } else { $allowed_types = $data['allowed_types']; } $output .= '
'; $output .= '
' . esc_html( $modal_label ) . '
'; $output .= '
'; if ( isset( $this->set_id ) ) { $set_id = $this->set_id; $set_mode = $this->set_mode; } else { $set_id = 0; $set_mode = ''; } $output .= ''; $data_icon = ''; if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons ) { $data_icon = ' data-icon="' . esc_attr( $data['icon'] ) . '"'; } $nonce = wp_create_nonce( 'um_upload_nonce-' . $this->timestamp ); $output .= '
' . esc_html( $data['button_text'] ) . '
'; $output .= ''; $output .= '
'; $output .= '
'; } /* end */ if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Select dropdown */ case 'select': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; $form_key = str_replace( array( 'role_select', 'role_radio' ), 'role', $key ); $field_id = $form_key; $class = 'um-s1'; if ( isset( $data['allowclear'] ) && 0 === $data['allowclear'] ) { $class = 'um-s2'; } if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $has_icon = ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons; $output .= '
'; if ( $has_icon ) { $output .= '
'; } $options = array(); $has_parent_option = false; $disabled_by_parent_option = ''; $atts_ajax = ''; $select_original_option_value = ''; if ( isset( $data['options'] ) && is_array( $data['options'] ) ) { $options = $data['options']; } if ( ! empty( $data['parent_dropdown_relationship'] ) && ! UM()->user()->preview ) { $has_parent_option = true; $disabled_by_parent_option = ' disabled="disabled" '; /** * Filters parent dropdown relationship by $form_key. * * @since 1.3.x * @hook um_custom_dropdown_options_parent__{$form_key} * * @param {string} $parent Parent dropdown relationship. * @param {array} $data Field Data. * * @return {string} Parent dropdown relationship. * * @example Change parent dropdown relationship. * function function_name( $parent, $data ) { * // your code here * return $parent; * } * add_filter( 'um_custom_dropdown_options_parent__{$form_key}', 'function_name', 10, 2 ); */ $parent_dropdown_relationship = apply_filters( "um_custom_dropdown_options_parent__{$form_key}", $data['parent_dropdown_relationship'], $data ); $atts_ajax .= ' data-um-parent="' . esc_attr( $parent_dropdown_relationship ) . '" '; if ( ! empty( $data['custom_dropdown_options_source'] ) && function_exists( $data['custom_dropdown_options_source'] ) && um_user( $data['parent_dropdown_relationship'] ) ) { if ( ! $this->is_source_blacklisted( $data['custom_dropdown_options_source'] ) ) { $options = call_user_func( $data['custom_dropdown_options_source'], $data['parent_dropdown_relationship'] ); } $disabled_by_parent_option = ''; if ( um_user( $form_key ) ) { $select_original_option_value = ' data-um-original-value="' . esc_attr( um_user( $form_key ) ) . '" '; } } } // Child dropdown option selected if ( isset( UM()->form()->post_form[ $form_key ] ) ) { $select_original_option_value = " data-um-original-value='" . esc_attr( UM()->form()->post_form[ $form_key ] ) . "' "; } // Child dropdown if ( $has_parent_option ) { if ( ! empty( $data['custom_dropdown_options_source'] ) && function_exists( $data['custom_dropdown_options_source'] ) && isset( UM()->form()->post_form[ $form_key ] ) ) { if ( ! $this->is_source_blacklisted( $data['custom_dropdown_options_source'] ) ) { $options = call_user_func( $data['custom_dropdown_options_source'], $data['parent_dropdown_relationship'] ); } } } if ( ! empty( $data['custom_dropdown_options_source'] ) ) { /** * Filters a custom dropdown options source by $form_key. * * @since 1.3.x * @hook um_custom_dropdown_options_source__{$form_key} * * @param {string} $source Dropdown options source. * @param {array} $data Field Data. * * @return {string} Dropdown options source. * * @example Change custom dropdown options source. * function function_name( $source, $data ) { * // your code here * return $source; * } * add_filter( 'um_custom_dropdown_options_source__{$form_key}', 'function_name', 10, 2 ); */ $ajax_source = apply_filters( "um_custom_dropdown_options_source__{$form_key}", $data['custom_dropdown_options_source'], $data ); $atts_ajax .= ' data-um-ajax-source="' . esc_attr( $ajax_source ) . '" '; } if ( ! $has_parent_option ) { if ( isset( $options ) && 'builtin' === $options ) { $options = UM()->builtin()->get( $data['filter'] ); } // 'country' if ( 'country' === $key && empty( $options ) ) { $options = UM()->builtin()->get( 'countries' ); } elseif ( empty( $options ) && isset( $data['options'] ) ) { $options = $data['options']; } /** * Filters dropdown options. * * @since 2.0 * @hook um_selectbox_options * * @param {array} $options Field options. * @param {string} $key Field metakey. * * @return {array} Field options. * * @example Extend dropdown options. * function my_um_selectbox_options( $options, $key ) { * // your code here * return $options; * } * add_filter( 'um_selectbox_options', 'my_um_selectbox_options', 10, 2 ); */ $options = apply_filters( 'um_selectbox_options', $options, $key ); if ( isset( $options ) ) { /** * Filters dropdown dynamic options. * * @since 1.3.x * @hook um_select_dropdown_dynamic_options * * @param {array} $options Dynamic options. * @param {array} $data Field Data. * * @return {array} Dynamic options. * * @example Extend dropdown dynamic options. * function my_select_dropdown_dynamic_options( $options, $data ) { * // your code here * return $options; * } * add_filter( 'um_select_dropdown_dynamic_options', 'my_select_dropdown_dynamic_options', 10, 2 ); */ $options = apply_filters( 'um_select_dropdown_dynamic_options', $options, $data ); /** * Filters dropdown dynamic options by field $key. * * @since 1.3.x * @hook um_select_dropdown_dynamic_options_{$key} * * @param {array} $options Dynamic options. * * @return {array} Dynamic options. * * @example Extend dropdown dynamic options by field $key. * function my_select_dropdown_dynamic_options( $options ) { * // your code here * return $options; * } * add_filter( 'um_select_dropdown_dynamic_options_{$key}', 'my_select_dropdown_dynamic_options', 10, 1 ); */ $options = apply_filters( "um_select_dropdown_dynamic_options_{$key}", $options ); } } if ( 'role' === $form_key ) { $options = $this->get_available_roles( $form_key, $options ); } /** * Filters enable options pair by field $data. * * @since 1.3.x `um_multiselect_option_value` * @since 2.0 renamed to `um_select_options_pair` * * @hook um_select_options_pair * * @param {bool|null} $options_pair Enable pairs. * @param {array} $data Field Data. * * @return {bool} Enable pairs. Set to `true` if a field requires text keys. * * @example Enable options pair. * function my_um_select_options_pair( $options_pair, $data ) { * // your code here * return $options_pair; * } * add_filter( 'um_select_options_pair', 'my_um_select_options_pair', 10, 2 ); */ $options_pair = apply_filters( 'um_select_options_pair', null, $data ); // Switch options pair for custom options from a callback function. if ( ! empty( $data['custom_dropdown_options_source'] ) ) { $options_pair = true; } $field_value = ''; $output .= ''; $output .= '
'; if ( $this->is_error( $form_key ) ) { $output .= $this->field_error( $this->show_error( $form_key ), $form_key ); } elseif ( $this->is_notice( $form_key ) ) { $output .= $this->field_notice( $this->show_notice( $form_key ), $form_key ); } $output .= '
'; break; /* Multi-Select dropdown */ case 'multiselect': $options = array(); if ( isset( $data['options'] ) && is_array( $data['options'] ) ) { $options = $data['options']; } $max_selections = isset( $data['max_selections'] ) ? absint( $data['max_selections'] ) : 0; $field_id = $key; $field_name = $key; $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; $class = 'um-s1'; if ( isset( $data['allowclear'] ) && 0 === $data['allowclear'] ) { $class = 'um-s2'; } if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $has_icon = ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'field' === $this->field_icons; $output .= '
'; if ( $has_icon ) { $output .= '
'; } $output .= ''; if ( ! empty( $disabled ) && ! empty( $arr_selected ) ) { foreach ( $arr_selected as $item ) { $output .= $this->disabled_hidden_field( $key . '[]', $item ); } } $output .= '
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $field_name ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $field_name ); } $output .= '
'; break; /* Radio */ case 'radio': $form_key = str_replace( array( 'role_select', 'role_radio' ), 'role', $key ); $options = array(); if ( isset( $data['options'] ) && is_array( $data['options'] ) ) { $options = $data['options']; } /** * Filters radio field options. * * @since 1.3.x * @hook um_radio_field_options * * @param {array} $options Radio Field Options. * @param {array} $data Field Data. * * @return {array} Radio Field Options. * * @example Extend radio field options. * function my_radio_field_options( $options, $data ) { * // your code here * return $options; * } * add_filter( 'um_radio_field_options', 'my_radio_field_options', 10, 2 ); */ $options = apply_filters( 'um_radio_field_options', $options, $data ); /** * Filters radio field options by field $key. * * @since 1.3.x * @hook um_radio_field_options_{$key} * * @param {array} $options Radio Field Options. * * @return {array} Radio Field Options. * * @example Extend radio field options. * function my_radio_field_options( $options ) { * // your code here * return $options; * } * add_filter( 'um_radio_field_options_{$key}', 'my_radio_field_options', 10, 1 ); */ $options = apply_filters( "um_radio_field_options_{$key}", $options ); $options = $this->get_available_roles( $form_key, $options ); $output .= '
get_atts( $key, $classes, $conditional, $data ) . ' ' . $this->aria_valid_attributes( $this->is_error( $key ), $form_key ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; // Add options. $i = 0; $field_value = array(); /** * Filters enable options pair by field $data. * * @since 2.0 * @hook um_radio_options_pair__{$key} * * @param {bool} $options_pair Enable pairs. * @param {array} $data Field Data. * * @return {bool} Enable pairs. * * @example Enable options pair. * function my_radio_field_options( $options ) { * // your code here * return $options; * } * add_filter( 'um_radio_options_pair__{$key}', 'my_radio_field_options', 10, 2 ); */ $options_pair = apply_filters( "um_radio_options_pair__{$key}", false, $data ); if ( ! empty( $options ) ) { foreach ( $options as $k => $v ) { $v = rtrim( $v ); $um_field_checkbox_item_title = $v; $option_value = $v; if ( ( ! is_numeric( $k ) && 'role' === $form_key ) || ( 'account' === $this->set_mode || um_is_core_page( 'account' ) ) ) { $option_value = $k; } if ( $options_pair ) { $option_value = $k; } $i++; if ( 0 === $i % 2 ) { $col_class = ' right '; } else { $col_class = ''; } if ( $this->is_radio_checked( $key, $option_value, $data ) ) { $active = 'active'; $class = 'um-icon-android-radio-button-on'; } else { $active = ''; $class = 'um-icon-android-radio-button-off'; } // It's for a legacy case `array_key_exists( 'editable', $data )`. if ( array_key_exists( 'editable', $data ) && empty( $data['editable'] ) ) { $col_class .= ' um-field-radio-state-disabled'; } $output .= ''; if ( 0 === $i % 2 ) { $output .= '
'; } } } if ( ! empty( $disabled ) ) { foreach ( $field_value as $item ) { $output .= $this->disabled_hidden_field( $form_key, $item ); } } $output .= '
'; $output .= '
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $form_key ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $form_key ); } $output .= '
'; break; /* Checkbox */ case 'checkbox': $options = array(); if ( isset( $data['options'] ) && is_array( $data['options'] ) ) { $options = $data['options']; } /** * Filters checkbox options. * * @since 1.3.x * @hook um_checkbox_field_options * * @param {array} $options Checkbox Options. * @param {array} $data Field Data. * * @return {array} Checkbox Options. * * @example Extend checkbox options. * function um_checkbox_field_options( $options, $data ) { * // your code here * return $options; * } * add_filter( 'um_checkbox_field_options', 'um_checkbox_field_options', 10, 2 ); */ $options = apply_filters( 'um_checkbox_field_options', $options, $data ); /** * Filters checkbox options by field $key. * * @since 1.3.x * @hook um_checkbox_field_options_{$key} * * @param {array} $options Checkbox Options. * * @return {array} Checkbox Options. * * @example Extend checkbox options. * function my_checkbox_options( $options ) { * // your code here * return $options; * } * add_filter( 'um_checkbox_field_options_{$key}', 'my_checkbox_options', 10, 1 ); */ $options = apply_filters( "um_checkbox_field_options_{$key}", $options ); $output .= '
get_atts( $key, $classes, $conditional, $data ) . ' ' . $this->aria_valid_attributes( $this->is_error( $key ), $key ) . '>'; if ( isset( $data['label'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $output .= '
'; // Add options. $i = 0; foreach ( $options as $k => $v ) { $v = rtrim( $v ); $i++; if ( 0 === $i % 2 ) { $col_class = ' right '; } else { $col_class = ''; } if ( $this->is_selected( $key, $v, $data ) ) { $active = 'active'; $class = 'um-icon-android-checkbox-outline'; } else { $active = ''; $class = 'um-icon-android-checkbox-outline-blank'; } // It's for a legacy case `array_key_exists( 'editable', $data )`. if ( array_key_exists( 'editable', $data ) && empty( $data['editable'] ) ) { $col_class .= ' um-field-radio-state-disabled'; } $output .= ''; if ( 0 === $i % 2 ) { $output .= '
'; } } $output .= '
'; $output .= '
'; if ( $this->is_error( $key ) ) { $output .= $this->field_error( $this->show_error( $key ), $key ); } elseif ( $this->is_notice( $key ) ) { $output .= $this->field_notice( $this->show_notice( $key ), $key ); } $output .= '
'; break; /* HTML */ case 'block': $content = array_key_exists( 'content', $data ) ? $data['content'] : ''; // @todo WP_KSES for $content $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>' . $content . '
'; break; /* Shortcode */ case 'shortcode': $content = array_key_exists( 'content', $data ) ? $data['content'] : ''; $content = str_replace( '{profile_id}', um_profile_id(), $content ); $content = apply_shortcodes( $content ); // @todo WP_KSES for $content $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>' . $content . '
'; break; /* Unlimited Group */ case 'group': $fields = $this->get_fields_in_group( $key ); if ( ! empty( $fields ) ) { $output .= '
' . esc_html__( $data['label'], 'ultimate-member' ) . '
'; $output .= '
'; foreach ( $fields as $subkey => $subdata ) { $output .= $this->edit_field( $subkey, $subdata, 'group' ); } $output .= '
'; $output .= '
'; } break; } // Custom filter for field output. if ( isset( $this->set_mode ) ) { /** * Filters change field HTML on edit mode by field $key. * * @since 1.3.x * @hook um_{$key}_form_edit_field * * @param {string} $output Field HTML. * @param {string} $mode Field Mode. * * @return {string} Field HTML. * * @example Change field HTML. * function um_checkbox_field_options( $output, $mode ) { * // your code here * return $output; * } * add_filter( 'um_{$key}_form_edit_field', 'my_form_edit_field', 10, 2 ); */ $output = apply_filters( "um_{$key}_form_edit_field", $output, $this->set_mode ); } return $output; } /** * Filter for user roles * * @param $form_key * @param array $options * @return array */ function get_available_roles( $form_key, $options = array() ) { if ( 'role' !== $form_key ) { return $options; } // role field global $wp_roles; $exclude_roles = array_diff( array_keys( $wp_roles->roles ), UM()->roles()->get_editable_user_roles() ); $roles = UM()->roles()->get_roles( false, $exclude_roles ); if ( ! empty( $options ) ) { $roles = array_map( function( $item ) { return html_entity_decode( $item, ENT_QUOTES ); }, $roles ); //fix when customers change options for role (radio/dropdown) fields $intersected_options = array(); foreach ( $options as $key => $title ) { if ( false !== $search_key = array_search( $title, $roles ) ) { $intersected_options[ $search_key ] = $title; } elseif ( isset( $roles[ $key ] ) ) { $intersected_options[ $key ] = $title; } } $options = $intersected_options; } else { $options = $roles; } return $options; } /** * Sorts columns array * * @param array $arr * @param string $col * @param string $dir * * @return array $arr */ function array_sort_by_column( $arr, $col, $dir = SORT_ASC ) { $sort_col = array(); foreach ( $arr as $key => $row ) { if ( $key == 'form_id' ) { unset( $arr['form_id'] ); continue; } if ( isset( $row[ $col ] ) ) { $sort_col[ $key ] = $row[ $col ]; } else { unset( $arr[ $key ] ); } } array_multisort( $sort_col, $dir, $arr ); return $arr; } /** * Get fields in row * * @param int $row_id * * @return string */ public function get_fields_by_row( $row_id ) { if ( ! isset( $this->get_fields ) || ! is_array( $this->get_fields ) ) { return ''; } foreach ( $this->get_fields as $key => $array ) { if ( ! isset( $array['in_row'] ) || ( isset( $array['in_row'] ) && $array['in_row'] == $row_id ) ) { $results[ $key ] = $array; } } return isset( $results ) ? $results : ''; } /** * Get fields by sub row * * @param string $row_fields * @param integer $subrow_id * * @return mixed */ function get_fields_in_subrow( $row_fields, $subrow_id ) { if ( ! is_array( $row_fields ) ) { return ''; } foreach ( $row_fields as $key => $array ) { if ( ! isset( $array['in_sub_row'] ) || ( isset( $array['in_sub_row'] ) && $array['in_sub_row'] == $subrow_id ) ) { $results[ $key ] = $array; } } return ( isset ( $results ) ) ? $results : ''; } /** * Get fields in group * * @param integer $group_id * * @return mixed */ function get_fields_in_group( $group_id ) { foreach ( $this->get_fields as $key => $array ) { if ( isset( $array['in_group'] ) && $array['in_group'] == $group_id ) { $results[ $key ] = $array; } } return ( isset ( $results ) ) ? $results : ''; } /** * Get fields in column * * @param array $fields * @param integer $col_number * * @return mixed */ function get_fields_in_column( $fields, $col_number ) { foreach ( $fields as $key => $array ) { if ( isset( $array['in_column'] ) && $array['in_column'] == $col_number ) { $results[ $key ] = $array; } } return ( isset ( $results ) ) ? $results : ''; } /** * Display fields * * @param string $mode * @param array $args * * @return string|null * @throws Exception */ public function display( $mode, $args ) { $output = null; $this->global_args = $args; UM()->form()->form_suffix = '-' . $this->global_args['form_id']; $this->set_mode = $mode; if ( 'profile' === $mode ) { UM()->form()->nonce = wp_create_nonce( 'um-profile-nonce' . UM()->user()->target_id ); } $this->set_id = absint( $this->global_args['form_id'] ); $this->field_icons = ( isset( $this->global_args['icons'] ) ) ? $this->global_args['icons'] : 'label'; // start output here $this->get_fields = $this->get_fields(); if ( ! empty( $this->get_fields ) ) { // find rows foreach ( $this->get_fields as $key => $array ) { if ( isset( $array['type'] ) && 'row' === $array['type'] ) { $this->rows[ $key ] = $array; unset( $this->get_fields[ $key ] ); // not needed anymore } } // rows fallback if ( ! isset( $this->rows ) ) { $this->rows = array( '_um_row_1' => array( 'type' => 'row', 'id' => '_um_row_1', 'sub_rows' => 1, 'cols' => 1, ), ); } // master rows foreach ( $this->rows as $row_id => $row_array ) { $row_fields = $this->get_fields_by_row( $row_id ); if ( $row_fields ) { $output .= $this->new_row_output( $row_id, $row_array ); $sub_rows = ( isset( $row_array['sub_rows'] ) ) ? $row_array['sub_rows'] : 1; for ( $c = 0; $c < $sub_rows; $c++ ) { // cols $cols = isset( $row_array['cols'] ) ? $row_array['cols'] : 1; if ( is_numeric( $cols ) ) { $cols_num = (int) $cols; } else { if ( strstr( $cols, ':' ) ) { $col_split = explode( ':', $cols ); } else { $col_split = array( $cols ); } $cols_num = $col_split[ $c ]; } // sub row fields $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); if ( is_array( $subrow_fields ) ) { $subrow_fields = $this->array_sort_by_column( $subrow_fields, 'position' ); if ( $cols_num == 1 ) { $output .= '
'; $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); if ( $col1_fields ) { foreach ( $col1_fields as $key => $data ) { if ( ! empty( $args['is_block'] ) ) { $data['is_block'] = true; } $output .= $this->edit_field( $key, $data ); } } $output .= '
'; } else if ($cols_num == 2) { $output .= '
'; $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); if ( $col1_fields ) { foreach ( $col1_fields as $key => $data ) { if ( ! empty( $args['is_block'] ) ) { $data['is_block'] = true; } $output .= $this->edit_field( $key, $data ); } } $output .= '
'; $output .= '
'; $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); if ( $col2_fields ) { foreach ( $col2_fields as $key => $data ) { if ( ! empty( $args['is_block'] ) ) { $data['is_block'] = true; } $output .= $this->edit_field( $key, $data ); } } $output .= '
'; } else { $output .= '
'; $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); if ( $col1_fields ) { foreach ( $col1_fields as $key => $data ) { $output .= $this->edit_field( $key, $data ); } } $output .= '
'; $output .= '
'; $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); if ( $col2_fields ) { foreach ( $col2_fields as $key => $data ) { $output .= $this->edit_field( $key, $data ); } } $output .= '
'; $output .= '
'; $col3_fields = $this->get_fields_in_column( $subrow_fields, 3 ); if ( $col3_fields ) { foreach ( $col3_fields as $key => $data ) { $output .= $this->edit_field( $key, $data ); } } $output .= '
'; } } } $output .= ''; } } } return $output; } /** * Gets a field in `view mode` * * @param string $key * @param array $data * @param bool $rule * * @return string|null * @throws Exception */ public function view_field( $key, $data, $rule = false ) { if ( '_um_last_login' === $key ) { $profile_id = um_user( 'ID' ); $show_last_login = get_user_meta( $profile_id, 'um_show_last_login', true ); if ( ! empty( $show_last_login ) && 'no' === $show_last_login[0] ) { return ''; } } $output = ''; // Get whole field data. if ( is_array( $data ) ) { $data = $this->get_field( $key ); } // Invalid field data. if ( ! is_array( $data ) ) { return ''; } //hide if empty type if ( ! array_key_exists( 'type', $data ) || empty( $data['type'] ) ) { return ''; } $type = $data['type']; if ( isset( $data['in_group'] ) && '' !== $data['in_group'] && 'group' !== $rule ) { return ''; } // Invisible on profile page. if ( 'password' === $type || ( array_key_exists( 'visibility', $data ) && 'edit' === $data['visibility'] ) ) { return ''; } // Disable these fields in profile view only. if ( 'user_password' === $key && 'profile' === $this->set_mode ) { return ''; } $default = array_key_exists( 'default', $data ) ? $data['default'] : false; // Hide if empty. $fields_without_metakey = UM()->builtin()->get_fields_without_metakey(); if ( ! in_array( $type, $fields_without_metakey, true ) ) { $_field_value = $this->field_value( $key, $default, $data ); if ( ! isset( $_field_value ) || '' === $_field_value ) { return ''; } } if ( ! um_can_view_field( $data ) ) { return ''; } if ( ! um_field_conditions_are_met( $data ) ) { return ''; } $classes = ''; if ( ! empty( $data['classes'] ) ) { $classes = explode( ' ', $data['classes'] ); } $conditional = ''; if ( ! empty( $data['conditional'] ) ) { $conditional = $data['conditional']; } switch ( $type ) { /* Default */ default: $_field_value = $this->field_value( $key, $default, $data ); if ( ( isset( $_field_value ) && '' !== $_field_value ) || in_array( $type, $fields_without_metakey, true ) ) { $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) { if ( ! isset( $data['label'] ) ) { $data['label'] = ''; } $output .= $this->field_label( $data['label'], $key, $data ); } $res = $_field_value; if ( ! empty( $res ) ) { $res = stripslashes( $res ); } $bio_key = UM()->profile()->get_show_bio_key( $this->global_args ); if ( $bio_key === $data['metakey'] ) { $show_bio = false; $bio_html = false; $global_setting = UM()->options()->get( 'profile_show_html_bio' ); if ( isset( $this->global_args['mode'] ) && 'profile' === $this->global_args['mode'] ) { if ( ! empty( $this->global_args['use_custom_settings'] ) ) { if ( ! empty( $this->global_args['show_bio'] ) ) { $show_bio = true; $bio_html = ! empty( $global_setting ); } } else { $global_show_bio = UM()->options()->get( 'profile_show_bio' ); if ( ! empty( $global_show_bio ) ) { $show_bio = true; $bio_html = ! empty( $global_setting ); } } } if ( $show_bio ) { if ( true === $bio_html && ! empty( $data['html'] ) ) { $res = wp_kses_post( make_clickable( wpautop( $res ) ) ); } else { $res = esc_html( $res ); } } else { if ( ! empty( $data['html'] ) ) { $res = wp_kses_post( make_clickable( wpautop( $res ) ) ); } else { $res = esc_html( $res ); } } $res = nl2br( $res ); } $data['is_view_field'] = true; /** * Filters the inner field HTML on view mode. * * @since 1.3.x * @hook um_view_field * * @param {string} $output Field inner HTML. * @param {array} $data Field Data. * @param {string} $type Field Type. * * @return {string} Field inner HTML. * * @example Change field's inner HTML on view mode. * function my_view_field( $output, $data, $type ) { * // your code here * return $output; * } * add_filter( 'um_view_field', 'my_view_field', 10, 3 ); */ $res = apply_filters( 'um_view_field', $res, $data, $type ); /** * Filters the inner field HTML on view mode by field type {$type}. * * @since 1.3.x * @hook um_view_field_value_{$type} * * @param {string} $output Field inner HTML. * @param {array} $data Field Data. * * @return {string} Field inner HTML. * * @example Change field HTML on view mode by field type. * function my_view_field( $output, $data ) { * // your code here * return $output; * } * add_filter( 'um_view_field_value_{$type}', 'my_view_field', 10, 2 ); */ $res = apply_filters( "um_view_field_value_{$type}", $res, $data ); $id_attr = ''; if ( ! in_array( $type, $fields_without_metakey, true ) ) { $id_attr = ' id="' . esc_attr( $key . UM()->form()->form_suffix ) . '"'; } if ( empty( $res ) && ! ( 'number' === $type && '' !== $res ) ) { $output = ''; } else { $output .= '
'; $output .= '
' . $res . '
'; $output .= '
'; $output .= '
'; } } break; /* oEmbed */ case 'oembed': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $response = wp_oembed_get( $_field_value ); if ( empty( $response ) ) { $response = $_field_value; } $output .= '
'; $output .= '
' . $response . '
'; $output .= '
'; break; /* HTML */ case 'block': $content = array_key_exists( 'content', $data ) ? $data['content'] : ''; $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>' . $content . '
'; break; /* Shortcode */ case 'shortcode': $content = array_key_exists( 'content', $data ) ? $data['content'] : ''; $content = str_replace( '{profile_id}', um_profile_id(), $content ); $content = apply_shortcodes( $content ); $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>' . $content . '
'; break; /* Gap/Space */ case 'spacing': $field_style = array(); if ( array_key_exists( 'spacing', $data ) ) { $field_style = array( 'height' => $data['spacing'] ); } $output .= '
get_atts( $key, $classes, $conditional, $data, $field_style ) . '>
'; break; /* A line divider */ case 'divider': $border_style = ''; if ( array_key_exists( 'borderwidth', $data ) ) { $border_style .= $data['borderwidth'] . 'px'; } if ( array_key_exists( 'borderstyle', $data ) ) { $border_style .= ' ' . $data['borderstyle']; } if ( array_key_exists( 'bordercolor', $data ) ) { $border_style .= ' ' . $data['bordercolor']; } $field_style = array(); if ( ! empty( $border_style ) ) { $field_style = array( 'border-bottom' => $border_style ); } $output .= '
get_atts( $key, $classes, $conditional, $data, $field_style ) . '>'; if ( ! empty( $data['divider_text'] ) ) { $output .= '
' . esc_html( $data['divider_text'] ) . '
'; } $output .= '
'; break; /* Rating */ case 'rating': $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>'; if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) { $output .= $this->field_label( $data['label'], $key, $data ); } $number = 5; if ( array_key_exists( 'number', $data ) && in_array( absint( $data['number'] ), array( 5, 10 ), true ) ) { $number = $data['number']; } ob_start(); ?>
'; break; } // Custom filter for field output. if ( isset( $this->set_mode ) ) { /** * Filters outer field HTML by field $key. * * @since 1.3.x * @hook um_{$key}_form_show_field * * @param {string} $output Field outer HTML. * @param {string} $mode Field Mode. * * @return {string} Field outer HTML. * * @example Change field outer HTML by field $key. * function my_form_show_field( $output, $mode ) { * // your code here * return $output; * } * add_filter( 'um_{$key}_form_show_field', 'my_form_show_field', 10, 2 ); */ $output = apply_filters( "um_{$key}_form_show_field", $output, $this->set_mode ); /** * Filters outer field HTML by field $type. * * @since 1.3.x * @hook um_{$type}_form_show_field * * @param {string} $output Field outer HTML. * @param {string} $mode Field Mode. * * @return {string} Field outer HTML. * * @example Change field outer HTML by field $type. * function my_form_show_field( $output, $mode ) { * // your code here * return $output; * } * add_filter( 'um_{$type}_form_show_field', 'my_form_show_field', 10, 2 ); */ $output = apply_filters( "um_{$type}_form_show_field", $output, $this->set_mode ); } return $output; } /** * Filter field data * * @param array $data * * @return array */ function view_field_output( $data ) { /** * UM hook * * @type filter * @title um_view_field_output_{$type} * @description Change field data output by $type * @input_vars * [{"var":"$data","type":"array","desc":"Field Data"}] * @change_log * ["Since: 2.0"] * @usage add_filter( 'um_view_field_output_{$type}', 'function_name', 10, 1 ); * @example * */ return apply_filters( "um_view_field_output_" . $data['type'], $data ); } /** * Display fields ( view mode ) * * @param string $mode * @param array $args * * @return string|null * @throws Exception */ public function display_view( $mode, $args ) { $output = null; $this->global_args = $args; UM()->form()->form_suffix = '-' . $this->global_args['form_id']; $this->set_mode = $mode; $this->set_id = absint( $this->global_args['form_id'] ); $this->field_icons = isset( $this->global_args['icons'] ) ? $this->global_args['icons'] : 'label'; // start output here $this->get_fields = $this->get_fields(); if ( UM()->options()->get( 'profile_empty_text' ) ) { $emo = UM()->options()->get( 'profile_empty_text_emo' ); if ( $emo ) { $emo = ''; } else { $emo = false; } if ( um_is_myprofile() ) { if ( isset( $_GET['profiletab'] ) && 'main' !== $_GET['profiletab'] ) { $tab = sanitize_key( $_GET['profiletab'] ); $edit_action = 'edit_' . $tab; $profile_url = um_user_profile_url( um_profile_id() ); $edit_url = add_query_arg( array( 'profiletab' => $tab, 'um_action' => $edit_action ), $profile_url ); } else { $edit_url = um_edit_profile_url(); } // translators: %s: edit user link. $output .= '

' . $emo . '' . sprintf( __( 'Your profile is looking a little empty. Why not add some information!', 'ultimate-member' ), esc_url( $edit_url ) ) . '

'; } else { $output .= '

' . $emo . '' . __( 'This user has not added any information to their profile yet.', 'ultimate-member' ) . '

'; } } if ( ! empty( $this->get_fields ) && is_array( $this->get_fields ) ) { // find rows foreach ( $this->get_fields as $key => $array ) { if ( isset( $array['type'] ) && 'row' === $array['type'] ) { $this->rows[ $key ] = $array; unset( $this->get_fields[ $key ] ); // not needed anymore } } // rows fallback if ( ! isset( $this->rows ) ) { $this->rows = array( '_um_row_1' => array( 'type' => 'row', 'id' => '_um_row_1', 'sub_rows' => 1, 'cols' => 1, ), ); } // master rows foreach ( $this->rows as $row_id => $row_array ) { $row_fields = $this->get_fields_by_row( $row_id ); if ( $row_fields ) { $output .= $this->new_row_output( $row_id, $row_array ); $sub_rows = ( isset( $row_array['sub_rows'] ) ) ? $row_array['sub_rows'] : 1; for ( $c = 0; $c < $sub_rows; $c++ ) { // cols $cols = isset( $row_array['cols'] ) ? $row_array['cols'] : 1; if ( is_numeric( $cols ) ) { $cols_num = (int) $cols; } else { if ( strstr( $cols, ':' ) ) { $col_split = explode( ':', $cols ); } else { $col_split = array( $cols ); } $cols_num = $col_split[ $c ]; } // sub row fields $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); if ( is_array( $subrow_fields ) ) { $subrow_fields = $this->array_sort_by_column( $subrow_fields, 'position' ); if ( $cols_num == 1 ) { $output .= '
'; $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); if ( $col1_fields ) { foreach ( $col1_fields as $key => $data ) { $data = $this->view_field_output( $data ); $output .= $this->view_field( $key, $data ); } } $output .= '
'; } elseif ( $cols_num == 2 ) { $output .= '
'; $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); if ( $col1_fields ) { foreach ( $col1_fields as $key => $data ) { $data = $this->view_field_output( $data ); $output .= $this->view_field( $key, $data ); } } $output .= '
'; $output .= '
'; $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); if ( $col2_fields ) { foreach ( $col2_fields as $key => $data ) { $data = $this->view_field_output( $data ); $output .= $this->view_field( $key, $data ); } } $output .= '
'; } else { $output .= '
'; $col1_fields = $this->get_fields_in_column( $subrow_fields, 1 ); if ( $col1_fields ) { foreach ( $col1_fields as $key => $data ) { $data = $this->view_field_output( $data ); $output .= $this->view_field( $key, $data ); } } $output .= '
'; $output .= '
'; $col2_fields = $this->get_fields_in_column( $subrow_fields, 2 ); if ( $col2_fields ) { foreach ( $col2_fields as $key => $data ) { $data = $this->view_field_output( $data ); $output .= $this->view_field( $key, $data ); } } $output .= '
'; $output .= '
'; $col3_fields = $this->get_fields_in_column( $subrow_fields, 3 ); if ( $col3_fields ) { foreach ( $col3_fields as $key => $data ) { $data = $this->view_field_output( $data ); $output .= $this->view_field( $key, $data ); } } $output .= '
'; } } } $output .= '
'; } } } return $output; } /** * Get new row in form. * * @param string $row_id * @param array $row_array * * @return string */ public function new_row_output( $row_id, $row_array ) { $output = ''; $background = array_key_exists( 'background', $row_array ) ? $row_array['background'] : ''; $text_color = array_key_exists( 'text_color', $row_array ) ? $row_array['text_color'] : ''; $padding = array_key_exists( 'padding', $row_array ) ? $row_array['padding'] : ''; $margin = array_key_exists( 'margin', $row_array ) ? $row_array['margin'] : ''; $border = array_key_exists( 'border', $row_array ) ? $row_array['border'] : ''; $borderradius = array_key_exists( 'borderradius', $row_array ) ? $row_array['borderradius'] : ''; $borderstyle = array_key_exists( 'borderstyle', $row_array ) ? $row_array['borderstyle'] : ''; $bordercolor = array_key_exists( 'bordercolor', $row_array ) ? $row_array['bordercolor'] : ''; $heading = ! empty( $row_array['heading'] ); $css_class = array_key_exists( 'css_class', $row_array ) ? $row_array['css_class'] : ''; $css_borderradius = ''; // Row CSS rules. $css_background = ''; if ( ! empty( $background ) ) { $css_background = 'background-color: ' . esc_attr( $background ) . ';'; } $css_text_color = ''; if ( ! empty( $text_color ) ) { $css_text_color = 'color: ' . esc_attr( $text_color ) . ' !important;'; $css_class .= ' um-customized-row'; } $css_padding = ''; if ( ! empty( $padding ) ) { $css_padding = 'padding: ' . esc_attr( $padding ) . ';'; } $css_margin = 'margin: 0 0 30px 0;'; if ( ! empty( $margin ) ) { $css_margin = 'margin: ' . esc_attr( $margin ) . ';'; } $css_border = ''; if ( ! empty( $border ) ) { $css_border = 'border-width: ' . esc_attr( $border ) . ';'; } $css_borderstyle = ''; if ( ! empty( $borderstyle ) ) { $css_borderstyle = 'border-style: ' . esc_attr( $borderstyle ) . ';'; } $css_bordercolor = ''; if ( ! empty( $bordercolor ) ) { $css_bordercolor = 'border-color: ' . esc_attr( $bordercolor ) . ';'; } // Show the heading. if ( $heading ) { if ( ! empty( $borderradius ) ) { $css_borderradius = 'border-radius: 0px 0px ' . esc_attr( $borderradius ) . ' ' . esc_attr( $borderradius ) . ';'; } $css_heading_background_color = ''; $css_heading_padding = ''; if ( ! empty( $row_array['heading_background_color'] ) ) { $css_heading_background_color = 'background-color: ' . $row_array['heading_background_color'] . ';'; $css_heading_padding = 'padding: 10px 15px;'; } $css_heading_borderradius = ! empty( $borderradius ) ? 'border-radius: ' . esc_attr( $borderradius ) . ' ' . esc_attr( $borderradius ) . ' 0px 0px;' : ''; $css_heading_border = $css_border . $css_borderstyle . $css_bordercolor . $css_heading_borderradius . 'border-bottom-width: 0px;'; $css_heading_margin = $css_margin . 'margin-bottom: 0px;'; $css_heading_text_color = ! empty( $row_array['heading_text_color'] ) ? 'color: ' . esc_attr( $row_array['heading_text_color'] ) . ';' : ''; $output .= '
'; if ( ! empty( $row_array['icon'] ) ) { $css_icon_color = ! empty( $row_array['icon_color'] ) ? 'color: ' . esc_attr( $row_array['icon_color'] ) . ';' : ''; $output .= ''; } if ( ! empty( $row_array['heading_text'] ) ) { $output .= esc_html( $row_array['heading_text'] ); } $output .= '
'; $css_border .= 'border-top-width: 0px;'; $css_margin .= 'margin-top: 0px;'; } else { // No heading. if ( ! empty( $borderradius ) ) { $css_borderradius = 'border-radius: ' . esc_attr( $borderradius ) . ';'; } } $output .= '
'; return $output; } /** * Admin Builder silent AJAX handler for actions with fields. */ public function do_ajax_action() { UM()->admin()->check_ajax_nonce(); // phpcs:disable WordPress.Security.NonceVerification if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { wp_send_json_error( __( 'Please login as administrator.', 'ultimate-member' ) ); } if ( ! isset( $_POST['act_id'] ) ) { wp_send_json_error( __( 'Invalid action.', 'ultimate-member' ) ); } $in_row = isset( $_POST['in_row'] ) ? absint( $_POST['in_row'] ) : 0; $position = array( 'in_row' => '_um_row_' . ( $in_row + 1 ), 'in_sub_row' => isset( $_POST['in_sub_row'] ) ? absint( $_POST['in_sub_row'] ) : '', 'in_column' => isset( $_POST['in_column'] ) ? absint( $_POST['in_column'] ) : '', 'in_group' => isset( $_POST['in_group'] ) ? absint( $_POST['in_group'] ) : '', ); switch ( sanitize_key( $_POST['act_id'] ) ) { case 'um_admin_duplicate_field': // arg1 is a field metakey(id) // arg2 is a form ID. $this->duplicate_field( sanitize_text_field( $_POST['arg1'] ), absint( $_POST['arg2'] ) ); break; case 'um_admin_remove_field_global': // arg1 is a field metakey(id) $this->delete_field_from_db( sanitize_text_field( $_POST['arg1'] ) ); break; case 'um_admin_remove_field': // arg1 is a field metakey(id) // arg2 is a form ID. $this->delete_field_from_form( sanitize_text_field( $_POST['arg1'] ), absint( $_POST['arg2'] ) ); break; case 'um_admin_add_field_from_predefined': // arg1 is a field metakey(id) // arg2 is a form ID. $this->add_field_from_predefined( sanitize_text_field( $_POST['arg1'] ), absint( $_POST['arg2'] ), $position ); break; case 'um_admin_add_field_from_list': // arg1 is a field metakey(id) // arg2 is a form ID. $this->add_field_from_list( sanitize_text_field( $_POST['arg1'] ), absint( $_POST['arg2'] ), $position ); break; } // phpcs:enable WordPress.Security.NonceVerification wp_send_json_success(); } /** * Get rendered field attributes * * @since 2.1.2 * * @param string $key * @param array $classes * @param string $conditional * @param array $data * @param array $field_style * * @return string/html */ function get_atts( $key, $classes, $conditional, $data, $field_style = array() ) { array_unshift( $classes, 'um-field-' . $data['type'] ); array_unshift( $classes, 'um-field' ); $field_atts = array( 'id' => array( "um_field_{$this->set_id}_{$key}", ), 'class' => $classes, 'data-key' => array( esc_attr( $key ) ) ); $fields_without_metakey = UM()->builtin()->get_fields_without_metakey(); if ( in_array( $data['type'], $fields_without_metakey, true ) ) { unset( $field_atts['id'] ); if ( empty( $field_atts['data-key'] ) ) { unset( $field_atts['data-key'] ); } } if ( ! empty( $field_style ) && is_array( $field_style ) ) { $arr_inline_style = ''; foreach ( $field_style as $style_attr => $style_value ) { $arr_inline_style .= esc_attr( $style_attr ) . ':' . esc_attr( $style_value ) . ';'; } $field_atts['style'] = array( $arr_inline_style ); } /** * UM hook * * @type filter * @title um_field_extra_atts * @description user for adding extra field attributes * @input_vars * [{"var":"$field_atts","type":"array","desc":"Field attributes"}, * [{"var":"$key","type":"string","desc":"Field id"}, * {"var":"$data","type":"array","desc":"Field Data"}] * @change_log * ["Since: 2.0.57"] * @usage add_filter( 'um_field_extra_atts', 'function_name', 10, 3 ); * @example * */ $field_atts = apply_filters( 'um_field_extra_atts', $field_atts, $key, $data ); $html_atts = ''; foreach ( $field_atts as $att_name => $att_values ) { $att_values = implode( " ", $att_values ); $html_atts .= " {$att_name}=\"" . esc_attr( $att_values ) . "\""; } $html_atts .= $conditional; return $html_atts; } } }