Merge pull request #922 from ultimatemember/development/2.2.6

Development process 2.3.0
This commit is contained in:
Nikita Sinelnikov
2021-12-17 13:20:45 +02:00
committed by GitHub
35 changed files with 781 additions and 219 deletions
+3 -1
View File
@@ -218,5 +218,7 @@ pip-log.txt
node_modules/
assets/vendor/
/vendor/
package-lock.json
.idea
.idea/
composer.lock
+2 -2
View File
@@ -4,8 +4,8 @@ jQuery(document).ready(function() {
if ( current_tab ) {
jQuery('.um-account-tab[data-tab="'+current_tab+'"]').show();
jQuery('.um-account-tab:not(:visible)').find( 'input, select, textarea' ).not( ':disabled' ).addClass('um_account_inactive').prop( 'disabled', true ).attr( 'disabled', true );
wp.hooks.doAction( 'um_account_active_tab_inited', current_tab );
}
jQuery( document.body ).on( 'click', '.um-account-side li a', function(e) {
@@ -103,4 +103,4 @@ jQuery(document).ready(function() {
});
});
});
+1 -1
View File
@@ -1 +1 @@
jQuery(document).ready(function(){var a=jQuery(".um-account-main").attr("data-current_tab");a&&(jQuery('.um-account-tab[data-tab="'+a+'"]').show(),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0)),jQuery(document.body).on("click",".um-account-side li a",function(a){a.preventDefault();var e=jQuery(this);e.parents("ul").find("li a").removeClass("current"),e.addClass("current");var t=jQuery(this).attr("href"),u=jQuery(this).attr("data-tab");return jQuery('input[id="_um_account_tab"]:hidden').val(u),window.history.pushState("","",t),jQuery(".um-account-tab").hide(),jQuery('.um-account-tab[data-tab="'+u+'"]').fadeIn(),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-nav a").removeClass("current"),jQuery('.um-account-nav a[data-tab="'+u+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",u),!1}),jQuery(document.body).on("click",".um-account-nav a",function(a){a.preventDefault();var e=jQuery(this).attr("data-tab"),t=jQuery(this).parents("div"),u=jQuery(this);return jQuery('input[id="_um_account_tab"]:hidden').val(e),jQuery(".um-account-tab").hide(),u.hasClass("current")?(t.next(".um-account-tab").slideUp(),u.removeClass("current")):(t.next(".um-account-tab").slideDown(),u.parents("div").find("a").removeClass("current"),u.addClass("current")),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-side li a").removeClass("current"),jQuery('.um-account-side li a[data-tab="'+e+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",e),!1}),jQuery(document.body).on("click",".um-request-button",function(a){a.preventDefault();var e=jQuery(this).data("action"),t=jQuery("#"+e).val();if(jQuery(".um-field-area-response."+e).hide(),jQuery("#"+e).length&&""===t)jQuery(".um-field-error."+e).show();else{jQuery(".um-field-error."+e).hide();var u={request_action:e,nonce:um_scripts.nonce};jQuery("#"+e).length&&(u.password=t),wp.ajax.send("um_request_user_data",{data:u,success:function(a){jQuery(".um-field-area-response."+e).text(a.answer).show()},error:function(a){console.log(a)}})}})});
jQuery(document).ready(function(){var a=jQuery(".um-account-main").attr("data-current_tab");a&&(jQuery('.um-account-tab[data-tab="'+a+'"]').show(),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),wp.hooks.doAction("um_account_active_tab_inited",a)),jQuery(document.body).on("click",".um-account-side li a",function(a){a.preventDefault();var t=jQuery(this);t.parents("ul").find("li a").removeClass("current"),t.addClass("current");var e=jQuery(this).attr("href"),u=jQuery(this).attr("data-tab");return jQuery('input[id="_um_account_tab"]:hidden').val(u),window.history.pushState("","",e),jQuery(".um-account-tab").hide(),jQuery('.um-account-tab[data-tab="'+u+'"]').fadeIn(),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-nav a").removeClass("current"),jQuery('.um-account-nav a[data-tab="'+u+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",u),!1}),jQuery(document.body).on("click",".um-account-nav a",function(a){a.preventDefault();var t=jQuery(this).attr("data-tab"),e=jQuery(this).parents("div"),u=jQuery(this);return jQuery('input[id="_um_account_tab"]:hidden').val(t),jQuery(".um-account-tab").hide(),u.hasClass("current")?(e.next(".um-account-tab").slideUp(),u.removeClass("current")):(e.next(".um-account-tab").slideDown(),u.parents("div").find("a").removeClass("current"),u.addClass("current")),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-side li a").removeClass("current"),jQuery('.um-account-side li a[data-tab="'+t+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",t),!1}),jQuery(document.body).on("click",".um-request-button",function(a){a.preventDefault();var t=jQuery(this).data("action"),e=jQuery("#"+t).val();if(jQuery(".um-field-area-response."+t).hide(),jQuery("#"+t).length&&""===e)jQuery(".um-field-error."+t).show();else{jQuery(".um-field-error."+t).hide();var u={request_action:t,nonce:um_scripts.nonce};jQuery("#"+t).length&&(u.password=e),wp.ajax.send("um_request_user_data",{data:u,success:function(a){jQuery(".um-field-area-response."+t).text(a.answer).show()},error:function(a){console.log(a)}})}})});
+1
View File
@@ -1253,6 +1253,7 @@ jQuery(document.body).ready( function() {
if ( typeof current_value == 'undefined' ) {
current_value = [];
} else {
current_value = um_unsanitize_value( current_value );
current_value = current_value.split( '||' );
}
+1 -1
View File
File diff suppressed because one or more lines are too long
+15 -5
View File
@@ -167,11 +167,21 @@ jQuery(document).ready(function() {
jQuery(".um-s2").each( function( e ) {
var obj = jQuery(this);
obj.select2({
allowClear: false,
minimumResultsForSearch: 10,
dropdownParent: obj.parent()
}).on( 'change', unselectEmptyOption );
// fix https://github.com/ultimatemember/ultimatemember/issues/941
// using .um-custom-shortcode-tab class as temporarily solution
var atts = {};
if ( obj.parents('.um-custom-shortcode-tab').length ) {
atts = {
allowClear: false
};
} else {
atts = {
allowClear: false,
minimumResultsForSearch: 10,
dropdownParent: obj.parent()
};
}
obj.select2( atts ).on( 'change', unselectEmptyOption );
} );
jQuery(".um-s3").each( function( e ) {
+1 -1
View File
File diff suppressed because one or more lines are too long
+20
View File
@@ -0,0 +1,20 @@
{
"name": "ultimatemember/ultimatemember",
"description": "The easiest way to create powerful online communities and beautiful user profiles with WordPress.",
"type": "wordpress-plugin",
"homepage": "https://wordpress.org/plugins/ultimate-member/",
"license": "GPL-3.0-or-later",
"minimum-stability": "stable",
"prefer-stable": true,
"require": {
"woocommerce/action-scheduler": "3.2.1"
},
"require-dev": {
"roave/security-advisories": "dev-master"
},
"extra": {
"installer-paths": {
"vendor/{$vendor}/{$name}/": ["woocommerce/action-scheduler"]
}
}
}
+1 -1
View File
@@ -1725,7 +1725,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) {
?>
<p><label for="_force_good_pass"><?php _e( 'Force strong password?', 'ultimate-member' ) ?> <?php UM()->tooltip( __( 'Turn on to force users to create a strong password (A combination of one lowercase letter, one uppercase letter, and one number). If turned on this option is only applied to register forms and not to login forms.', 'ultimate-member' ) ); ?></label>
<input type="checkbox" name="_force_good_pass" id="_force_good_pass" value="1" <?php checked( isset( $this->edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> />
<input type="checkbox" name="_force_good_pass" id="_force_good_pass" value="1" <?php checked( isset( $this->edit_mode_value ) ? $this->edit_mode_value : UM()->options()->get( 'require_strongpass' ) ) ?> />
</p>
<?php
+5 -14
View File
@@ -673,7 +673,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'use_um_gravatar_default_image' => array(
'sanitize' => 'bool',
),
'reset_require_strongpass' => array(
'require_strongpass' => array(
'sanitize' => 'bool',
),
'password_min_chars' => array(
@@ -721,9 +721,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'account_general_password' => array(
'sanitize' => 'bool',
),
'account_require_strongpass' => array(
'sanitize' => 'bool',
),
'account_hide_in_directory' => array(
'sanitize' => 'bool',
),
@@ -1049,10 +1046,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'conditional' => array( 'use_um_gravatar_default_builtin_image', '=', 'default' ),
),
array(
'id' => 'reset_require_strongpass',
'id' => 'require_strongpass',
'type' => 'checkbox',
'label' => __( 'Require a strong password? (when user resets password only)', 'ultimate-member' ),
'tooltip' => __( 'Enable or disable a strong password rules on password reset and change procedure', 'ultimate-member' ),
'label' => __( 'Require a strong password?', 'ultimate-member' ),
'tooltip' => __( 'Enable or disable a strong password rules common for all Ultimate Member forms.', 'ultimate-member' ),
),
array(
'id' => 'password_min_chars',
@@ -1165,12 +1162,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'label' => __( 'Password is required?', 'ultimate-member' ),
'tooltip' => __( 'Password is required to save account data.', 'ultimate-member' ),
),
array(
'id' => 'account_require_strongpass',
'type' => 'checkbox',
'label' => __( 'Require a strong password?', 'ultimate-member' ),
'tooltip' => __( 'Enable or disable a strong password rules on account page / change password tab', 'ultimate-member' ),
),
array(
'id' => 'account_hide_in_directory',
'type' => 'checkbox',
@@ -3172,7 +3163,7 @@ Enable Members Directory: <?php echo $this->info_value( UM()->options()->get('me
Use Gravatars: <?php echo $this->info_value( UM()->options()->get('use_gravatars'), 'yesno', true ); ?>
<?php if( UM()->options()->get('use_gravatars') ): ?>Gravatar builtin image: <?php echo UM()->options()->get('use_um_gravatar_default_builtin_image') . "\n"; ?>
UM Avatar as blank Gravatar: <?php echo $this->info_value( UM()->options()->get('use_um_gravatar_default_image'), 'yesno', true ); ?><?php endif; ?>
Require a strong password: <?php echo $this->info_value( UM()->options()->get('reset_require_strongpass'), 'onoff', true ); ?>
Require a strong password: <?php echo $this->info_value( UM()->options()->get('require_strongpass'), 'onoff', true ); ?>
--- UM Access Configuration ---
+152
View File
@@ -0,0 +1,152 @@
<?php if ( ! defined( 'ABSPATH' ) ) exit;
function um_upgrade_skypeid_fields230() {
UM()->admin()->check_ajax_nonce();
um_maybe_unset_time_limit();
$forms_query = new WP_Query;
$forms = $forms_query->query( array(
'post_type' => 'um_form',
'posts_per_page' => -1,
'fields' => 'ids'
) );
$fields_for_upgrade = array();
foreach ( $forms as $form_id ) {
$forms_fields = get_post_meta( $form_id, '_um_custom_fields', true );
$changed = false;
foreach ( $forms_fields as $key => &$field ) {
if ( isset( $field['validate'] ) && 'skype' === $field['validate'] ) {
if ( isset( $field['type'] ) && 'url' === $field['type'] ) {
$field['type'] = 'text';
$changed = true;
$fields_for_upgrade[] = $field['metakey'];
}
}
}
if ( $changed ) {
update_post_meta( $form_id, '_um_custom_fields', $forms_fields );
}
}
$changed = false;
$custom_fields = get_option( 'um_fields', array() );
foreach ( $custom_fields as &$custom_field ) {
if ( isset( $custom_field['validate'] ) && 'skype' === $custom_field['validate'] ) {
if ( isset( $custom_field['type'] ) && 'url' === $custom_field['type'] ) {
$custom_field['type'] = 'text';
$changed = true;
$fields_for_upgrade[] = $custom_field['metakey'];
}
}
}
if ( $changed ) {
update_option( 'um_fields', $custom_fields );
}
$fields_for_upgrade = array_unique( $fields_for_upgrade );
if ( ! empty( $fields_for_upgrade ) ) {
update_option( 'um_upgrade_230_skype_fields_for_upgrade', $fields_for_upgrade );
wp_send_json_success( array( 'message' => __( 'SkypeID fields have been updated successfully', 'ultimate-member' ), 'count' => count( $fields_for_upgrade ) ) );
} else {
wp_send_json_success( array( 'message' => __( 'Database has been updated successfully', 'ultimate-member' ), 'count' => 0 ) );
}
}
function um_upgrade_usermeta_count230() {
UM()->admin()->check_ajax_nonce();
um_maybe_unset_time_limit();
$fields_for_upgrade = get_option( 'um_upgrade_230_skype_fields_for_upgrade', array() );
if ( ! empty( $fields_for_upgrade ) ) {
global $wpdb;
$count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->usermeta} WHERE meta_key IN( '" . implode( "','", $fields_for_upgrade ) . "' )" );
} else {
$count = 0;
}
wp_send_json_success( array( 'count' => $count ) );
}
function um_upgrade_usermeta_part230() {
UM()->admin()->check_ajax_nonce();
um_maybe_unset_time_limit();
if ( empty( $_POST['page'] ) ) {
wp_send_json_error( __( 'Wrong data', 'ultimate-member' ) );
}
$fields_for_upgrade = get_option( 'um_upgrade_230_skype_fields_for_upgrade', array() );
if ( empty( $fields_for_upgrade ) ) {
wp_send_json_success( array( 'message' => __( 'Database has been updated successfully', 'ultimate-member' ) ) );
}
$per_page = 100;
// avoid 'https://', 'http://' at the start of the Skype field is there is nickname but not https://join.skype.com/
// change only links with nickname skip https://join.skype.com/
global $wpdb;
$usermetas = $wpdb->get_results(
$wpdb->prepare(
"SELECT user_id,
meta_key,
meta_value
FROM {$wpdb->usermeta}
WHERE meta_key IN( '" . implode( "','", $fields_for_upgrade ) . "' )
LIMIT %d, %d",
( absint( $_POST['page'] ) - 1 ) * $per_page,
$per_page
),
ARRAY_A
);
if ( ! empty( $usermetas ) ) {
foreach ( $usermetas as $usermeta ) {
if ( false !== strstr( $usermeta['meta_value'], 'https://' ) || false !== strstr( $usermeta['meta_value'], 'http://' ) ) {
if ( false === strstr( $usermeta['meta_value'], 'join.skype.com/' ) ) {
$usermeta['meta_value'] = str_replace( array( 'https://', 'http://' ), '', $usermeta['meta_value'] );
update_user_meta( $usermeta['user_id'], $usermeta['meta_key'], $usermeta['meta_value'] );
delete_option( "um_cache_userdata_{$usermeta['user_id']}" );
}
}
}
}
$from = ( absint( $_POST['page'] ) * $per_page ) - $per_page + 1;
$to = absint( $_POST['page'] ) * $per_page;
wp_send_json_success( array( 'message' => sprintf( __( 'Metadata from %s to %s row were upgraded successfully...', 'ultimate-member' ), $from, $to ) ) );
}
function um_upgrade_reset_password230() {
UM()->admin()->check_ajax_nonce();
um_maybe_unset_time_limit();
$require_strongpass = UM()->options()->get( 'account_require_strongpass' ) || UM()->options()->get( 'reset_require_strongpass' );
UM()->options()->update( 'require_strongpass', $require_strongpass );
UM()->options()->remove( 'account_require_strongpass' );
UM()->options()->remove( 'reset_require_strongpass' );
// delete temporarily option for fields upgrade
delete_option( 'um_upgrade_230_skype_fields_for_upgrade' );
update_option( 'um_last_version_upgrade', '2.3.0' );
wp_send_json_success( array( 'message' => __( 'Reset Password options have been updated successfully.', 'ultimate-member' ) ) );
}
+8
View File
@@ -0,0 +1,8 @@
<?php if ( ! defined( 'ABSPATH' ) ) exit;
return array(
'skypeid_fields230' => 'skypeid_fields230',
'usermeta_count230' => 'usermeta_count230',
'usermeta_part230' => 'usermeta_part230',
'reset_password230' => 'reset_password230',
);
+133
View File
@@ -0,0 +1,133 @@
<?php if ( ! defined( 'ABSPATH' ) ) exit; ?>
<script type="text/javascript">
jQuery( document ).ready( function() {
var metarows_pages;
var current_page = 1;
var metarows_per_page = 100;
um_add_upgrade_log( '<?php echo esc_js( __( 'Upgrade SkypeID fields in UM Forms and generally in predefined fields...', 'ultimate-member' ) ) ?>' );
jQuery.ajax({
url: wp.ajax.settings.url,
type: 'POST',
dataType: 'json',
data: {
action: 'um_skypeid_fields230',
nonce: um_admin_scripts.nonce
},
success: function( response ) {
if ( typeof response.data.message != 'undefined' ) {
um_add_upgrade_log( response.data.message );
setTimeout( function () {
if ( response.data.count > 0 ) {
um_update_get_usermeta_count230();
} else {
um_reset_password230();
}
}, um_request_throttle );
} else {
um_wrong_ajax();
}
},
error: function() {
um_something_wrong();
}
});
function um_update_get_usermeta_count230() {
um_add_upgrade_log( '<?php echo esc_js( __( 'Upgrade SkypeID fields metadata for users...', 'ultimate-member' ) ) ?>' );
jQuery.ajax({
url: wp.ajax.settings.url,
type: 'POST',
dataType: 'json',
data: {
action: 'um_usermeta_count230',
nonce: um_admin_scripts.nonce
},
success: function( response ) {
if ( typeof response.data.count != 'undefined' ) {
um_add_upgrade_log( '<?php echo esc_js( __( 'There are ', 'ultimate-member' ) ) ?>' + response.data.count + '<?php echo esc_js( __( ' metadata rows...', 'ultimate-member' ) ) ?>' );
um_add_upgrade_log( '<?php echo esc_js( __( 'Start metadata upgrading...', 'ultimate-member' ) ) ?>' );
metarows_pages = Math.ceil( response.data.count / metarows_per_page );
setTimeout( function () {
um_update_usermeta_part230();
}, um_request_throttle );
} else {
um_wrong_ajax();
}
},
error: function() {
um_something_wrong();
}
});
}
function um_update_usermeta_part230() {
if ( current_page <= metarows_pages ) {
jQuery.ajax({
url: wp.ajax.settings.url,
type: 'POST',
dataType: 'json',
data: {
action: 'um_usermeta_part230',
page: current_page,
nonce: um_admin_scripts.nonce
},
success: function( response ) {
if ( typeof response.data != 'undefined' ) {
um_add_upgrade_log( response.data.message );
current_page++;
setTimeout( function() {
um_update_usermeta_part230();
}, um_request_throttle );
} else {
um_wrong_ajax();
}
},
error: function() {
um_something_wrong();
}
});
} else {
setTimeout( function () {
um_reset_password230();
}, um_request_throttle );
}
}
function um_reset_password230() {
um_add_upgrade_log( '<?php echo esc_js( __( 'Upgrade the "Require strong password" options...', 'ultimate-member' ) ) ?>' );
jQuery.ajax({
url: wp.ajax.settings.url,
type: 'POST',
dataType: 'json',
data: {
action: 'um_reset_password230',
nonce: um_admin_scripts.nonce
},
success: function( response ) {
if ( typeof response.data.message != 'undefined' ) {
um_add_upgrade_log( response.data.message );
//switch to the next package
um_run_upgrade();
} else {
um_wrong_ajax();
}
},
error: function() {
um_something_wrong();
}
});
}
});
</script>
+1 -2
View File
@@ -522,7 +522,7 @@ if ( ! class_exists( 'um\Config' ) ) {
'use_gravatars' => 0,
'use_um_gravatar_default_builtin_image' => 'default',
'use_um_gravatar_default_image' => 0,
'reset_require_strongpass' => 0,
'require_strongpass' => 0,
'password_min_chars' => 8,
'password_max_chars' => 30,
'account_tab_password' => 1,
@@ -538,7 +538,6 @@ if ( ! class_exists( 'um\Config' ) ) {
'account_general_password' => 0,
'account_hide_in_directory' => 1,
'account_hide_in_directory_default' => 'No',
'account_require_strongpass' => 0,
'photo_thumb_sizes' => array( 40, 80, 190 ),
'cover_thumb_sizes' => array( 300, 600 ),
'accessible' => 0,
+1 -1
View File
@@ -387,7 +387,7 @@ if ( ! class_exists( 'UM_Functions' ) ) {
if ( is_array( $var ) ) {
return array_map( array( $this, 'clean_array' ), $var );
} else {
return is_scalar( $var ) ? sanitize_text_field( $var ) : $var;
return ! is_scalar( $var ) ? sanitize_text_field( $var ) : $var;
}
}
+64 -5
View File
@@ -930,7 +930,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'url_text' => 'LinkedIn',
'advanced' => 'social',
'color' => '#0976b4',
'match' => 'https://linkedin.com/in/',
'match' => 'https://linkedin.com/',
),
'googleplus' => array(
@@ -972,7 +972,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'skype' => array(
'title' => __('Skype ID','ultimate-member'),
'metakey' => 'skype',
'type' => 'url',
'type' => 'text',
'label' => __('Skype ID','ultimate-member'),
'required' => 0,
'public' => 1,
@@ -981,7 +981,64 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'url_rel' => 'nofollow',
'icon' => 'um-faicon-skype',
'validate' => 'skype',
'url_text' => 'Skype',
'url_text' => __( 'Join chat', 'ultimate-member' ),
),
'viber' => array(
'title' => __('Viber number','ultimate-member'),
'metakey' => 'viber',
'type' => 'text',
'label' => __('Viber number','ultimate-member'),
'required' => 0,
'public' => 1,
'editable' => 1,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-icon-ios-telephone',
'validate' => 'phone_number',
),
'whatsapp' => array(
'title' => __('WhatsApp number','ultimate-member'),
'metakey' => 'whatsapp',
'type' => 'text',
'label' => __('WhatsApp number','ultimate-member'),
'required' => 0,
'public' => 1,
'editable' => 1,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-icon-social-whatsapp',
'validate' => 'phone_number',
),
'telegram' => array(
'title' => __('Telegram','ultimate-member'),
'metakey' => 'telegram',
'type' => 'url',
'label' => __('Telegram','ultimate-member'),
'required' => 0,
'public' => 1,
'editable' => 1,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'icon' => 'um-faicon-paper-plane',
'validate' => 'telegram_url',
'url_text' => 'Telegram',
'match' => 'https://t.me/',
),
'discord' => array(
'title' => __('Discord','ultimate-member'),
'metakey' => 'discord',
'type' => 'text',
'label' => __('Discord ID','ultimate-member'),
'required' => 0,
'public' => 1,
'editable' => 1,
'url_target' => '_blank',
'url_rel' => 'nofollow',
'validate' => 'discord',
),
'youtube' => array(
@@ -1409,6 +1466,8 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
$array['unique_username_or_email'] = __('Unique Username/E-mail','ultimate-member');
$array['url'] = __('Website URL','ultimate-member');
$array['youtube_url'] = __('YouTube Profile','ultimate-member');
$array['telegram_url'] = __('Telegram URL','ultimate-member');
$array['discord'] = __('Discord ID','ultimate-member');
$array['custom'] = __('Custom Validation','ultimate-member');
/**
@@ -1524,7 +1583,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
"iu" => __("Inuktitut",'ultimate-member'),
"ja" => __("Japanese",'ultimate-member'),
"jv" => __("Javanese",'ultimate-member'),
"ka" => __("Georgian",'ultimate-member'),
"ka" => __("Kartuli",'ultimate-member'),
"kg" => __("Kongo",'ultimate-member'),
"ki" => __("Kikuyu",'ultimate-member'),
"kj" => __("Kwanyama",'ultimate-member'),
@@ -1716,7 +1775,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'TF' => __('French Southern Territories','ultimate-member'),
'GA' => __('Gabon','ultimate-member'),
'GM' => __('Gambia','ultimate-member'),
'GE' => __('Georgia','ultimate-member'),
'GE' => __('Sakartvelo','ultimate-member'),
'DE' => __('Germany','ultimate-member'),
'GH' => __('Ghana','ultimate-member'),
'GI' => __('Gibraltar','ultimate-member'),
+45
View File
@@ -264,6 +264,51 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
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 = 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 );
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 = 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 = 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 );
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', '' );
}
}
}
}
+13 -4
View File
@@ -114,7 +114,9 @@ if ( ! class_exists( 'um\core\Form' ) ) {
$arr_options['status'] = 'success';
$arr_options['post'] = $_POST;
UM()->fields()->set_id = absint( $_POST['form_id'] );
if ( isset( $_POST['form_id'] ) ) {
UM()->fields()->set_id = absint( $_POST['form_id'] );
}
UM()->fields()->set_mode = 'profile';
$form_fields = UM()->fields()->get_fields();
$arr_options['fields'] = $form_fields;
@@ -122,8 +124,6 @@ if ( ! class_exists( 'um\core\Form' ) ) {
if ( isset( $arr_options['post']['members_directory'] ) && 'yes' === $arr_options['post']['members_directory'] ) {
$ajax_source_func = $_POST['child_callback'];
if ( function_exists( $ajax_source_func ) ) {
$arr_options['items'] = call_user_func( $ajax_source_func, $arr_options['field']['parent_dropdown_relationship'] );
global $wpdb;
$values_array = $wpdb->get_col(
@@ -137,7 +137,16 @@ if ( ! class_exists( 'um\core\Form' ) ) {
);
if ( ! empty( $values_array ) ) {
$arr_options['items'] = array_intersect( $arr_options['items'], $values_array );
$parent_dropdown = isset( $arr_options['field']['parent_dropdown_relationship'] ) ? $arr_options['field']['parent_dropdown_relationship'] : '';
$arr_options['items'] = call_user_func( $ajax_source_func, $parent_dropdown );
if ( array_keys( $arr_options['items'] ) !== range( 0, count( $arr_options['items'] ) - 1 ) ) {
// array with dropdown items is associative
$arr_options['items'] = array_intersect_key( array_map( 'trim', $arr_options['items'] ), array_flip( $values_array ) );
} else {
// array with dropdown items has sequential numeric keys, starting from 0 and there are intersected values with $values_array
$arr_options['items'] = array_intersect( $arr_options['items'], $values_array );
}
} else {
$arr_options['items'] = array();
}
+2 -1
View File
@@ -876,7 +876,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
function slider_range_placeholder( $filter, $attrs ) {
switch ( $filter ) {
default: {
$label = ucwords( str_replace( array( 'um_', '_' ), array( '', ' ' ), $filter ) );
$label = ! empty( $attrs['label'] ) ? $attrs['label'] : $filter;
$label = ucwords( str_replace( array( 'um_', '_' ), array( '', ' ' ), $label ) );
$placeholders = apply_filters( 'um_member_directory_filter_slider_range_placeholder', false, $filter );
if ( ! $placeholders ) {
+6 -8
View File
@@ -457,10 +457,7 @@ if ( ! class_exists( 'um\core\Password' ) ) {
UM()->form()->add_error( 'username_b', __( 'Please provide your username or email', 'ultimate-member' ) );
}
if ( ( ! is_email( $user ) && ! username_exists( $user ) ) || ( is_email( $user ) && ! email_exists( $user ) ) ) {
UM()->form()->add_error( 'username_b', __( 'We can\'t find an account registered with that address or username', 'ultimate-member' ) );
} else {
if ( ( ! is_email( $user ) && username_exists( $user ) ) || ( is_email( $user ) && email_exists( $user ) ) ) {
if ( is_email( $user ) ) {
$user_id = email_exists( $user );
} else {
@@ -507,9 +504,10 @@ if ( ! class_exists( 'um\core\Password' ) ) {
$data = get_user_by( 'email', $user );
}
um_fetch_user( $data->ID );
UM()->user()->password_reset();
if ( isset( $data ) && is_a( $data, '\WP_User' ) ) {
um_fetch_user( $data->ID );
UM()->user()->password_reset();
}
exit( wp_redirect( um_get_core_page('password-reset', 'checkemail' ) ) );
}
@@ -541,7 +539,7 @@ if ( ! class_exists( 'um\core\Password' ) ) {
$args['confirm_user_password'] = sanitize_text_field( $args['confirm_user_password'] );
}
if ( UM()->options()->get( 'reset_require_strongpass' ) ) {
if ( UM()->options()->get( 'require_strongpass' ) ) {
$min_length = UM()->options()->get( 'password_min_chars' );
$min_length = ! empty( $min_length ) ? $min_length : 8;
@@ -21,6 +21,23 @@ if ( ! class_exists( 'um\core\Roles_Capabilities' ) ) {
function __construct() {
add_action( 'wp_roles_init', array( &$this, 'um_roles_init' ), 99999 );
add_action( 'update_option', array( &$this, 'um_on_roles_update' ), 10, 3 );
add_action( 'set_user_role', array( &$this, 'remove_user_cache' ), 10, 1 );
}
/**
* Flush the Cache User Profile on set new user role(s)
*
* @param int $user_id
*/
function remove_user_cache( $user_id ) {
$user = get_userdata( $user_id );
if ( ! is_a( $user, '\WP_User' ) ) {
return;
}
UM()->user()->remove_cache( $user_id );
}
+22 -1
View File
@@ -284,6 +284,27 @@ if ( ! class_exists( 'um\core\Validation' ) ) {
}
/**
* Is Discord ID?
*
* @param $string
*
* @return bool
*/
public function is_discord_id( $string ) {
if ( ! $string ) {
return true;
}
if ( substr_count( $string, '#' ) > 1 ) {
return false;
}
if ( ! preg_match( '/^(.+)#(\d+)$/', trim( $string ) ) ) {
return false;
}
return true;
}
/**
* Is url
*
@@ -396,4 +417,4 @@ if ( ! class_exists( 'um\core\Validation' ) ) {
}
}
}
}
+8 -4
View File
@@ -81,7 +81,7 @@ function um_submit_account_errors_hook( $args ) {
return;
}
if ( UM()->options()->get( 'account_require_strongpass' ) ) {
if ( UM()->options()->get( 'require_strongpass' ) ) {
$min_length = UM()->options()->get( 'password_min_chars' );
$min_length = ! empty( $min_length ) ? $min_length : 8;
$max_length = UM()->options()->get( 'password_max_chars' );
@@ -144,7 +144,7 @@ function um_submit_account_errors_hook( $args ) {
}
if ( email_exists( $args['user_email'] ) && email_exists( $args['user_email'] ) !== get_current_user_id() ) {
UM()->form()->add_error( 'user_email', __( 'Email already linked to another account', 'ultimate-member' ) );
UM()->form()->add_error( 'user_email', __( 'Please provide a valid e-mail', 'ultimate-member' ) );
}
}
@@ -678,7 +678,7 @@ function um_after_account_privacy( $args ) {
ARRAY_A );
if ( ! empty( $pending ) && $pending['post_status'] == 'request-pending' ) {
echo '<p>' . esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your export request.', 'ultimate-member' ) . '</p>';
echo '<p>' . esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your deletion request.', 'ultimate-member' ) . '</p>';
} elseif ( ! empty( $pending ) && $pending['post_status'] == 'request-confirmed' ) {
echo '<p>' . esc_html__( 'The administrator has not yet approved deleting your data. Please expect an email with a link to your data.', 'ultimate-member' ) . '</p>';
} else {
@@ -756,7 +756,11 @@ function um_request_user_data() {
$answer = esc_html( $request_id->get_error_message() );
} else {
wp_send_user_request( $request_id );
$answer = esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your export request.', 'ultimate-member' );
if ( 'um-export-data' === $request_action ) {
$answer = esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your export request.', 'ultimate-member' );
} elseif ( 'um-erase-data' === $request_action ) {
$answer = esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your deletion request.', 'ultimate-member' );
}
}
wp_send_json_success( array( 'answer' => $answer ) );
+23 -11
View File
@@ -709,6 +709,12 @@ function um_submit_form_errors_hook_( $args ) {
}
break;
case 'telegram_url':
if ( ! UM()->validation()->is_url( $args[ $key ], 't.me' ) ) {
UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s username or profile URL', 'ultimate-member' ), $array['label'] ) );
}
break;
case 'soundcloud_url':
if ( ! UM()->validation()->is_url( $args[ $key ], 'soundcloud.com' ) ) {
UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s username or profile URL','ultimate-member'), $array['label'] ) );
@@ -752,6 +758,12 @@ function um_submit_form_errors_hook_( $args ) {
}
break;
case 'discord':
if ( ! UM()->validation()->is_discord_id( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'Please enter a valid Discord ID', 'ultimate-member' ) );
}
break;
case 'url':
if ( ! UM()->validation()->is_url( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'Please enter a valid URL', 'ultimate-member' ) );
@@ -763,7 +775,7 @@ function um_submit_form_errors_hook_( $args ) {
if ( $args[ $key ] == '' ) {
UM()->form()->add_error( $key, __( 'You must provide a username', 'ultimate-member' ) );
} elseif ( $mode == 'register' && username_exists( sanitize_user( $args[ $key ] ) ) ) {
UM()->form()->add_error( $key, __( 'Your username is already taken', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'The username you entered is incorrect', 'ultimate-member' ) );
} elseif ( is_email( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'Username cannot be an email', 'ultimate-member' ) );
} elseif ( ! UM()->validation()->safe_username( $args[ $key ] ) ) {
@@ -775,11 +787,11 @@ function um_submit_form_errors_hook_( $args ) {
case 'unique_username_or_email':
if ( $args[ $key ] == '' ) {
UM()->form()->add_error( $key, __( 'You must provide a username', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'You must provide a username or email', 'ultimate-member' ) );
} elseif ( $mode == 'register' && username_exists( sanitize_user( $args[ $key ] ) ) ) {
UM()->form()->add_error( $key, __( 'Your username is already taken', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'The username you entered is incorrect', 'ultimate-member' ) );
} elseif ( $mode == 'register' && email_exists( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
} elseif ( ! UM()->validation()->safe_username( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'Your username contains invalid characters', 'ultimate-member' ) );
}
@@ -801,11 +813,11 @@ function um_submit_form_errors_hook_( $args ) {
if ( $args[ $key ] == '' && in_array( $key, array( 'user_email' ) ) ) {
UM()->form()->add_error( $key, __( 'You must provide your email', 'ultimate-member' ) );
} elseif ( in_array( $mode, array( 'register' ) ) && $email_exists ) {
UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
} elseif ( in_array( $mode, array( 'profile' ) ) && $email_exists && $email_exists != $args['user_id'] ) {
UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) );
} elseif ( !is_email( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'This is not a valid email', 'ultimate-member') );
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
} elseif ( ! is_email( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member') );
} elseif ( ! UM()->validation()->safe_username( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'Your email contains invalid characters', 'ultimate-member' ) );
}
@@ -813,16 +825,16 @@ function um_submit_form_errors_hook_( $args ) {
} else {
if ( $args[ $key ] != '' && ! is_email( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'This is not a valid email', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
} elseif ( $args[ $key ] != '' && email_exists( $args[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
} elseif ( $args[ $key ] != '' ) {
$users = get_users( 'meta_value=' . $args[ $key ] );
foreach ( $users as $user ) {
if ( $user->ID != $args['user_id'] ) {
UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) );
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
}
}
+2 -2
View File
@@ -65,12 +65,12 @@ function um_submit_form_errors_hook_login( $args ) {
$user = apply_filters( 'authenticate', null, $authenticate, $args['user_password'] );
if ( is_wp_error( $user ) && ! in_array( $user->get_error_code(), $ignore_codes ) ) {
UM()->form()->add_error( $user->get_error_code(), __( $user->get_error_message(), 'ultimate-member' ) );
UM()->form()->add_error( $user->get_error_code(), __( 'Password is incorrect. Please try again.', 'ultimate-member' ) );
}
$user = apply_filters( 'wp_authenticate_user', $user, $args['user_password'] );
if ( is_wp_error( $user ) && ! in_array( $user->get_error_code(), $ignore_codes ) ) {
UM()->form()->add_error( $user->get_error_code(), __( $user->get_error_message(), 'ultimate-member' ) );
UM()->form()->add_error( $user->get_error_code(), __( 'Password is incorrect. Please try again.', 'ultimate-member' ) );
}
// if there is an error notify wp
+8 -2
View File
@@ -721,7 +721,11 @@ function um_profile_dynamic_meta_desc() {
$locale = get_user_locale( $user_id );
$site_name = get_bloginfo( 'name' );
$twitter_site = '@' . sanitize_title( $site_name );
$twitter = (string) um_user( 'twitter' );
if ( ! empty( $twitter ) ) {
$twitter = trim( str_replace( 'https://twitter.com/', '', $twitter ), "/ \n\r\t\v\0" );
}
$title = trim( um_user( 'display_name' ) );
$description = um_convert_tags( UM()->options()->get( 'profile_desc' ) );
@@ -763,7 +767,9 @@ function um_profile_dynamic_meta_desc() {
<meta property="og:url" content="<?php echo esc_url( $url ); ?>"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:site" content="<?php echo esc_attr( $twitter_site ); ?>"/>
<?php if ( $twitter ) { ?>
<meta name="twitter:site" content="@<?php echo esc_attr( $twitter ); ?>"/>
<?php } ?>
<meta name="twitter:title" content="<?php echo esc_attr( $title ); ?>"/>
<meta name="twitter:description" content="<?php echo esc_attr( $description ); ?>"/>
<meta name="twitter:image" content="<?php echo esc_url( $image ); ?>"/>
+61 -32
View File
@@ -99,6 +99,38 @@ function um_profile_field_filter_hook__vimeo_video( $value, $data ) {
add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filter_hook__vimeo_video', 99, 2 );
/**
* Outputs a viber link
*
* @param $value
* @param $data
*
* @return int|string
*/
function um_profile_field_filter_hook__viber( $value, $data ) {
$value = str_replace('+', '', $value);
$value = '<a href="viber://chat?number=%2B' . esc_attr( $value ) . '" target="_blank" rel="nofollow" title="' . esc_attr( $data['title'] ) . '">' . esc_html( $value ) . '</a>';
return $value;
}
add_filter( 'um_profile_field_filter_hook__viber', 'um_profile_field_filter_hook__viber', 99, 2 );
/**
* Outputs a whatsapp link
*
* @param $value
* @param $data
*
* @return int|string
*/
function um_profile_field_filter_hook__whatsapp( $value, $data ) {
$value = str_replace('+', '', $value);
$value = '<a href="https://api.whatsapp.com/send?phone=' . esc_attr( $value ) . '" target="_blank" rel="nofollow" title="' . esc_attr( $data['title'] ) . '">' . esc_html( $value ) . '</a>';
return $value;
}
add_filter( 'um_profile_field_filter_hook__whatsapp', 'um_profile_field_filter_hook__whatsapp', 99, 2 );
/**
* Outputs a google map
*
@@ -353,48 +385,45 @@ function um_profile_field_filter_hook__( $value, $data, $type = '' ) {
return '';
}
if ( ( isset( $data['validate'] ) && $data['validate'] !== '' && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && $data['type'] == 'url' ) ) {
$alt = ( isset( $data['url_text'] ) && !empty( $data['url_text'] ) ) ? $data['url_text'] : $value;
if ( isset( $data['type'] ) && 'text' === $data['type'] && isset( $data['validate'] ) && 'skype' === $data['validate'] ) {
$alt = ! empty( $data['url_text'] ) ? $data['url_text'] : $value;
$url_rel = ( isset( $data['url_rel'] ) && $data['url_rel'] == 'nofollow' ) ? 'rel="nofollow"' : '';
if ( ! strstr( $value, 'http' )
&& !strstr( $value, '://' )
&& !strstr( $value, 'www.' )
&& !strstr( $value, '.com' )
&& !strstr( $value, '.net' )
&& !strstr( $value, '.org' )
) {
if ( $data['validate'] == 'soundcloud_url' ) $value = 'https://soundcloud.com/' . $value;
if ( $data['validate'] == 'youtube_url' ) $value = 'https://youtube.com/user/' . $value;
if ( $data['validate'] == 'facebook_url' ) $value = 'https://facebook.com/' . $value;
if ( $data['validate'] == 'twitter_url' ) $value = 'https://twitter.com/' . $value;
if ( $data['validate'] == 'linkedin_url' ) $value = 'https://linkedin.com/' . $value;
if ( $data['validate'] == 'skype' ) $value = 'skype:'.$value.'?chat';
if ( $data['validate'] == 'googleplus_url' ) $value = 'https://plus.google.com/' . $value;
if ( $data['validate'] == 'instagram_url' ) $value = 'https://instagram.com/' . $value;
if ( $data['validate'] == 'vk_url' ) $value = 'https://vk.com/' . $value;
$data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank';
if ( false === strstr( $value, 'join.skype.com' ) ) {
$value = 'skype:' . $value . '?chat';
}
if ( ! ( isset( $data['validate'] ) && $data['validate'] == 'skype' ) ) {
$value = '<a href="'. esc_attr( $value ) .'" title="' . esc_attr( $alt ) . '" target="' . esc_attr( $data['url_target'] ) . '" ' . $url_rel . '>' . esc_html( $alt ) . '</a>';
} else {
if ( ( isset( $data['validate'] ) && $data['validate'] !== '' && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && $data['type'] == 'url' ) ) {
$alt = ( isset( $data['url_text'] ) && !empty( $data['url_text'] ) ) ? $data['url_text'] : $value;
$url_rel = ( isset( $data['url_rel'] ) && $data['url_rel'] == 'nofollow' ) ? 'rel="nofollow"' : '';
if ( ! strstr( $value, 'http' )
&& !strstr( $value, '://' )
&& !strstr( $value, 'www.' )
&& !strstr( $value, '.com' )
&& !strstr( $value, '.net' )
&& !strstr( $value, '.org' )
&& !strstr( $value, '.me' )
) {
if ( $data['validate'] == 'soundcloud_url' ) $value = 'https://soundcloud.com/' . $value;
if ( $data['validate'] == 'youtube_url' ) $value = 'https://youtube.com/user/' . $value;
if ( $data['validate'] == 'telegram_url' ) $value = 'https://t.me/' . $value;
if ( $data['validate'] == 'facebook_url' ) $value = 'https://facebook.com/' . $value;
if ( $data['validate'] == 'twitter_url' ) $value = 'https://twitter.com/' . $value;
if ( $data['validate'] == 'linkedin_url' ) $value = 'https://linkedin.com/' . $value;
if ( $data['validate'] == 'googleplus_url' ) $value = 'https://plus.google.com/' . $value;
if ( $data['validate'] == 'instagram_url' ) $value = 'https://instagram.com/' . $value;
if ( $data['validate'] == 'vk_url' ) $value = 'https://vk.com/' . $value;
}
if ( strpos( $value, 'http://' ) !== 0 ) {
$value = 'http://' . $value;
}
$data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank';
$value = '<a href="'. $value .'" title="'.$alt.'" target="'.$data['url_target'].'" ' . $url_rel . '>'.$alt.'</a>';
}
}
if ( isset( $data['validate'] ) && $data['validate'] == 'skype' ) {
$value = str_replace('https://','',$value );
$value = str_replace('http://','',$value );
$data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank';
$value = '<a href="'. 'skype:'.$value.'?chat'.'" title="'.$value.'" target="'.$data['url_target'].'" ' . $url_rel . '>'.$value.'</a>';
}
if ( ! is_array( $value ) ) {
+36 -24
View File
@@ -1,30 +1,42 @@
<?php if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
/**
* Add dynamic profile headers
*
* @param $items
* @param $args
*
* @return mixed
*/
function um_add_custom_message_to_menu( $items, $args ) {
if ( ! is_user_logged_in() ) {
$items = UM()->shortcodes()->convert_user_tags( $items );
return $items;
}
um_fetch_user( get_current_user_id() );
$items = UM()->shortcodes()->convert_user_tags( $items );
um_reset_user();
return $items;
}
add_filter( 'wp_nav_menu_items', 'um_add_custom_message_to_menu', 10, 2 );
if ( ! is_admin() ) {
/**
* Add dynamic profile headers
*
* @param array $sorted_menu_items
* @param \stdClass $args
*
* @return array
*/
function um_add_custom_message_to_menu( $sorted_menu_items, $args ) {
if ( is_user_logged_in() ) {
um_fetch_user( get_current_user_id() );
}
foreach ( $sorted_menu_items as &$menu_item ) {
if ( $menu_item->title ) {
$menu_item->title = UM()->shortcodes()->convert_user_tags( $menu_item->title );
}
if ( $menu_item->attr_title ) {
$menu_item->attr_title = UM()->shortcodes()->convert_user_tags( $menu_item->attr_title );
}
if ( $menu_item->description ) {
$menu_item->description = UM()->shortcodes()->convert_user_tags( $menu_item->description );
}
}
if ( is_user_logged_in() ) {
um_reset_user();
}
return $sorted_menu_items;
}
add_filter( 'wp_nav_menu_objects', 'um_add_custom_message_to_menu', 9999, 2 );
/**
* Conditional menu items
*
@@ -141,4 +153,4 @@ if ( ! is_admin() ) {
return um_conditional_nav_menu( $items, $args );
}
add_filter( 'wp_get_nav_menu_items', 'um_get_nav_menu_items', 9999, 3 );
}
}
+1 -1
View File
@@ -79,7 +79,7 @@ add_filter( 'the_title', 'um_dynamic_user_profile_title', 100000, 2 );
* @return string|false The canonical URL, or false if current URL is canonical.
*/
function um_get_canonical_url( $canonical_url, $post ) {
if ( UM()->config()->permalinks['user'] == $post->ID ) {
if ( UM()->config()->permalinks['user'] == $post->ID || ( UM()->external_integrations()->is_wpml_active() && UM()->config()->permalinks['user'] == wpml_object_id_filter( $post->ID, 'page', true, icl_get_default_language() ) ) ) {
/**
* UM hook
+34 -1
View File
@@ -7,7 +7,7 @@ Tags: community, member, membership, user-profile, user-registration
Requires PHP: 5.6
Requires at least: 5.0
Tested up to: 5.8
Stable tag: 2.2.5
Stable tag: 2.3.0
License: GNU Version 2 or Any Later Version
License URI: http://www.gnu.org/licenses/gpl-3.0.txt
@@ -155,6 +155,39 @@ The plugin works with popular caching plugins by automatically excluding Ultimat
* To learn more about version 2.1 please see this [docs](https://docs.ultimatemember.com/article/1512-upgrade-2-1-0)
* UM2.1+ is a significant update to the Member Directories' code base from 2.0.x. Please make sure you take a full-site backup with restore point before updating the plugin
= 2.3.0: December 16, 2021 =
* Enhancements:
- Added: WhatsApp, Telegram, Discord, Viber messengers predefined fields.
- Added: Callback for deleting the custom field data from member direcroty settings when this custom field has been deleted in Form Builder.
- Added: 'um_account_active_tab_inited' JS hook.
- Updated: Require a strong password option (`Ultimate Member > Settings > General > Users > Require a strong password?`) to make it common for all Ultimate Member forms. Renamed option key from `reset_require_strongpass` to `require_strongpass`.
- Updated: Form errors texts on the login/password reset forms. Made them secure.
- Deprecated: `Ultimate Member > Settings > General > Account > Require a strong password?` option and merged with `Ultimate Member > Settings > General > Users > Require a strong password?` option.
* Bugfixes:
- Fixed: "Clear All" button for the filters with "&" symbol in the label.
- Fixed: Uninstall process when delete UM data. Avoid the issue when 3rd-party pages that had been selected as UM page are removed on UM uninstall.
- Fixed: Header meta for the Twitter Card. If the user has twitter field filled then <meta name="twitter:site"> will be filled by this value.
- Fixed: Member directory a slider filter's label displaying. It uses the filled label for now.
- Fixed: SkypeID field validation. Also all SkypeID fields on your forms changed type from `url` to `text`. SkypeID supports nicknames or https://join.skype.com/{hash} links.
- Fixed: Typos in Account > Privacy tab texts related to Download/Erase the user data.
- Fixed: Some typos in the fields' labels.
- Fixed: "false" display name in the member directory. It displays empty for now if the user hasn't display name.
- Fixed: `UM()->clean_array()` function.
- Fixed: LinkedIn field URL. Added ability to display the organization URL.
- Fixed: Canonical link of the user profile if WPML plugin is active.
- Fixed: Replacing placeholders in nav menus. Used an earlier hook for filtering items before generating HTML and avoided issues with raw, not-escaped HTML inside tags' attributes.
* Templates required update:
- members-grid.php
- members-list.php
- password-reset.php
* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade
= 2.2.5: September 22, 2021 =
* Enhancements:
+10 -8
View File
@@ -18,7 +18,7 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
<?php if ( $cover_photos ) { ?>
<div class="um-member-cover" data-ratio="<?php echo esc_attr( UM()->options()->get( 'profile_cover_ratio' ) ); ?>">
<div class="um-member-cover-e">
<a href="{{{user.profile_url}}}" title="{{{user.display_name}}}">
<a href="{{{user.profile_url}}}" title="<# if ( user.display_name ) { #>{{{user.display_name}}}<# } #>">
{{{user.cover_photo}}}
</a>
</div>
@@ -27,7 +27,7 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
if ( $profile_photo ) { ?>
<div class="um-member-photo radius-<?php echo esc_attr( UM()->options()->get( 'profile_photocorner' ) ); ?>">
<a href="{{{user.profile_url}}}" title="{{{user.display_name}}}">
<a href="{{{user.profile_url}}}" title="<# if ( user.display_name ) { #>{{{user.display_name}}}<# } #>">
{{{user.avatar}}}
<?php do_action( 'um_members_in_profile_photo_tmpl', $args ); ?>
</a>
@@ -37,11 +37,13 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
<div class="um-member-card <?php if ( ! $profile_photo ) { echo 'no-photo'; } ?>">
<?php if ( $show_name ) { ?>
<div class="um-member-name">
<a href="{{{user.profile_url}}}" title="{{{user.display_name}}}">
{{{user.display_name_html}}}
</a>
</div>
<# if ( user.display_name_html ) { #>
<div class="um-member-name">
<a href="{{{user.profile_url}}}" title="{{{user.display_name}}}">
{{{user.display_name_html}}}
</a>
</div>
<# } #>
<?php }
// please use for buttons priority > 100
@@ -148,4 +150,4 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
<div class="um-clear"></div>
</div>
</script>
</script>
+9 -7
View File
@@ -15,7 +15,7 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
<div class="um-member-card-container">
<?php if ( $profile_photo ) { ?>
<div class="um-member-photo radius-<?php echo esc_attr( UM()->options()->get( 'profile_photocorner' ) ); ?>">
<a href="{{{user.profile_url}}}" title="{{{user.display_name}}}">
<a href="{{{user.profile_url}}}" title="<# if ( user.display_name ) { #>{{{user.display_name}}}<# } #>">
{{{user.avatar}}}
<?php do_action( 'um_members_list_in_profile_photo_tmpl', $args ); ?>
@@ -27,11 +27,13 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
<div class="um-member-card-content">
<div class="um-member-card-header">
<?php if ( $show_name ) { ?>
<div class="um-member-name">
<a href="{{{user.profile_url}}}" title="{{{user.display_name}}}">
{{{user.display_name_html}}}
</a>
</div>
<# if ( user.display_name_html ) { #>
<div class="um-member-name">
<a href="{{{user.profile_url}}}" title="<# if ( user.display_name ) { #>{{{user.display_name}}}<# } #>">
{{{user.display_name_html}}}
</a>
</div>
<# } #>
<?php } ?>
{{{user.hook_just_after_name}}}
@@ -148,4 +150,4 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
<# } #>
</div>
</script>
</script>
+4 -4
View File
@@ -9,7 +9,7 @@
<div class="um-field um-field-block um-field-type_block">
<div class="um-field-block">
<div style="text-align:center;">
<?php esc_html_e( 'We have sent you a password reset link to your e-mail. Please check your inbox.', 'ultimate-member' ); ?>
<?php esc_html_e( 'If an account matching the provided details exists, we will send a password reset link. Please check your inbox.', 'ultimate-member' ); ?>
</div>
</div>
</div>
@@ -44,9 +44,9 @@
<div class="um-field-block">
<div style="text-align:center;">
<?php if ( 'expiredkey' === sanitize_key( $_GET['updated'] ) ) {
_e( 'Your password reset link has expired. Please request a new link below.', 'ultimate-member' );
esc_html_e( 'Your password reset link has expired. Please request a new link below.', 'ultimate-member' );
} elseif ( 'invalidkey' === sanitize_key( $_GET['updated'] ) ) {
_e( 'Your password reset link appears to be invalid. Please request a new link below.', 'ultimate-member' );
esc_html_e( 'Your password reset link appears to be invalid. Please request a new link below.', 'ultimate-member' );
} ?>
</div>
</div>
@@ -55,7 +55,7 @@
<div class="um-field um-field-block um-field-type_block">
<div class="um-field-block">
<div style="text-align:center;">
<?php _e( 'To reset your password, please enter your email address or username below', 'ultimate-member' ); ?>
<?php esc_html_e( 'To reset your password, please enter your email address or username below.', 'ultimate-member' ); ?>
</div>
</div>
</div>
+1 -1
View File
@@ -3,7 +3,7 @@
Plugin Name: Ultimate Member
Plugin URI: http://ultimatemember.com/
Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress
Version: 2.2.5
Version: 2.3.0
Author: Ultimate Member
Author URI: http://ultimatemember.com/
Text Domain: ultimate-member
+70 -74
View File
@@ -5,16 +5,21 @@
*/
// Exit if accessed directly.
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) exit;
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
exit;
}
if ( ! defined( 'um_path' ) )
if ( ! defined( 'um_path' ) ) {
define( 'um_path', plugin_dir_path( __FILE__ ) );
}
if ( ! defined( 'um_url' ) )
if ( ! defined( 'um_url' ) ) {
define( 'um_url', plugin_dir_url( __FILE__ ) );
}
if ( ! defined( 'um_plugin' ) )
if ( ! defined( 'um_plugin' ) ) {
define( 'um_plugin', plugin_basename( __FILE__ ) );
}
//for delete Email options only for Core email notifications
remove_all_filters( 'um_email_notifications' );
@@ -31,13 +36,6 @@ if ( ! empty( $delete_options ) ) {
$upl_folder = UM()->files()->upload_basedir;
UM()->files()->remove_dir( $upl_folder );
//remove core pages
foreach ( UM()->config()->core_pages as $page_key => $page_value ) {
$page_id = UM()->options()->get( UM()->options()->get_core_page_id( $page_key ) );
if ( ! empty( $page_id ) )
wp_delete_post( $page_id, true );
}
//remove core settings
$settings_defaults = UM()->config()->settings_defaults;
foreach ( $settings_defaults as $k => $v ) {
@@ -45,24 +43,26 @@ if ( ! empty( $delete_options ) ) {
}
//delete UM Custom Post Types posts
$um_posts = get_posts( array(
'post_type' => array(
'um_form',
'um_directory',
'um_role',
'um_private_content',
'um_mailchimp',
'um_profile_tabs',
'um_social_login',
'um_review',
'um_frontend_posting',
'um_notice'
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1
) );
$um_posts = get_posts(
array(
'post_type' => array(
'um_form',
'um_directory',
'um_role',
'um_private_content',
'um_mailchimp',
'um_profile_tabs',
'um_social_login',
'um_review',
'um_frontend_posting',
'um_notice',
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1,
)
);
foreach ( $um_posts as $um_post ){
foreach ( $um_posts as $um_post ) {
delete_option( 'um_existing_rows_' . $um_post->ID );
delete_option( 'um_form_rowdata_' . $um_post->ID );
wp_delete_post( $um_post->ID, 1 );
@@ -84,17 +84,6 @@ if ( ! empty( $delete_options ) ) {
global $wpdb;
//remove extensions core pages
$ext_pages = $wpdb->get_results( "
SELECT post_id
FROM {$wpdb->postmeta}
WHERE meta_key = '_um_core'
", ARRAY_A );
foreach ( $ext_pages as $page_id ) {
wp_delete_post( $page_id['post_id'], 1 );
}
$wpdb->query(
"DELETE
FROM {$wpdb->usermeta}
@@ -132,12 +121,12 @@ if ( ! empty( $delete_options ) ) {
//remove all tables from extensions
$all_tables = "SHOW TABLES LIKE '{$wpdb->prefix}um\_%'";
$results = $wpdb->get_results( $all_tables );
if( $results ){
foreach( $results as $index => $value ) {
foreach( $value as $table_name ) {
$um_groups_members = $wpdb->prefix.'um_groups_members';
if( $table_name == $um_groups_members ){
$results = $wpdb->get_results( $all_tables );
if ( $results ) {
foreach ( $results as $index => $value ) {
foreach ( $value as $table_name ) {
$um_groups_members = $wpdb->prefix . 'um_groups_members';
if ( $table_name === $um_groups_members ) {
$wpdb->query( "
DELETE posts, term_rel, pmeta, terms, tax, commetns
FROM {$wpdb->posts} posts
@@ -154,6 +143,7 @@ if ( ! empty( $delete_options ) ) {
WHERE posts.post_type = 'um_groups' OR posts.post_type = 'um_groups_discussion'"
);
}
// phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $table_name is static variable
$wpdb->query( "DROP TABLE IF EXISTS $table_name" );
}
}
@@ -161,14 +151,16 @@ if ( ! empty( $delete_options ) ) {
//remove options from extensions
//user photos
$um_user_photos = get_posts( array(
'post_type' => array(
'um_user_photos'
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1
) );
if( $um_user_photos ) {
$um_user_photos = get_posts(
array(
'post_type' => array(
'um_user_photos',
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1,
)
);
if ( $um_user_photos ) {
foreach ( $um_user_photos as $um_user_photo ) {
$attachments = get_attached_media( 'image', $um_user_photo->ID );
foreach ( $attachments as $attachment ) {
@@ -179,17 +171,19 @@ if ( ! empty( $delete_options ) ) {
}
//user notes
$um_notes = get_posts( array(
'post_type' => array(
'um_notes'
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1
) );
if( $um_notes ){
foreach ( $um_notes as $um_note ){
$um_notes = get_posts(
array(
'post_type' => array(
'um_notes',
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1,
)
);
if ( $um_notes ) {
foreach ( $um_notes as $um_note ) {
$attachments = get_attached_media( 'image', $um_note->ID );
foreach ( $attachments as $attachment ){
foreach ( $attachments as $attachment ) {
wp_delete_attachment( $attachment->ID, 1 );
}
wp_delete_post( $um_note->ID, 1 );
@@ -219,22 +213,24 @@ if ( ! empty( $delete_options ) ) {
option_name LIKE 'widget_um%' OR
option_name LIKE 'ultimatemember_%'" );
foreach( $um_options as $um_option ) {
foreach ( $um_options as $um_option ) {
delete_option( $um_option->option_name );
}
//social activity
$um_activities = get_posts( array(
'post_type' => array(
'um_activity'
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1
) );
$um_activities = get_posts(
array(
'post_type' => array(
'um_activity',
),
'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ),
'numberposts' => -1,
)
);
foreach ( $um_activities as $um_activity ) {
$image = get_post_meta( $um_activity->ID, '_photo', true );
if( $image ){
$user_id = get_post_meta( $um_activity->ID, '_user_id', true );
if ( $image ) {
$user_id = get_post_meta( $um_activity->ID, '_user_id', true );
$upload_dir = wp_upload_dir();
$image_path = $upload_dir['basedir'] . '/ultimatemember/' . $user_id . '/' . $image;
if ( file_exists( $image_path ) ) {
@@ -243,4 +239,4 @@ if ( ! empty( $delete_options ) ) {
}
wp_delete_post( $um_activity->ID, 1 );
}
}
}