builtin()->blacklist_field_err( $submission_data['post']['_metakey'] ); if ( ! empty( $blacklist_error ) ) { $errors['_metakey'] = $blacklist_error; return $errors; } $field_attr = UM()->builtin()->get_core_field_attrs( $submission_data['field_type'] ); if ( ! array_key_exists( 'validate', $field_attr ) ) { return $errors; } $validate = $field_attr['validate']; foreach ( $validate as $post_input => $arr ) { /** * Filters the marker for skipping field validation. * * @param {bool} $skip Errors list. It's null by default. * @param {string} $post_input Field key for validation. * @param {array} $submission_data Update field handler data. * * @return {bool} True for skipping validation. * * @since 2.1.0 * @hook um_admin_builder_skip_field_validation * * @example Skipping validation for the `_options` setting field for `billing_country` and `shipping_country` form fields. * function my_custom_um_admin_builder_skip_field_validation( $skip, $post_input, $submission_data ) { * if ( $post_input === '_options' && isset( $submission_data['post']['_metakey'] ) && in_array( $submission_data['post']['_metakey'], array( 'billing_country', 'shipping_country' ), true ) ) { * $skip = true; * } * return $skip; * } * add_filter( 'um_admin_builder_skip_field_validation', 'my_custom_um_admin_builder_skip_field_validation', 10, 3 ); */ $skip = apply_filters( 'um_admin_builder_skip_field_validation', false, $post_input, $submission_data ); if ( $skip ) { continue; } if ( ! array_key_exists( 'mode', $arr ) ) { continue; } switch ( $arr['mode'] ) { case 'numeric': if ( ! empty( $submission_data['post'][ $post_input ] ) && ! is_numeric( $submission_data['post'][ $post_input ] ) ) { $errors[ $post_input ] = $arr['error']; } break; case 'unique': if ( ! isset( $submission_data['post']['edit_mode'] ) ) { $mode_error = UM()->builtin()->unique_field_err( $submission_data['post'][ $post_input ] ); if ( ! empty( $mode_error ) ) { $errors[ $post_input ] = $mode_error; } } break; case 'required': if ( '' === $submission_data['post'][ $post_input ] ) { $errors[ $post_input ] = $arr['error']; } break; case 'range-start': if ( 'date_range' === $submission_data['post']['_range'] ) { $mode_error = UM()->builtin()->date_range_start_err( $submission_data['post'][ $post_input ] ); if ( ! empty( $mode_error ) ) { $errors[ $post_input ] = $mode_error; } } break; case 'range-end': if ( 'date_range' === $submission_data['post']['_range'] ) { $mode_error = UM()->builtin()->date_range_end_err( $submission_data['post'][ $post_input ], $submission_data['post']['_range_start'] ); if ( ! empty( $mode_error ) ) { $errors[ $post_input ] = $mode_error; } } break; } } return $errors; } /** * Some fields may require extra fields before saving. * * @param array $submission_data * * @return array */ public function um_admin_pre_save_fields_hook( $submission_data ) { if ( ! array_key_exists( 'form_id', $submission_data ) || ! array_key_exists( 'field_type', $submission_data ) || ! array_key_exists( 'post', $submission_data ) ) { return $submission_data; } $form_id = $submission_data['form_id']; $field_type = $submission_data['field_type']; $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); $count = 1; if ( ! empty( $fields ) ) { $count = count( $fields ) + 1; } // Set unique meta key. $fields_without_metakey = UM()->builtin()->get_fields_without_metakey(); if ( ! array_key_exists( '_metakey', $submission_data['post'] ) && in_array( $field_type, $fields_without_metakey, true ) ) { $submission_data['post']['_metakey'] = "um_{$field_type}_{$form_id}_{$count}"; } // Set position. if ( ! array_key_exists( '_position', $submission_data['post'] ) ) { $submission_data['post']['_position'] = $count; } return $submission_data; } /** * Modify field args just before it is saved into form * * @param $array * * @return mixed */ function um_admin_pre_save_field_to_form( $array ){ unset( $array['conditions'] ); if ( isset($array['conditional_field']) && ! empty( $array['conditional_action'] ) && ! empty( $array['conditional_operator'] ) ) { $array['conditional_value'] = isset( $array['conditional_value'] ) ? $array['conditional_value'] : ''; $array['conditions'][] = array( $array['conditional_action'], $array['conditional_field'], $array['conditional_operator'], $array['conditional_value'] ); } if ( isset( $array['conditional_field1'] ) && ! empty( $array['conditional_action1'] ) && ! empty( $array['conditional_operator1'] ) ) { $array['conditional_value1'] = isset( $array['conditional_value1'] ) ? $array['conditional_value1'] : ''; $array['conditions'][] = array( $array['conditional_action1'], $array['conditional_field1'], $array['conditional_operator1'], $array['conditional_value1'] ); } if ( isset( $array['conditional_field2'] ) && ! empty( $array['conditional_action2'] ) && ! empty( $array['conditional_operator2'] ) ) { $array['conditional_value2'] = isset( $array['conditional_value2'] ) ? $array['conditional_value2'] : ''; $array['conditions'][] = array( $array['conditional_action2'], $array['conditional_field2'], $array['conditional_operator2'], $array['conditional_value2'] ); } if ( isset( $array['conditional_field3'] ) && ! empty( $array['conditional_action3'] ) && ! empty( $array['conditional_operator3'] ) ) { $array['conditional_value3'] = isset( $array['conditional_value3'] ) ? $array['conditional_value3'] : ''; $array['conditions'][] = array( $array['conditional_action3'], $array['conditional_field3'], $array['conditional_operator3'], $array['conditional_value3'] ); } if ( isset( $array['conditional_field4'] ) && ! empty( $array['conditional_action4'] ) && ! empty( $array['conditional_operator4'] ) ) { $array['conditional_value4'] = isset( $array['conditional_value4'] ) ? $array['conditional_value4'] : ''; $array['conditions'][] = array( $array['conditional_action4'], $array['conditional_field4'], $array['conditional_operator4'], $array['conditional_value4'] ); } return $array; } /** * Put status handler in modal */ function add_message_handlers() { ?>
metabox(); if ( isset( $field_args['conditional_support'] ) && $field_args['conditional_support'] == 0 ) { return; } ?>
in_edit = true; $metabox->edit_array = $edit_array; ?> tooltip( __( 'Here you can setup conditional logic to show/hide this field based on specific fields value or conditions', 'ultimate-member' ) ); ?> tooltip( __( 'Here you can setup conditional logic to show/hide this field based on specific fields value or conditions', 'ultimate-member' ) ); ?>
field_input( '_conditional_action', $form_id ); ?> field_input( '_conditional_field', $form_id ); ?> field_input( '_conditional_operator', $form_id ); ?> field_input( '_conditional_value', $form_id ); ?>



$arr ) { if ( $k == 0 ) $k = ''; ?>
field_input( '_conditional_action' . $k, $form_id ); ?> field_input( '_conditional_field' . $k , $form_id ); ?> field_input( '_conditional_operator' . $k, $form_id ); ?> field_input( '_conditional_value' . $k, $form_id ); ?>

field_input( '_conditional_action', $form_id ); ?> field_input( '_conditional_field', $form_id ); ?> field_input( '_conditional_operator', $form_id ); ?> field_input( '_conditional_value', $form_id ); ?>

admin()->check_ajax_nonce(); if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { wp_send_json_error( __( 'Please login as administrator', 'ultimate-member' ) ); } ob_start(); $this->form_id = absint( $_POST['form_id'] ); $this->show_builder(); $output = ob_get_clean(); if ( is_array( $output ) ) { print_r( $output ); } else { echo $output; } die; } /** * Sort sub-row fields by position. * Callback for `uasort()` function * * @param array $a Array item. * @param array $b Array item. * * @return int */ public function sorting_fields_by_position( $a, $b ) { if ( empty( $a['position'] ) ) { $a['position'] = 0; } if ( empty( $b['position'] ) ) { $b['position'] = 0; } $a['position'] = absint( $a['position'] ); $b['position'] = absint( $b['position'] ); if ( $a['position'] === $b['position'] ) { return 0; } return ( $a['position'] < $b['position'] ) ? -1 : 1; } /** * Get fields in row * * @param $row_id * * @return string */ public function get_fields_by_row( $row_id ) { if ( empty( $this->global_fields ) || ! is_array( $this->global_fields ) ) { $this->global_fields = array(); } foreach ( $this->global_fields as $key => $array ) { if ( ! isset( $array['in_row'] ) || ( isset( $array['in_row'] ) && $array['in_row'] == $row_id ) ) { $results[ $key ] = $array; unset( $this->global_fields[ $key ] ); } } return isset( $results ) ? $results : ''; } /** * Get fields by sub row * * @param $row_fields * @param $subrow_id * * @return string */ 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; unset( $this->global_fields[ $key ] ); } } return ( isset ( $results ) ) ? $results : ''; } /** * Display the builder. */ public function show_builder() { $fields = UM()->query()->get_attr( 'custom_fields', $this->form_id ); if ( empty( $fields ) ) { ?>
global_fields = is_array( $fields ) ? $fields : array(); foreach ( $this->global_fields as $key => $field_data ) { if ( array_key_exists( 'type', $field_data ) && 'row' === $field_data['type'] ) { $rows[ $key ] = $field_data; unset( $this->global_fields[ $key ] ); // Remove rows from global fields because not needed below. } } // Set 1st row if there aren't any rows in form. if ( empty( $rows ) ) { $rows = array( '_um_row_1' => array( 'type' => 'row', 'id' => '_um_row_1', 'sub_rows' => 1, 'cols' => 1, ), ); } foreach ( $rows as $row_id => $array ) { ?>
get_fields_by_row( $row_id ); $sub_rows = array_key_exists( 'sub_rows', $array ) ? $array['sub_rows'] : 1; for ( $c = 0; $c < $sub_rows; $c++ ) { $subrow_fields = $this->get_fields_in_subrow( $row_fields, $c ); ?>
0 ) { ?>
$keyarray ) { if ( ! array_key_exists( 'type', $keyarray ) || ! array_key_exists( 'title', $keyarray ) ) { continue; } $field_type = $keyarray['type']; $field_title = $keyarray['title']; $in_group = array_key_exists( 'in_group', $keyarray ) ? $keyarray['in_group'] : ''; $in_column = array_key_exists( 'in_column', $keyarray ) ? $keyarray['in_column'] : 1; $icon = array_key_exists( 'icon', $keyarray ) ? $keyarray['icon'] : ''; $field_name = __( 'Invalid field type', 'ultimate-member' ); if ( array_key_exists( $field_type, UM()->builtin()->core_fields ) && array_key_exists( 'name', UM()->builtin()->core_fields[ $field_type ] ) ) { $field_name = UM()->builtin()->core_fields[ $field_type ]['name']; } ?>
admin()->check_ajax_nonce(); if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { wp_send_json_error( __( 'Please login as administrator', 'ultimate-member' ) ); } $output['error'] = null; // phpcs:disable WordPress.Security.NonceVerification -- Already verified by `UM()->admin()->check_ajax_nonce()` $array = array( 'field_type' => sanitize_key( $_POST['_type'] ), 'form_id' => absint( $_POST['post_id'] ), 'args' => UM()->builtin()->get_core_field_attrs( sanitize_key( $_POST['_type'] ) ), 'post' => UM()->admin()->sanitize_builder_field_meta( $_POST ), ); // phpcs:enable WordPress.Security.NonceVerification -- Already verified by `UM()->admin()->check_ajax_nonce()` /** * Filters the field data before save in Form Builder. * * @param {array} $submission_data Update field handler data. Already sanitized here. * * @return {array} Update field handler data. * * @since 1.3.x * @hook um_admin_pre_save_fields_hook * * @example Change submitted value to new one by the field key. * function my_custom_um_admin_pre_save_fields_hook( $submission_data ) { * $submission_data['post']['{field_key}'] = {new value}; * return $submission_data; * } * add_filter( 'um_admin_pre_save_fields_hook', 'my_custom_um_admin_pre_save_fields_hook' ); */ $array = apply_filters( 'um_admin_pre_save_fields_hook', $array ); /** * Filters the validation errors on the update field in Form Builder. * * @param {null|array} $errors Errors list. It's null by default. * @param {array} $submission_data Update field handler data. * * @return {array} Errors list. * * @since 1.3.x * @hook um_admin_field_update_error_handling * * @example Added error with Error text to the field by the field key. * function my_custom_um_admin_field_update_error_handling( $errors, $submission_data ) { * $errors['{field_key}'] = {Error text}; * return $errors; * } * add_filter( 'um_admin_field_update_error_handling', 'my_custom_um_admin_field_update_error_handling', 10, 2 ); */ $output['error'] = apply_filters( 'um_admin_field_update_error_handling', $output['error'], $array ); if ( empty( $output['error'] ) ) { $save = array(); $field_id = $array['post']['_metakey']; // Set field ID as it's metakey. $save[ $field_id ] = null; foreach ( $array['post'] as $key => $val ) { if ( '' !== $val && '_' === substr( $key, 0, 1 ) ) { // field attribute $new_key = ltrim( $key, '_' ); if ( 'options' === $new_key ) { $save[ $field_id ][ $new_key ] = preg_split( '/[\r\n]+/', $val, -1, PREG_SPLIT_NO_EMPTY ); } else { $save[ $field_id ][ $new_key ] = $val; } } elseif ( false !== strpos( $key, 'um_editor' ) ) { if ( 'block' === $array['post']['_type'] ) { // the nl2br() function does not work as expected, there is an extra empty line left // use str_replace for correct work $val = str_replace( "\r\n\r\n", '
', $val ); $save[ $field_id ]['content'] = wp_kses_post( $val ); } else { $save[ $field_id ]['content'] = sanitize_textarea_field( $val ); } } } /** * Filters the field options before save to form on the update field in Form Builder. * * @param {array} $field_args Field Options. * * @return {array} Field Options. * * @since 1.3.x * @hook um_admin_pre_save_field_to_form * * @example Force change the field's metakey when store it to DB for the form. * function my_custom_um_admin_pre_save_field_to_form( $field_args ) { * $field_args['metakey'] = {new_metakey}; * return $field_args; * } * add_filter( 'um_admin_pre_save_field_to_form', 'my_custom_um_admin_pre_save_field_to_form' ); */ $field_args = apply_filters( 'um_admin_pre_save_field_to_form', $save[ $field_id ] ); UM()->fields()->update_field( $field_id, $field_args, $array['post']['post_id'] ); /** * Filters the field options before save to DB (globally) on the update field in Form Builder. * * @param {array} $field_args Field Options. * * @return {array} Field Options. * * @since 1.3.x * @hook um_admin_pre_save_field_to_db * * @example Force change the field's metakey when store it to DB globally. * function my_custom_um_admin_pre_save_field_to_db( $field_args ) { * $field_args['metakey'] = {new_metakey}; * return $field_args; * } * add_filter( 'um_admin_pre_save_field_to_db', 'my_custom_um_admin_pre_save_field_to_db' ); */ $field_args = apply_filters( 'um_admin_pre_save_field_to_db', $field_args ); if ( ! isset( $array['args']['form_only'] ) ) { if ( ! isset( UM()->builtin()->predefined_fields[ $field_id ] ) ) { UM()->fields()->globally_update_field( $field_id, $field_args ); } } } wp_send_json_success( $output ); } /** * AJAX handler for dynamic content inside the modal window. */ public function dynamic_modal_content() { UM()->admin()->check_ajax_nonce(); if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { wp_send_json_error( __( 'Please login as administrator', 'ultimate-member' ) ); } // phpcs:disable WordPress.Security.NonceVerification -- already verified here if ( empty( $_POST['act_id'] ) ) { wp_send_json_error( __( 'Wrong dynamic-content attribute.', 'ultimate-member' ) ); } $metabox = UM()->metabox(); $act_id = sanitize_key( $_POST['act_id'] ); $arg1 = null; if ( isset( $_POST['arg1'] ) ) { $arg1 = sanitize_text_field( $_POST['arg1'] ); } $arg2 = null; if ( isset( $_POST['arg2'] ) ) { $arg2 = sanitize_text_field( $_POST['arg2'] ); } $arg3 = null; if ( isset( $_POST['arg3'] ) ) { $arg3 = sanitize_text_field( $_POST['arg3'] ); } $form_mode = null; if ( isset( $_POST['form_mode'] ) ) { $form_mode = sanitize_key( $_POST['form_mode'] ); } $in_row = null; if ( isset( $_POST['in_row'] ) ) { $in_row = absint( $_POST['in_row'] ); } $in_sub_row = null; if ( isset( $_POST['in_sub_row'] ) ) { $in_sub_row = absint( $_POST['in_sub_row'] ); } $in_column = null; if ( isset( $_POST['in_column'] ) ) { $in_column = absint( $_POST['in_column'] ); } $in_group = null; if ( isset( $_POST['in_group'] ) ) { $in_group = absint( $_POST['in_group'] ); } // phpcs:enable WordPress.Security.NonceVerification -- already verified here switch ( $act_id ) { default: ob_start(); /** * Fires for integration on AJAX popup admin builder modal content. * * @since 1.3.x * @hook um_admin_ajax_modal_content__hook * * @param {string} $act_id `data-dynamic-content` attribute value. Modal action. * * @example Pass HTML to the custom UM modal with data-dynamic-content="user_info". * function my_custom_um_admin_ajax_modal_content__hook( $act_id ) { * if ( 'user_info' === $act_id ) { * // Your HTML is here * } * } * add_action( 'um_admin_ajax_modal_content__hook', 'my_custom_um_admin_ajax_modal_content__hook' ); */ do_action( 'um_admin_ajax_modal_content__hook', $act_id ); /** * Fires for integration on AJAX popup admin builder modal content. * * Note: $act_id `data-dynamic-content` attribute value. Modal action. * * @since 1.3.x * @hook um_admin_ajax_modal_content__hook_{$act_id} * @deprecated Partially deprecated since 2.6.4. Use common 'um_admin_ajax_modal_content__hook' and pass `$act_id` as callback attribute. * @todo Fully deprecate since 2.7.0 * * @example Pass HTML to the custom UM modal with data-dynamic-content="user_info". * function my_custom_um_admin_ajax_modal_content__hook_user_info() { * // Your HTML is here for `user_info` modal * } * add_action( 'um_admin_ajax_modal_content__hook_user_info', 'my_custom_um_admin_ajax_modal_content__hook_user_info' ); */ do_action( 'um_admin_ajax_modal_content__hook_' . $act_id ); $output = ob_get_clean(); break; case 'um_admin_fonticon_selector': ob_start(); ?>
fonticons()->all as $icon ) { ?>
query()->get_attr( 'custom_fields', $arg2 ); $form_fields = array_values( array_filter( array_keys( $form_fields ) ) ); ?>

builtin()->core_fields ) { foreach ( UM()->builtin()->core_fields as $field_type => $field_data ) { if ( isset( $field_data['in_fields'] ) && false === $field_data['in_fields'] ) { continue; } ?>

builtin()->predefined_fields ) { foreach ( UM()->builtin()->predefined_fields as $field_key => $field_data ) { if ( array_key_exists( 'account_only', $field_data ) && true === $field_data['account_only'] ) { continue; } if ( array_key_exists( 'private_use', $field_data ) && true === $field_data['private_use'] ) { continue; } ?> data-silent_action="um_admin_add_field_from_predefined" data-arg1="" data-arg2="" title="">

builtin()->custom_fields ) { foreach ( UM()->builtin()->custom_fields as $field_key => $array ) { if ( empty( $array['title'] ) || empty( $array['type'] ) ) { continue; } ?> data-silent_action="um_admin_add_field_from_list" data-arg1="" data-arg2="" title=""> ()

builtin()->custom_fields ) { ?> style="display: none;">

builtin()->get_core_field_attrs( $arg1 ); $form_fields = UM()->query()->get_attr( 'custom_fields', $arg2 ); if ( ! array_key_exists( $arg3, $form_fields ) ) { $output = '

' . esc_html__( 'This field is not setup correctly for this form.', 'ultimate-member' ) . '

'; break; } $metabox->set_field_type = $arg1; $metabox->in_edit = true; $metabox->edit_array = $form_fields[ $arg3 ]; if ( ! array_key_exists( 'metakey', $metabox->edit_array ) ) { $metabox->edit_array['metakey'] = $metabox->edit_array['id']; } if ( ! array_key_exists( 'position', $metabox->edit_array ) ) { $metabox->edit_array['position'] = $metabox->edit_array['id']; } ob_start(); if ( ! array_key_exists( 'col1', $field_type_data ) ) { ?>

edit_array['content'] ) ? wp_kses( $metabox->edit_array['content'], UM()->get_allowed_html( 'templates' ) ) : ''; ?>
modal_header(); ?>
field_input( $opt, $arg2, $metabox->edit_array ); } } ?>
field_input( $opt, $arg2, $metabox->edit_array ); } } ?>
field_input( $opt, $arg2, $metabox->edit_array ); } } ?>
field_input( $opt, $arg2, $metabox->edit_array ); } } $this->modal_footer( $arg2, $field_type_data, $metabox ); } $output = ob_get_clean(); break; case 'um_admin_new_field_popup': // $arg1 means `field_type` variable in this case. // $arg2 means `form_id` variable in this case. $field_type_data = UM()->builtin()->get_core_field_attrs( $arg1 ); $metabox->set_field_type = $arg1; ob_start(); if ( ! array_key_exists( 'col1', $field_type_data ) ) { ?>

modal_header(); ?>
field_input( $opt, $arg2 ); } } ?>
field_input( $opt, $arg2 ); } } ?>
field_input( $opt, $arg2 ); } } ?>
field_input( $opt, $arg2 ); } } $this->modal_footer( $arg2, $field_type_data, $metabox ); } $output = ob_get_clean(); break; case 'um_admin_preview_form': // $arg1 means `form_id` variable in this case. UM()->user()->preview = true; $mode = UM()->query()->get_attr( 'mode', $arg1 ); if ( empty( $mode ) ) { $mode = $form_mode; } if ( 'profile' === $mode ) { UM()->fields()->editing = true; } $output = '
'; $output .= apply_shortcodes( '[ultimatemember form_id="' . $arg1 . '" /]' ); break; case 'um_admin_review_registration': // $arg1 means `user_id` variable in this case. if ( ! current_user_can( 'administrator' ) && ! um_can_view_profile( $arg1 ) ) { $output = ''; break; } um_fetch_user( $arg1 ); UM()->user()->preview = true; $output = um_user_submitted_registration_formatted( true ); um_reset_user(); break; } // @todo WPCS through wp_kses. echo $output; die; } /** * */ function modal_header() { /** * UM hook * * @type action * @title um_admin_field_modal_header * @description Modal Window Header * @change_log * ["Since: 2.0"] * @usage add_action( 'um_admin_field_modal_header', 'function_name', 10 ); * @example * */ do_action( 'um_admin_field_modal_header' ); } /** * Modal Footer loading * * @param $arg2 * @param $args * @param $metabox */ function modal_footer( $arg2, $args, $metabox ) { /** * UM hook * * @type action * @title um_admin_field_modal_footer * @description Modal Window Footer * @input_vars * [{"var":"$arg2","type":"string","desc":"Ajax Action"}, * {"var":"$args","type":"array","desc":"Modal window arguments"}, * {"var":"$in_edit","type":"bool","desc":"Is edit mode?"}, * {"var":"$edit_array","type":"array","desc":"Edit Array"}] * @change_log * ["Since: 2.0"] * @usage add_action( 'um_admin_field_modal_footer', 'function_name', 10, 4 ); * @example * */ do_action( 'um_admin_field_modal_footer', $arg2, $args, $metabox->in_edit, ( isset( $metabox->edit_array ) ) ? $metabox->edit_array : '' ); } /** * Skip field validation for: * - '_options' if Choices Callback specified * * @param boolean $skip * @param string $post_input * @param array $array * @return boolean */ public function skip_field_validation( $skip, $post_input, $array ) { if ( $post_input === '_options' && isset( $array['post']['_custom_dropdown_options_source'] ) ) { $skip = function_exists( wp_unslash( $array['post']['_custom_dropdown_options_source'] ) ); } return $skip; } /** * Retrieves dropdown/multi-select options from a callback function */ function populate_dropdown_options() { UM()->admin()->check_ajax_nonce(); if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) { wp_send_json_error( __( 'This is not possible for security reasons.', 'ultimate-member' ) ); } $arr_options = array(); // we can not use `sanitize_key()` because it removes backslash needed for namespace and uppercase symbols $um_callback_func = sanitize_text_field( $_POST['um_option_callback'] ); // removed added by sanitize slashes for the namespaces $um_callback_func = wp_unslash( $um_callback_func ); if ( empty( $um_callback_func ) ) { $arr_options['status'] = 'empty'; $arr_options['function_name'] = $um_callback_func; $arr_options['function_exists'] = function_exists( $um_callback_func ); } if ( UM()->fields()->is_source_blacklisted( $um_callback_func ) ) { wp_send_json_error( __( 'This is not possible for security reasons. Don\'t use internal PHP functions.', 'ultimate-member' ) ); } $arr_options['data'] = array(); if ( function_exists( $um_callback_func ) ) { $arr_options['data'] = call_user_func( $um_callback_func ); } wp_send_json( $arr_options ); } } }