diff --git a/assets/css/um-members.css b/assets/css/um-members.css
index 771f515b..8ed7073d 100644
--- a/assets/css/um-members.css
+++ b/assets/css/um-members.css
@@ -161,7 +161,7 @@ body #content .um-directory a {
display: flex;
flex-direction: row;
justify-content: flex-start;
- align-items: baseline;
+ align-items: center;
flex-wrap: nowrap;
width: 60%; }
.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label {
diff --git a/assets/img/extensions/profile-tabs.png b/assets/img/extensions/profile-tabs.png
new file mode 100644
index 00000000..2c45ca7f
Binary files /dev/null and b/assets/img/extensions/profile-tabs.png differ
diff --git a/assets/js/um-members.js b/assets/js/um-members.js
index 9ed04bcc..035d2bd0 100644
--- a/assets/js/um-members.js
+++ b/assets/js/um-members.js
@@ -559,16 +559,22 @@ function um_run_search( directory ) {
directory.data( 'page', 1 );
um_set_url_from_data( directory, 'page', '' );
- var show_after_search = directory.data('must-search');
- if ( show_after_search === 1 ) {
- var search = um_get_search( directory );
- if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) {
- directory.data( 'searched', 0 );
- directory.find('.um-members-grid, .um-members-list').remove();
- directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true );
- directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' );
- um_members_hide_preloader( directory );
- return;
+
+ var ignore_after_search = false;
+ ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search );
+
+ if ( ! ignore_after_search ) {
+ var show_after_search = directory.data('must-search');
+ if ( show_after_search === 1 ) {
+ var search = um_get_search( directory );
+ if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) {
+ directory.data( 'searched', 0 );
+ directory.find('.um-members-grid, .um-members-list').remove();
+ directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true );
+ directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' );
+ um_members_hide_preloader( directory );
+ return;
+ }
}
}
@@ -1108,16 +1114,21 @@ jQuery(document.body).ready( function() {
directory.find('.um-clear-filters').show();
}
- var show_after_search = directory.data('must-search');
- if ( show_after_search === 1 ) {
- var search = um_get_search( directory );
- if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) {
- directory.data( 'searched', 0 );
- directory.find('.um-members-grid, .um-members-list').remove();
- directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true );
- directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' );
- um_members_hide_preloader( directory );
- return;
+ var ignore_after_search = false;
+ ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search );
+
+ if ( ! ignore_after_search ) {
+ var show_after_search = directory.data('must-search');
+ if ( show_after_search === 1 ) {
+ var search = um_get_search( directory );
+ if ( directory.find( '.um-members-filter-remove' ).length === 0 && ! search ) {
+ directory.data( 'searched', 0 );
+ directory.find('.um-members-grid, .um-members-list').remove();
+ directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true );
+ directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' );
+ um_members_hide_preloader( directory );
+ return;
+ }
}
}
@@ -1211,16 +1222,21 @@ jQuery(document.body).ready( function() {
directory.find('.um-clear-filters').parents('.um-member-directory-header-row').removeClass( 'um-header-row-invisible' );
}
- var show_after_search = directory.data('must-search');
- if ( show_after_search === 1 ) {
- var search = um_get_search( directory );
- if ( ! search ) {
- directory.data( 'searched', 0 );
- directory.find('.um-members-grid, .um-members-list').remove();
- directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true );
- directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' );
- um_members_hide_preloader( directory );
- return;
+ var ignore_after_search = false;
+ ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search );
+
+ if ( ! ignore_after_search ) {
+ var show_after_search = directory.data('must-search');
+ if ( show_after_search === 1 ) {
+ var search = um_get_search( directory );
+ if ( ! search ) {
+ directory.data( 'searched', 0 );
+ directory.find('.um-members-grid, .um-members-list').remove();
+ directory.find( '.um-member-directory-sorting-options' ).prop( 'disabled', true );
+ directory.find( '.um-member-directory-view-type' ).addClass( 'um-disabled' );
+ um_members_hide_preloader( directory );
+ return;
+ }
}
}
@@ -1486,12 +1502,17 @@ jQuery(document.body).ready( function() {
});
- var show_after_search = directory.data('must-search');
- if ( show_after_search === 1 ) {
- var search = um_get_search( directory );
- var filters_data = um_get_filters_data( directory );
- if ( ! filters_data.length && ! search ) {
- return;
+ var ignore_after_search = false;
+ ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search );
+
+ if ( ! ignore_after_search ) {
+ var show_after_search = directory.data('must-search');
+ if ( show_after_search === 1 ) {
+ var search = um_get_search( directory );
+ var filters_data = um_get_filters_data( directory );
+ if ( ! filters_data.length && ! search ) {
+ return;
+ }
}
}
@@ -1611,17 +1632,21 @@ jQuery(document.body).ready( function() {
}
});
+ var ignore_after_search = false;
+ ignore_after_search = wp.hooks.applyFilters( 'um_member_directory_ignore_after_search', ignore_after_search );
- var show_after_search = directory.data('must-search');
- if ( show_after_search === 1 ) {
- var search = um_get_search( directory );
- var filters_data = um_get_filters_data( directory );
- if ( ! filters_data.length && ! search ) {
- directory.data( 'searched', 0 );
- um_members_hide_preloader( directory );
- return;
- } else {
- directory.data( 'searched', 1 );
+ if ( ! ignore_after_search ) {
+ var show_after_search = directory.data('must-search');
+ if ( show_after_search === 1 ) {
+ var search = um_get_search( directory );
+ var filters_data = um_get_filters_data( directory );
+ if ( ! filters_data.length && ! search ) {
+ directory.data( 'searched', 0 );
+ um_members_hide_preloader( directory );
+ return;
+ } else {
+ directory.data( 'searched', 1 );
+ }
}
}
diff --git a/assets/sass/um-members.sass b/assets/sass/um-members.sass
index 63e292e1..780b8b88 100644
--- a/assets/sass/um-members.sass
+++ b/assets/sass/um-members.sass
@@ -130,7 +130,7 @@ body
&.um-member-directory-search-row
justify-content: flex-end
.um-member-directory-search-line
- +flex( row, flex-start, baseline, nowrap )
+ +flex( row, flex-start, center, nowrap )
width: 60%
label
flex: 1
diff --git a/includes/admin/assets/css/um-admin-forms.css b/includes/admin/assets/css/um-admin-forms.css
index 28e974b7..4e1dcb28 100644
--- a/includes/admin/assets/css/um-admin-forms.css
+++ b/includes/admin/assets/css/um-admin-forms.css
@@ -14,6 +14,28 @@
padding: 0 0 15px 0;
}
+.um-form-table.um-top-label .um-forms-line[data-field_type="icon"] td label {
+ width: 100%;
+ display: block;
+ margin: 0 0 5px 0;
+}
+
+.um_admin_fonticon_wrapper {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ align-items: center;
+}
+
+.um-admin-icon-value {
+ line-height: 1;
+}
+
+.um_admin_fonticon_wrapper .um-admin-icon-value i {
+ top: 0;
+}
+
input[type=text].um-forms-field.um-long-field,
select.um-forms-field.um-long-field,
textarea.um-forms-field.um-long-field {
diff --git a/includes/admin/assets/js/um-admin-modal.js b/includes/admin/assets/js/um-admin-modal.js
index a74eb8bd..cec5ee6c 100644
--- a/includes/admin/assets/js/um-admin-modal.js
+++ b/includes/admin/assets/js/um-admin-modal.js
@@ -387,13 +387,13 @@ jQuery(document).ready(function() {
jQuery(document.body).on('click', '#UM_fonticons a.um-admin-modal-back:not(.um-admin-modal-cancel)', function(){
var v_id = '';
var icon_selected = jQuery(this).attr('data-code');
- if (icon_selected != ''){
+ if ( icon_selected != '' ) {
if ( jQuery(this).attr('data-modal') ) {
v_id = '#' + jQuery(this).attr('data-modal');
} else {
v_id = '.postbox';
}
- jQuery( v_id ).find('input#_icon,input#_um_icon,input#notice__um_icon').val( icon_selected );
+ jQuery( v_id ).find('input#_icon,input#_um_icon,input#notice__um_icon,input#um_profile_tab__icon').val( icon_selected );
jQuery( v_id ).find('span.um-admin-icon-value').html('');
jQuery( v_id ).find('.um-admin-icon-clear').show();
}
diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php
index 5e60f817..5fdb10d0 100644
--- a/includes/admin/core/class-admin-forms.php
+++ b/includes/admin/core/class-admin-forms.php
@@ -523,7 +523,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
$value = $this->get_field_value( $field_data );
$value_attr = ' value="' . $value . '" ';
- $html = '' . __( 'Choose Icon', 'ultimate-member' ) . '
+ $html = '' . __( 'Choose Icon', 'ultimate-member' ) . '
';
if ( ! empty( $value ) ) {
@@ -540,7 +540,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
$html .= '';
}
- $html .= '';
+ $html .= '';
return $html;
}
diff --git a/includes/admin/templates/extensions.php b/includes/admin/templates/extensions.php
index 420484b9..d54df331 100644
--- a/includes/admin/templates/extensions.php
+++ b/includes/admin/templates/extensions.php
@@ -128,6 +128,12 @@ $premium['unsplash'] = array(
'desc' => 'Allow users to select a profile cover photo from Unsplash from their profile',
);
+$premium['profile-tabs'] = array(
+ 'url' => 'https://ultimatemember.com/extensions/profile-tabs/',
+ 'name' => 'Profile Tabs',
+ 'desc' => 'Allow users to add custom tabs to profiles',
+);
+
$free['forumwp'] = array(
'url' => 'https://ultimatemember.com/extensions/forumwp/',
'name' => 'ForumWP',
diff --git a/includes/class-dependencies.php b/includes/class-dependencies.php
index 315a3759..a75b4495 100644
--- a/includes/class-dependencies.php
+++ b/includes/class-dependencies.php
@@ -47,6 +47,7 @@ if ( ! class_exists( 'um\Dependencies' ) ) {
'online' => '2.1.1',
'private-content' => '2.0.5',
'profile-completeness' => '2.1.2',
+ 'profile-tabs' => '1.0.0',
'recaptcha' => '2.1.2',
'reviews' => '2.1.5',
'social-activity' => '2.2.0',
@@ -64,7 +65,7 @@ if ( ! class_exists( 'um\Dependencies' ) ) {
/*rc*/
'user-notes' => '2.0',
- 'profile-tabs' => '1.6',
+
/*beta*/
'frontend-posting' => '1.0',
diff --git a/includes/class-init.php b/includes/class-init.php
index 5397c187..e50c75e7 100644
--- a/includes/class-init.php
+++ b/includes/class-init.php
@@ -37,6 +37,7 @@ if ( ! class_exists( 'UM' ) ) {
* @method UM_User_Bookmarks User_Bookmarks()
* @method UM_Unsplash Unsplash()
* @method UM_ForumWP ForumWP()
+ * @method UM_Profile_Tabs Profile_Tabs()
*/
final class UM extends UM_Functions {
diff --git a/includes/core/class-enqueue.php b/includes/core/class-enqueue.php
index 3a815b8a..dbe487fd 100644
--- a/includes/core/class-enqueue.php
+++ b/includes/core/class-enqueue.php
@@ -43,6 +43,22 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) {
$this->js_baseurl = um_url . 'assets/js/';
$this->css_baseurl = um_url . 'assets/css/';
+ add_action( 'init', array( &$this, 'scripts_enqueue_priority' ) );
+ }
+
+
+ /**
+ *
+ */
+ function scripts_enqueue_priority() {
+ add_action( 'wp_enqueue_scripts', array( &$this, 'wp_enqueue_scripts' ), $this->get_priority() );
+ }
+
+
+ /**
+ * @return int
+ */
+ function get_priority() {
/**
* UM hook
*
@@ -63,8 +79,7 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) {
* }
* ?>
*/
- $priority = apply_filters( 'um_core_enqueue_priority', 100 );
- add_action( 'wp_enqueue_scripts', array( &$this, 'wp_enqueue_scripts' ), $priority );
+ return apply_filters( 'um_core_enqueue_priority', 100 );
}
@@ -80,7 +95,7 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) {
wp_dequeue_script( 'select2');
wp_deregister_script('select2');
}
- wp_register_script( 'select2', $this->js_baseurl . 'select2/select2.full.min.js', array( 'jquery', 'jquery-masonry' ), ultimatemember_version, true );
+ wp_register_script( 'select2', $this->js_baseurl . 'select2/select2.full.min.js', array( 'jquery' ), ultimatemember_version, true );
wp_register_script( 'um_scrollbar', $this->js_baseurl . 'simplebar' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true );
@@ -141,7 +156,7 @@ if ( ! class_exists( 'um\core\Enqueue' ) ) {
wp_register_script('um_dropdown', $this->js_baseurl . 'dropdown' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true );
- wp_register_script('um_members', $this->js_baseurl . 'um-members' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'jquery-ui-slider', 'um_dropdown', 'wp-hooks', 'jquery-masonry' ), ultimatemember_version, true );
+ wp_register_script('um_members', $this->js_baseurl . 'um-members' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'jquery-ui-slider', 'um_dropdown', 'wp-hooks', 'jquery-masonry', 'um_scripts' ), ultimatemember_version, true );
wp_register_script('um_profile', $this->js_baseurl . 'um-profile' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'wp-i18n' ), ultimatemember_version, true );
wp_register_script('um_account', $this->js_baseurl . 'um-account' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true );
diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php
index 9dabd21c..774ea3ef 100644
--- a/includes/core/class-fields.php
+++ b/includes/core/class-fields.php
@@ -21,6 +21,12 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
var $set_mode = '';
+ /**
+ * @var int form_id
+ */
+ public $set_id = null;
+
+
/**
* Fields constructor.
*/
@@ -3869,76 +3875,82 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
/* Default */
default:
- $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>';
+ $_field_value = $this->field_value( $key, $default, $data );
- if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) {
+ if ( ! isset( $_field_value ) || $_field_value == '' ) {
+ $output = '';
+ } else {
+ $output .= '
get_atts( $key, $classes, $conditional, $data ) . '>';
- if ( ! isset( $data['label'] ) ) {
- $data['label'] = '';
+ if ( isset( $data['label'] ) || ! empty( $data['icon'] ) ) {
+
+ if ( ! isset( $data['label'] ) ) {
+ $data['label'] = '';
+ }
+
+ $output .= $this->field_label( $data['label'], $key, $data );
}
- $output .= $this->field_label( $data['label'], $key, $data );
+ $res = $this->field_value( $key, $default, $data );
+
+ if ( ! empty( $res ) ) {
+ $res = stripslashes( $res );
+ }
+
+ $data['is_view_field'] = true;
+ /**
+ * UM hook
+ *
+ * @type filter
+ * @title um_view_field
+ * @description Change field HTML on view mode
+ * @input_vars
+ * [{"var":"$output","type":"string","desc":"Field HTML"},
+ * {"var":"$data","type":"string","desc":"Field Data"},
+ * {"var":"$type","type":"string","desc":"Field Type"}]
+ * @change_log
+ * ["Since: 2.0"]
+ * @usage add_filter( 'um_view_field', 'function_name', 10, 3 );
+ * @example
+ *
+ */
+ $res = apply_filters( 'um_view_field', $res, $data, $type );
+ /**
+ * UM hook
+ *
+ * @type filter
+ * @title um_view_field_value_{$type}
+ * @description Change field HTML on view mode by field type
+ * @input_vars
+ * [{"var":"$output","type":"string","desc":"Field HTML"},
+ * {"var":"$data","type":"string","desc":"Field Data"}]
+ * @change_log
+ * ["Since: 2.0"]
+ * @usage add_filter( 'um_view_field_value_{$type}', 'function_name', 10, 2 );
+ * @example
+ *
+ */
+ $res = apply_filters( "um_view_field_value_{$type}", $res, $data );
+
+ $output .= '
';
+ $output .= '
' . $res . '
';
+ $output .= '
';
+
+ $output .= '
';
}
- $res = $this->field_value( $key, $default, $data );
-
- if ( ! empty( $res ) ) {
- $res = stripslashes( $res );
- }
-
- $data['is_view_field'] = true;
- /**
- * UM hook
- *
- * @type filter
- * @title um_view_field
- * @description Change field HTML on view mode
- * @input_vars
- * [{"var":"$output","type":"string","desc":"Field HTML"},
- * {"var":"$data","type":"string","desc":"Field Data"},
- * {"var":"$type","type":"string","desc":"Field Type"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_filter( 'um_view_field', 'function_name', 10, 3 );
- * @example
- *
- */
- $res = apply_filters( 'um_view_field', $res, $data, $type );
- /**
- * UM hook
- *
- * @type filter
- * @title um_view_field_value_{$type}
- * @description Change field HTML on view mode by field type
- * @input_vars
- * [{"var":"$output","type":"string","desc":"Field HTML"},
- * {"var":"$data","type":"string","desc":"Field Data"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_filter( 'um_view_field_value_{$type}', 'function_name', 10, 2 );
- * @example
- *
- */
- $res = apply_filters( "um_view_field_value_{$type}", $res, $data );
-
- $output .= '
';
- $output .= '
' . $res . '
';
- $output .= '
';
-
- $output .= '
';
-
break;
/* HTML */
diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php
index 1167b2c1..1add7b45 100644
--- a/includes/core/class-member-directory.php
+++ b/includes/core/class-member-directory.php
@@ -490,7 +490,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$values_array = ( ! empty( $users_roles['avail_roles'] ) && is_array( $users_roles['avail_roles'] ) ) ? array_keys( array_filter( $users_roles['avail_roles'] ) ) : array();
}
- if ( ! empty( $values_array ) && in_array( $attrs['type'], array( 'select','multiselect', 'checkbox', 'radio' ) ) ) {
+ if ( ! empty( $values_array ) && in_array( $attrs['type'], array( 'select', 'multiselect', 'checkbox', 'radio' ) ) ) {
$values_array = array_map( 'maybe_unserialize', $values_array );
$temp_values = array();
foreach ( $values_array as $values ) {
@@ -546,7 +546,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
if ( $attrs['metakey'] != 'role_select' && empty( $custom_dropdown ) ) {
- $attrs['options'] = array_intersect( $attrs['options'], $values_array );
+ $attrs['options'] = array_intersect( array_map( 'stripslashes', $attrs['options'] ), $values_array );
} elseif ( ! empty( $custom_dropdown ) ) {
$attrs['options'] = array_intersect_key( $attrs['options'], array_flip( $values_array ) );
} else {
@@ -568,7 +568,9 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$attrs['label'] = strip_tags( $attrs['label'] );
}
- ksort( $attrs['options'] ); ?>
+ ksort( $attrs['options'] );
+
+ $attrs['options'] = apply_filters( 'um_member_directory_filter_select_options_sorted', $attrs['options'], $attrs ); ?>