Merge pull request #1327 from ultimatemember/development/2.7.x

Version 2.8.0
This commit is contained in:
Mykyta Synelnikov
2023-12-08 01:25:01 +02:00
committed by GitHub
360 changed files with 13109 additions and 14331 deletions
+4 -4
View File
@@ -48,13 +48,13 @@ if ( ! class_exists( 'um\core\AJAX_Common' ) ) {
add_action( 'wp_ajax_um_remove_file', array( UM()->files(), 'ajax_remove_file' ) );
add_action( 'wp_ajax_nopriv_um_remove_file', array( UM()->files(), 'ajax_remove_file' ) );
add_action( 'wp_ajax_nopriv_um_fileupload', array( UM()->files(), 'ajax_file_upload' ) );
add_action( 'wp_ajax_um_fileupload', array( UM()->files(), 'ajax_file_upload' ) );
add_action( 'wp_ajax_nopriv_um_imageupload', array( UM()->files(), 'ajax_image_upload' ) );
add_action( 'wp_ajax_um_imageupload', array( UM()->files(), 'ajax_image_upload' ) );
add_action( 'wp_ajax_nopriv_um_resize_image', array( UM()->files(), 'ajax_resize_image' ) );
add_action( 'wp_ajax_um_resize_image', array( UM()->files(), 'ajax_resize_image' ) );
@@ -62,4 +62,4 @@ if ( ! class_exists( 'um\core\AJAX_Common' ) ) {
add_action( 'wp_ajax_um_get_members', array( UM()->member_directory(), 'ajax_get_members' ) );
}
}
}
}
+17 -17
View File
@@ -860,13 +860,13 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
),
'_um_last_login' => array(
'title' => __('Last Login','ultimate-member'),
'metakey' => '_um_last_login',
'type' => 'text',
'label' => __('Last Login','ultimate-member'),
'required' => 0,
'public' => 1,
'editable' => true,
'title' => __( 'Last Login', 'ultimate-member' ),
'metakey' => '_um_last_login',
'type' => 'text',
'label' => __( 'Last Login', 'ultimate-member' ),
'required' => 0,
'public' => 1,
'editable' => true,
'edit_forbidden' => 1,
),
@@ -907,17 +907,17 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
),
'birth_date' => array(
'title' => __('Birth Date','ultimate-member'),
'metakey' => 'birth_date',
'type' => 'date',
'label' => __('Birth Date','ultimate-member'),
'required' => 0,
'public' => 1,
'editable' => true,
'title' => __( 'Birth Date', 'ultimate-member' ),
'metakey' => 'birth_date',
'type' => 'date',
'label' => __( 'Birth Date', 'ultimate-member' ),
'required' => 0,
'public' => 1,
'editable' => true,
'pretty_format' => 1,
'years' => 115,
'years_x' => 'past',
'icon' => 'um-faicon-calendar'
'years' => 115,
'years_x' => 'past',
'icon' => 'um-faicon-calendar',
),
'gender' => array(
+26 -38
View File
@@ -1,26 +1,18 @@
<?php
namespace um\core;
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'um\core\Date_Time' ) ) {
/**
* Class Date_Time
* @package um\core
*/
class Date_Time {
/**
* Date_Time constructor.
*/
function __construct() {
}
/**
* Display time in specific format
*
@@ -28,20 +20,21 @@ if ( ! class_exists( 'um\core\Date_Time' ) ) {
*
* @return int|string
*/
function get_time( $format ) {
public function get_time( $format ) {
return current_time( $format );
}
/**
* Show a cool time difference between 2 timestamps
*
* @todo compare this function with WordPress native `human_time_diff()` and matbe refactored it.
*
* @param int $from
* @param int $to
*
* @return string
*/
function time_diff( $from, $to = '' ) {
public function time_diff( $from, $to = '' ) {
$since = '';
if ( empty( $to ) ) {
@@ -80,14 +73,13 @@ if ( ! class_exists( 'um\core\Date_Time' ) ) {
$days = 1;
}
if ( $days == 1 ) {
if ( 1 === $days ) {
// translators: %s: time.
$since = sprintf( __( 'Yesterday at %s', 'ultimate-member' ), date_i18n( get_option( 'time_format' ), $from ) );
} else {
// translators: %1$s is a date; %2$s is a time.
$since = sprintf( __( '%1$s at %2$s', 'ultimate-member' ), date_i18n( 'F d', $from ), date_i18n( get_option( 'time_format' ), $from ) );
}
} elseif ( $diff < 30 * DAY_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) {
// translators: %1$s is a date; %2$s is a time.
@@ -131,40 +123,35 @@ if ( ! class_exists( 'um\core\Date_Time' ) ) {
return apply_filters( 'um_human_time_diff', $since, $diff, $from, $to );
}
/**
* Get age
* Get age.
*
* @param $then
* @todo working with timestamps in this function.
*
* @param string $then
*
* @return string
*/
function get_age( $then ) {
public function get_age( $then ) {
if ( ! $then ) {
return '';
}
$then_ts = strtotime( $then );
$then_ts = strtotime( $then );
$then_year = date( 'Y', $then_ts );
$age = date( 'Y' ) - $then_year;
$age = date( 'Y' ) - $then_year;
if ( strtotime( '+' . $age . ' years', $then_ts ) > current_time( 'timestamp' ) ) {
$age--;
}
if ( $age == 1 ) {
// translators: %s: age.
return sprintf( __( '%s year old', 'ultimate-member' ), $age );
}
if ( $age > 1 ) {
// translators: %s: age.
return sprintf( __( '%s years old', 'ultimate-member' ), $age );
}
if ( $age == 0 ) {
if ( 0 === $age ) {
return __( 'Less than 1 year old', 'ultimate-member' );
}
return '';
// translators: %s: age.
return sprintf( _n( '%s year old', '%s years old', $age, 'ultimate-member' ), $age );
}
/**
* Reformat dates
*
@@ -173,22 +160,24 @@ if ( ! class_exists( 'um\core\Date_Time' ) ) {
*
* @return string
*/
function format( $old, $new ) {
public function format( $old, $new ) {
$datetime = new \DateTime( $old );
$output = $datetime->format( $new );
$output = $datetime->format( $new );
return $output;
}
/**
* Get last 30 days as array
*
* @deprecated 2.8.0
*
* @param int $num
* @param bool $reverse
*
* @return array
*/
function get_last_days( $num = 30, $reverse = true ) {
public function get_last_days( $num = 30, $reverse = true ) {
_deprecated_function( __METHOD__, '2.8.0' );
$d = array();
for ( $i = 0; $i < $num; $i++ ) {
$d[ date('Y-m-d', strtotime( '-' . $i . ' days' ) ) ] = date( 'm/d', strtotime( '-' . $i . ' days' ) );
@@ -196,6 +185,5 @@ if ( ! class_exists( 'um\core\Date_Time' ) ) {
return ( $reverse ) ? array_reverse( $d ) : $d;
}
}
}
+109 -108
View File
@@ -74,7 +74,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
* Fields constructor.
*/
public function __construct() {
$this->timestamp = current_time( 'timestamp' );
$this->timestamp = time();
}
/**
@@ -596,150 +596,150 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
/**
* Checks if field has a server-side error
*
* @param string $key
* @param string $key
*
* @return boolean
* @return bool
*/
function is_error( $key ) {
public function is_error( $key ) {
return UM()->form()->has_error( $key );
}
/**
* Checks if field has a notice
*
* @param string $key
* @param string $key
*
* @return boolean
* @return bool
*/
function is_notice( $key ) {
public function is_notice( $key ) {
return UM()->form()->has_notice( $key );
}
/**
* Returns field error
*
* @param string $key
* @param string $key
*
* @return string
*/
function show_error( $key ) {
public function show_error( $key ) {
return UM()->form()->errors[ $key ];
}
/**
* Returns field notices
*
* @param string $key
* @param string $key
*
* @return string
*/
function show_notice( $key ) {
public function show_notice( $key ) {
return UM()->form()->notices[ $key ];
}
/**
* Display field label
* Display field label.
*
* @param string $label
* @param string $key
* @param array $data
* @param string $label Field label.
* @param string $key Field key.
* @param array $data Field data.
*
* @return string
* @return string
*/
function field_label( $label, $key, $data ) {
$output = null;
public function field_label( $label, $key, $data ) {
$output = null;
$output .= '<div class="um-field-label">';
if ( isset( $data['icon'] ) && $data['icon'] != '' && isset( $this->field_icons ) && $this->field_icons != 'off' && ( $this->field_icons == 'label' || true === $this->viewing ) ) {
if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'off' !== $this->field_icons && ( 'label' === $this->field_icons || true === $this->viewing ) ) {
$output .= '<div class="um-field-label-icon"><i class="' . esc_attr( $data['icon'] ) . '" aria-label="' . esc_attr( $label ) . '"></i></div>';
}
if ( true === $this->viewing ) {
/**
* UM hook
* Filters Ultimate Member field label on the Profile form: View mode.
* Note: $key it's field metakey.
*
* @type filter
* @title um_view_label_{$key}
* @description Change field label on view by field $key
* @input_vars
* [{"var":"$label","type":"string","desc":"Field Label"}]
* @change_log
* ["Since: 2.0"]
* @usage add_filter( 'um_view_label_{$key}', 'function_name', 10, 1 );
* @example
* <?php
* add_filter( 'um_view_label_{$key}', 'my_view_label', 10, 1 );
* function my_view_label( $label ) {
* // your code here
* @since 2.0.0
* @since 2.8.0 Added $data attribute.
*
* @hook um_view_label_{$key}
*
* @param {string} $label Field label.
* @param {string} $data Field data.
*
* @return {string} Field label.
*
* @example <caption>Change first name field label on the Profile form: view mode.</caption>
* function my_change_first_name_label( $label, $data ) {
* $label = 'My label';
* return $label;
* }
* ?>
* add_filter( 'um_view_label_first_name', 'my_change_first_name_label', 10, 2 );
*/
$label = apply_filters( "um_view_label_{$key}", $label );
$label = apply_filters( "um_view_label_{$key}", $label, $data );
} else {
/**
* UM hook
* Filters Ultimate Member field label on the Profile form: Edit mode.
* Note: $key it's field metakey.
*
* @type filter
* @title um_edit_label_{$key}
* @description Change field label on edit by field $key
* @input_vars
* [{"var":"$label","type":"string","desc":"Field Label"}]
* @change_log
* ["Since: 2.0"]
* @usage add_filter( 'um_edit_label_{$key}', 'function_name', 10, 1 );
* @example
* <?php
* add_filter( 'um_edit_label_{$key}', 'my_edit_label', 10, 1 );
* function my_edit_label( $label ) {
* // your code here
* @since 2.0.0
* @since 2.8.0 Added $data attribute.
*
* @hook um_edit_label_{$key}
*
* @param {string} $label Field label.
* @param {string} $data Field data.
*
* @return {string} Field label.
*
* @example <caption>Change first name field label on the Profile form: edit mode.</caption>
* function my_change_first_name_label( $label, $data ) {
* $label = 'My label';
* return $label;
* }
* ?>
* add_filter( 'um_edit_label_first_name', 'my_change_first_name_label', 10, 2 );
*/
$label = apply_filters( "um_edit_label_{$key}", $label );
$label = apply_filters( "um_edit_label_{$key}", $label, $data );
/**
* UM hook
* Filters Ultimate Member field label on the Profile form: Edit mode.
*
* @type filter
* @title um_edit_label_all_fields
* @description Change field label on view by field $key
* @input_vars
* [{"var":"$label","type":"string","desc":"Field Label"},
* {"var":"$data","type":"array","desc":"Field Data"}]
* @change_log
* ["Since: 2.0"]
* @usage add_filter( 'um_edit_label_all_fields', 'function_name', 10, 2 );
* @example
* <?php
* add_filter( 'um_edit_label_all_fields', 'my_edit_label_all_fields', 10, 2 );
* function my_edit_label_all_fields( $label, $data ) {
* // your code here
* @since 2.0.0
*
* @hook um_edit_label_all_fields
*
* @param {string} $label Field label.
* @param {string} $data Field data.
*
* @return {string} Field label.
*
* @example <caption>Change first name field label on the Profile form: edit mode.</caption>
* function my_change_first_name_label( $label, $data ) {
* if ( 'first_name' === $data['metakey'] ) {
* $label = 'My label';
* }
* return $label;
* }
* ?>
* add_filter( 'um_edit_label_all_fields', 'my_change_first_name_label', 10, 2 );
*/
$label = apply_filters( 'um_edit_label_all_fields', $label, $data );
}
$fields_without_metakey = UM()->builtin()->get_fields_without_metakey();
$for_attr = '';
if ( ! in_array( $data['type'], $fields_without_metakey ) ) {
$for_attr = '';
if ( ! in_array( $data['type'], $fields_without_metakey, true ) ) {
$for_attr = ' for="' . esc_attr( $key . UM()->form()->form_suffix ) . '"';
}
$output .= '<label' . $for_attr . '>' . __( $label, 'ultimate-member' ) . '</label>';
if ( ! empty( $data['help'] ) && false === $this->viewing && ! strstr( $key, 'confirm_user_pass' ) ) {
if ( ! empty( $data['help'] ) && false === $this->viewing && false === strpos( $key, 'confirm_user_pass' ) ) {
if ( ! UM()->mobile()->isMobile() ) {
if ( false === $this->disable_tooltips ) {
$output .= '<span class="um-tip um-tip-' . ( is_rtl() ? 'e' : 'w' ) . '" title="' . esc_attr__( $data['help'], 'ultimate-member' ) . '"><i class="um-icon-help-circled"></i></span>';
}
}
if ( UM()->mobile()->isMobile() || false !== $this->disable_tooltips ) {
if ( false !== $this->disable_tooltips || UM()->mobile()->isMobile() ) {
$output .= '<span class="um-tip-text">' . __( $data['help'], 'ultimate-member' ) . '</span>';
}
}
@@ -749,9 +749,8 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
return $output;
}
/**
* Output field classes
* Output field classes.
*
* @param string $key
* @param array $data
@@ -759,7 +758,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
*
* @return string
*/
function get_class( $key, $data, $add = null ) {
public function get_class( $key, $data, $add = null ) {
$classes = null;
$classes .= 'um-form-field ';
@@ -850,8 +849,8 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
// normal state
if ( isset( UM()->form()->post_form[ $key ] ) ) {
//show empty value for password fields
if ( strstr( $key, 'user_pass' ) && $this->set_mode != 'password' ) {
// Show empty value for password fields.
if ( 'password' !== $this->set_mode && false !== strpos( $key, 'user_pass' ) ) {
return '';
}
@@ -863,10 +862,10 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
return stripslashes_deep( UM()->form()->post_form[ $key ] );
} elseif ( um_user( $key ) && true === $this->editing ) {
} elseif ( true === $this->editing && um_user( $key ) ) {
//show empty value for password fields
if ( strstr( $key, 'user_pass' ) || $type == 'password' ) {
// Show empty value for password fields.
if ( 'password' === $type || false !== strpos( $key, 'user_pass' ) ) {
return '';
}
@@ -916,7 +915,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
*/
$value = apply_filters( "um_edit_{$type}_field_value", $value, $key );
} elseif ( ( um_user( $key ) || isset( $data['show_anyway'] ) ) && true === $this->viewing ) {
} elseif ( true === $this->viewing && ( um_user( $key ) || isset( $data['show_anyway'] ) ) ) {
return um_filtered_value( $key, $data );
@@ -1465,11 +1464,10 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
*
* @return array $arr_options
*/
function get_options_from_callback( $data, $type ) {
public function get_options_from_callback( $data, $type ) {
$arr_options = array();
if ( in_array( $type, array( 'select', 'multiselect' ) ) && ! empty( $data['custom_dropdown_options_source'] ) ) {
if ( ! empty( $data['custom_dropdown_options_source'] ) && in_array( $type, array( 'select', 'multiselect' ), true ) ) {
if ( $this->is_source_blacklisted( $data['custom_dropdown_options_source'] ) ) {
return $arr_options;
}
@@ -1481,7 +1479,6 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
$arr_options = call_user_func( $data['custom_dropdown_options_source'] );
}
}
}
return $arr_options;
@@ -1525,27 +1522,29 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
}
/**
* UM hook
* Filters Ultimate Member field label.
*
* @type filter
* @title um_change_field_label
* @description Change Field Label
* @input_vars
* [{"var":"$label","type":"string","desc":"Field Label"},
* {"var":"$key","type":"string","desc":"Field Key"}]
* @change_log
* ["Since: 2.0.30"]
* @usage add_filter( 'um_change_field_label', 'function_name', 10, 2 );
* @example
* <?php
* add_filter( 'um_change_field_label', 'my_change_field_label', 10, 2 );
* function my_form_fields( $label, $key ) {
* // your code here
* @since 2.0.30
* @since 2.8.0 Added $data attribute.
*
* @hook um_change_field_label
*
* @param {string} $label Field label.
* @param {string} $key Field key.
* @param {array} $data Field data.
*
* @return {string} Field label.
*
* @example <caption>Change first name field label.</caption>
* function my_change_field_label( $label, $key, $data ) {
* if ( 'first_name' === $key ) {
* $label = 'My label';
* }
* return $label;
* }
* ?>
* add_filter( 'um_change_field_label', 'my_change_field_label', 10, 3 );
*/
$label = apply_filters( 'um_change_field_label', $label, $key );
$label = apply_filters( 'um_change_field_label', $label, $key, $fields[ $key ] );
$label = sprintf( __( '%s', 'ultimate-member' ), $label );
return $label;
@@ -1629,6 +1628,10 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
$array = ( isset( UM()->builtin()->predefined_fields[ $key ] ) ) ? UM()->builtin()->predefined_fields[ $key ] : UM()->builtin()->all_user_fields[ $key ];
}
if ( empty( $array['type'] ) ) {
return '';
}
$array['classes'] = null;
if ( ! isset( $array['placeholder'] ) ) {
@@ -4122,7 +4125,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
// find rows
foreach ( $this->get_fields as $key => $array ) {
if ( $array['type'] == 'row' ) {
if ( isset( $array['type'] ) && 'row' === $array['type'] ) {
$this->rows[ $key ] = $array;
unset( $this->get_fields[ $key ] ); // not needed anymore
}
@@ -4165,7 +4168,6 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
}
// sub row fields
$subrow_fields = null;
$subrow_fields = $this->get_fields_in_subrow( $row_fields, $c );
if ( is_array( $subrow_fields ) ) {
@@ -4433,7 +4435,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
$id_attr = ' id="' . esc_attr( $key . UM()->form()->form_suffix ) . '"';
}
if ( empty( $res ) ) {
if ( empty( $res ) && ! ( 'number' === $type && '' !== $res ) ) {
$output = '';
} else {
$output .= '<div class="um-field-area">';
@@ -4663,7 +4665,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
// find rows
foreach ( $this->get_fields as $key => $array ) {
if ( $array['type'] == 'row' ) {
if ( isset( $array['type'] ) && 'row' === $array['type'] ) {
$this->rows[ $key ] = $array;
unset( $this->get_fields[ $key ] ); // not needed anymore
}
@@ -4707,7 +4709,6 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
}
// sub row fields
$subrow_fields = null;
$subrow_fields = $this->get_fields_in_subrow( $row_fields, $c );
if ( is_array( $subrow_fields ) ) {
+1 -6
View File
@@ -259,11 +259,10 @@ if ( ! class_exists( 'um\core\Files' ) ) {
exit;
}
/**
* Remove file by AJAX
*/
function ajax_remove_file() {
public function ajax_remove_file() {
UM()->check_ajax_nonce();
if ( empty( $_POST['src'] ) ) {
@@ -283,14 +282,11 @@ if ( ! class_exists( 'um\core\Files' ) ) {
$mode = sanitize_key( $_POST['mode'] );
if ( $mode == 'register' || empty( $_POST['user_id'] ) ) {
$is_temp = um_is_temp_upload( $src );
if ( ! $is_temp ) {
wp_send_json_success();
}
} else {
$user_id = absint( $_POST['user_id'] );
if ( ! UM()->roles()->um_current_user_can( 'edit', $user_id ) ) {
@@ -303,7 +299,6 @@ if ( ! class_exists( 'um\core\Files' ) ) {
wp_send_json_success();
}
}
}
if ( $this->delete_file( $src ) ) {
+16 -10
View File
@@ -65,11 +65,12 @@ if ( ! class_exists( 'um\core\Form' ) ) {
public $usermeta_whitelist = array();
/**
* Form constructor.
* Hook for singleton
* @since 2.8.0
*/
public function __construct() {
public function hooks() {
add_action( 'template_redirect', array( &$this, 'form_init' ), 2 );
add_action( 'init', array( &$this, 'field_declare' ), 10 );
add_action( 'init', array( &$this, 'field_declare' ) );
}
/**
@@ -115,6 +116,8 @@ if ( ! class_exists( 'um\core\Form' ) ) {
public function ajax_select_options() {
UM()->check_ajax_nonce();
// phpcs:disable WordPress.Security.NonceVerification
$arr_options = array();
$arr_options['status'] = 'success';
$arr_options['post'] = $_POST;
@@ -163,9 +166,9 @@ if ( ! class_exists( 'um\core\Form' ) ) {
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;
UM()->fields()->set_mode = 'profile';
$form_fields = UM()->fields()->get_fields();
$arr_options['fields'] = $form_fields;
if ( isset( $arr_options['post']['members_directory'] ) && 'yes' === $arr_options['post']['members_directory'] ) {
global $wpdb;
@@ -181,7 +184,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
);
if ( ! empty( $values_array ) ) {
$parent_dropdown = isset( $arr_options['field']['parent_dropdown_relationship'] ) ? $arr_options['field']['parent_dropdown_relationship'] : '';
$parent_dropdown = isset( $arr_options['post']['parent_option_name'] ) ? $arr_options['post']['parent_option_name'] : '';
$arr_options['items'] = call_user_func( $ajax_source_func, $parent_dropdown );
if ( array_keys( $arr_options['items'] ) !== range( 0, count( $arr_options['items'] ) - 1 ) ) {
@@ -241,6 +244,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
}
}
// phpcs:enable WordPress.Security.NonceVerification
wp_send_json( $arr_options );
}
}
@@ -505,7 +509,6 @@ if ( ! class_exists( 'um\core\Form' ) ) {
// Add required usermeta for register.
if ( 'register' === $this->form_data['mode'] ) {
$cf_metakeys[] = 'form_id';
$cf_metakeys[] = 'timestamp';
}
/**
@@ -607,6 +610,9 @@ if ( ! class_exists( 'um\core\Form' ) ) {
$this->post_form['role'] = $role;
$maybe_set_default_role = false;
// Force adding `role` metakey if there is a role-type field on the form. It's required to User Profile.
$this->usermeta_whitelist[] = 'role';
}
}
}
@@ -748,7 +754,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
$form[ $k ] = apply_filters( 'um_sanitize_form_field', $form[ $k ], $field );
break;
case 'number':
$form[ $k ] = (int) $form[ $k ];
$form[ $k ] = '' !== $form[ $k ] ? (int) $form[ $k ] : '';
break;
case 'textarea':
if ( ! empty( $field['html'] ) || ( UM()->profile()->get_show_bio_key( $form ) === $k && UM()->options()->get( 'profile_show_html_bio' ) ) ) {
@@ -780,7 +786,7 @@ if ( ! class_exists( 'um\core\Form' ) ) {
$f = UM()->builtin()->get_a_field( $k );
if ( is_array( $f ) && array_key_exists( 'match', $f ) && array_key_exists( 'advanced', $f ) && 'social' === $f['advanced'] ) {
$v = sanitize_text_field( $form[ $k ] );
$v = esc_url_raw( $form[ $k ] );
// Make a proper social link
if ( ! empty( $v ) ) {
+3 -2
View File
@@ -74,7 +74,7 @@ if ( ! class_exists( 'um\core\GDPR' ) ) {
*/
public function add_agreement_date( $submitted ) {
if ( isset( $submitted['use_gdpr_agreement'] ) ) {
$submitted['use_gdpr_agreement'] = time();
$submitted['use_gdpr_agreement'] = current_time( 'mysql', true );
}
return $submitted;
@@ -87,7 +87,8 @@ if ( ! class_exists( 'um\core\GDPR' ) ) {
*/
public function email_registration_data( $submitted ) {
if ( ! empty( $submitted['use_gdpr_agreement'] ) ) {
$submitted['GDPR Applied'] = wp_date( get_option( 'date_format', 'Y-m-d' ) . ' ' . get_option( 'time_format', 'H:i:s' ), $submitted['use_gdpr_agreement'] );
$title = __( 'GDPR Applied', 'ultimate-member' );
$submitted[ $title ] = wp_date( get_option( 'date_format', 'F j, Y' ) . ' ' . get_option( 'time_format', 'g:i a' ), strtotime( $submitted['use_gdpr_agreement'] ) );
unset( $submitted['use_gdpr_agreement'] );
}
@@ -405,8 +405,8 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
}
}
$from_date = date( 'Y-m-d H:s:i', strtotime( min( $value ) ) + $offset * HOUR_IN_SECONDS ); // client time zone offset
$to_date = date( 'Y-m-d H:s:i', strtotime( max( $value ) ) + $offset * HOUR_IN_SECONDS + DAY_IN_SECONDS - 1 ); // time 23:59
$from_date = date( 'Y-m-d H:i:s', strtotime( min( $value ) ) + $offset * HOUR_IN_SECONDS ); // client time zone offset
$to_date = date( 'Y-m-d H:i:s', strtotime( max( $value ) ) + $offset * HOUR_IN_SECONDS + DAY_IN_SECONDS - 1 ); // time 23:59
$this->where_clauses[] = $wpdb->prepare( "u.user_registered BETWEEN %s AND %s", $from_date, $to_date );
@@ -416,7 +416,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
break;
case 'last_login':
$offset = 0;
if ( ! $is_default ) {
if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) {
@@ -429,8 +428,8 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
}
}
$from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset
$to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59
$from_date = gmdate( 'Y-m-d H:i:s', (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ) ); // client time zone offset
$to_date = gmdate( 'Y-m-d H:i:s', (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1 ); // time 23:59
$this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID";
@@ -764,11 +763,10 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) {
$this->sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) {$order} ";
} elseif ( $sortby == 'last_login' ) {
} elseif ( 'last_login' === $sortby ) {
$this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '_um_last_login' )";
$this->sql_order = " ORDER BY CAST( umm_sort.um_value AS SIGNED ) DESC ";
$this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '_um_last_login' )";
$this->sql_order = ' ORDER BY CAST( umm_sort.um_value AS DATETIME ) DESC ';
} elseif ( $sortby == 'last_first_name' ) {
+57 -67
View File
@@ -364,7 +364,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
if ( ! empty( UM()->builtin()->saved_fields ) ) {
foreach ( UM()->builtin()->saved_fields as $key => $data ) {
if ( $key == '_um_last_login' ) {
if ( '_um_last_login' === $key ) {
continue;
}
@@ -419,7 +419,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
if ( ! empty( UM()->builtin()->saved_fields ) ) {
foreach ( UM()->builtin()->saved_fields as $key => $data ) {
if ( $key == '_um_last_login' ) {
if ( '_um_last_login' === $key ) {
continue;
}
@@ -527,10 +527,9 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
$field_key = $filter;
if ( $filter == 'last_login' ) {
if ( 'last_login' === $filter ) {
$field_key = '_um_last_login';
}
if ( $filter == 'role' ) {
} elseif ( 'role' === $filter ) {
$field_key = 'role_select';
}
@@ -641,9 +640,9 @@ 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' ), true ) ) {
$values_array = array_map( 'maybe_unserialize', $values_array );
$temp_values = array();
$temp_values = array();
foreach ( $values_array as $values ) {
if ( is_array( $values ) ) {
$temp_values = array_merge( $temp_values, $values );
@@ -654,7 +653,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$values_array = array_unique( $temp_values );
}
if ( $attrs['metakey'] != 'online_status' && empty( $values_array ) ) {
if ( 'online_status' !== $attrs['metakey'] && empty( $values_array ) ) {
ob_get_clean();
return '';
}
@@ -721,7 +720,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$attrs['options'] = apply_filters( 'um_member_directory_filter_select_options', $attrs['options'], $values_array, $attrs );
if ( empty( $attrs['options'] ) || ! is_array( $attrs['options'] ) ) {
if ( ( empty( $attrs['options'] ) || ! is_array( $attrs['options'] ) ) && ! ( ! empty( $attrs['custom_dropdown_options_source'] ) && ! empty( $attrs['parent_dropdown_relationship'] ) ) ) {
ob_get_clean();
return '';
}
@@ -812,29 +811,28 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
break;
}
case 'datepicker': {
case 'datepicker':
$range = $this->datepicker_filters_range( $filter );
$label = ! empty( $attrs['label'] ) ? $attrs['label'] : $attrs['title'];
if ( $range ) { ?>
if ( $range ) {
$min = strtotime( $range[0] );
$max = strtotime( $range[1] );
?>
<input type="text" id="<?php echo $filter; ?>_from" name="<?php echo $filter; ?>_from" class="um-datepicker-filter"
placeholder="<?php esc_attr_e( sprintf( '%s From', stripslashes( $label ) ), 'ultimate-member' ); ?>"
data-filter-label="<?php echo esc_attr( stripslashes( $label ) ); ?>"
data-date_min="<?php echo $range[0] ?>" data-date_max="<?php echo $range[1] ?>"
data-date_min="<?php echo esc_attr( $min ); ?>" data-date_max="<?php echo esc_attr( $max ); ?>"
data-filter_name="<?php echo $filter; ?>" data-range="from" data-value="<?php echo ! empty( $default_value ) ? esc_attr( strtotime( min( $default_value ) ) ) : '' ?>" />
<input type="text" id="<?php echo $filter; ?>_to" name="<?php echo $filter; ?>_to" class="um-datepicker-filter"
placeholder="<?php esc_attr_e( sprintf( '%s To', stripslashes( $label ) ), 'ultimate-member' ); ?>"
data-filter-label="<?php echo esc_attr( stripslashes( $label ) ); ?>"
data-date_min="<?php echo $range[0] ?>" data-date_max="<?php echo $range[1] ?>"
data-date_min="<?php echo esc_attr( $min ); ?>" data-date_max="<?php echo esc_attr( $max ); ?>"
data-filter_name="<?php echo $filter; ?>" data-range="to" data-value="<?php echo ! empty( $default_value ) ? esc_attr( strtotime( max( $default_value ) ) ) : '' ?>" />
<?php }
<?php
}
break;
}
case 'timepicker': {
$range = $this->timepicker_filters_range( $filter );
@@ -996,19 +994,16 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
return $placeholders;
}
/**
* @param $filter
*
* @return mixed
*/
function datepicker_filters_range( $filter ) {
public function datepicker_filters_range( $filter ) {
global $wpdb;
switch ( $filter ) {
default: {
default:
global $wpdb;
$meta = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT meta_value
FROM {$wpdb->usermeta}
@@ -1024,22 +1019,22 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$range = apply_filters( "um_member_directory_filter_{$filter}_datepicker", $range );
break;
}
case 'last_login': {
$meta = $wpdb->get_col( "SELECT DISTINCT meta_value
case 'last_login':
$meta = $wpdb->get_row(
"SELECT DISTINCT COUNT(*) AS total,
MIN(meta_value) AS min,
MAX(meta_value) AS max
FROM {$wpdb->usermeta}
WHERE meta_key='_um_last_login'
ORDER BY meta_value DESC" );
if ( empty( $meta ) || count( $meta ) === 1 ) {
WHERE meta_key = '_um_last_login'",
ARRAY_A
);
if ( empty( $meta['total'] ) || 1 === absint( $meta['total'] ) ) {
$range = false;
} elseif ( ! empty( $meta ) ) {
$range = array( min( $meta ), max( $meta ) );
} elseif ( array_key_exists( 'min', $meta ) && array_key_exists( 'max', $meta ) ) {
$range = array( $meta['min'], $meta['max'] );
}
break;
}
case 'user_registered': {
case 'user_registered':
$meta = $wpdb->get_col(
"SELECT DISTINCT user_registered
FROM {$wpdb->users}
@@ -1053,14 +1048,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
}
break;
}
}
return $range;
}
/**
* @param $filter
*
@@ -1349,7 +1341,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
if ( ! empty( UM()->builtin()->saved_fields ) ) {
foreach ( UM()->builtin()->saved_fields as $key => $data ) {
if ( $key == '_um_last_login' ) {
if ( '_um_last_login' === $key ) {
continue;
}
@@ -1402,22 +1394,22 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$this->query_args['orderby'] = array( $sortby . '_c' => 'ASC' );
unset( $this->query_args['order'] );
} elseif ( $sortby == 'last_login' ) {
$this->query_args['orderby'] = array( 'um_last_login' => 'DESC' );
} elseif ( 'last_login' === $sortby ) {
$this->query_args['orderby'] = array( 'um_last_login' => 'DESC' );
$this->query_args['meta_query'][] = array(
'relation' => 'OR',
'relation' => 'OR',
array(
'key' => '_um_last_login',
'compare' => 'EXISTS',
'key' => '_um_last_login',
'compare' => 'EXISTS',
'type' => 'DATETIME',
),
'um_last_login' => array(
'key' => '_um_last_login',
'compare' => 'NOT EXISTS',
'key' => '_um_last_login',
'compare' => 'NOT EXISTS',
'type' => 'DATETIME',
),
);
unset( $this->query_args['order'] );
} elseif ( $sortby == 'last_first_name' ) {
$this->query_args['meta_query'][] = array(
@@ -1534,12 +1526,12 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
if ( strstr( $sortby, '_desc' ) ) {
$sortby = str_replace( '_desc', '', $sortby );
$order = 'DESC';
$order = 'DESC';
}
if ( strstr( $sortby, '_asc' ) ) {
$sortby = str_replace( '_asc', '', $sortby );
$order = 'ASC';
$order = 'ASC';
}
$this->query_args['orderby'] = $sortby;
@@ -1550,7 +1542,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
add_filter( 'pre_user_query', array( &$this, 'sortby_randomly' ), 10, 1 );
}
/**
* UM hook
*
@@ -1984,9 +1975,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
break;
case 'birth_date':
$from_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ), date( 'Y', time() - min( $value ) * YEAR_IN_SECONDS ) ) );
$to_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ) + 1, date( 'Y', time() - ( max( $value ) + 1 ) * YEAR_IN_SECONDS ) ) );
$to_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ) + 1, date( 'Y', time() - ( max( $value ) + 1 ) * YEAR_IN_SECONDS ) ) );
$meta_query = array(
array(
@@ -1995,7 +1985,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
'compare' => 'BETWEEN',
'type' => 'DATE',
'inclusive' => true,
)
),
);
$this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
@@ -2010,8 +2000,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$offset = (int) $_POST['gmt_offset'];
}
$from_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', min( $value ) ) . "+$offset hours" ) );
$to_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', max( $value ) ) . "+$offset hours" ) );
$from_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', min( $value ) ) . "+$offset hours" ) );
$to_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', max( $value ) ) . "+$offset hours" ) );
$date_query = array(
array(
@@ -2032,7 +2022,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
break;
case 'last_login':
$offset = 0;
if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) {
$offset = (int) $_POST['gmt_offset'];
@@ -2043,10 +2032,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$meta_query = array(
array(
'key' => '_um_last_login',
'value' => array( $from_date, $to_date ),
'value' => array( gmdate( 'Y-m-d H:i:s', $from_date ), gmdate( 'Y-m-d H:i:s', $to_date ) ),
'compare' => 'BETWEEN',
'inclusive' => true,
)
'type' => 'DATETIME',
),
);
$this->custom_filters_in_query[ $field ] = $value;
@@ -2054,7 +2044,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
break;
}
}
}
@@ -2262,8 +2251,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$offset = $gmt_offset;
}
$from_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', min( $value ) ) . "+$offset hours" ) );
$to_date = date( 'Y-m-d H:s:i', strtotime( date( 'Y-m-d H:s:i', max( $value ) ) . "+$offset hours" ) );
$from_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', min( $value ) ) . "+$offset hours" ) );
$to_date = date( 'Y-m-d H:i:s', strtotime( date( 'Y-m-d H:i:s', max( $value ) ) . "+$offset hours" ) );
$date_query = array(
array(
@@ -2287,15 +2276,16 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$offset = $gmt_offset;
}
$from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset
$to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59
$from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset
$to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59
$meta_query = array(
array(
'key' => '_um_last_login',
'value' => array( $from_date, $to_date ),
'value' => array( $from_date, $to_date ),
'compare' => 'BETWEEN',
'inclusive' => true,
)
'type' => 'DATETIME',
),
);
$this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) );
-80
View File
@@ -489,85 +489,5 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) {
return $user_in_url;
}
/**
* Get action url for admin use
*
* @param $action
* @param $subaction
*
* @deprecated 2.6.9
*
* @return mixed|string|void
*/
public function admin_act_url( $action, $subaction ) {
_deprecated_function( __METHOD__, '2.6.9' );
$url = add_query_arg(
array(
'um_adm_action' => $action,
'sub' => $subaction,
'user_id' => um_user( 'ID' ),
'_wpnonce' => wp_create_nonce( $action ),
)
);
return $url;
}
/**
* SEO canonical href bugfix
*
* @deprecated since version 2.1.7
*
* @todo remove since 2.7.0
* @see function um_profile_remove_wpseo()
*/
public function um_rel_canonical_() {
_deprecated_function( __METHOD__, '2.1.7', 'um_profile_remove_wpseo()' );
global $wp_the_query;
if ( ! is_singular() )
return;
/**
* UM hook
*
* @type filter
* @title um_allow_canonical__filter
* @description Allow canonical
* @input_vars
* [{"var":"$allow_canonical","type":"bool","desc":"Allow?"}]
* @change_log
* ["Since: 2.0"]
* @usage
* <?php add_filter( 'um_allow_canonical__filter', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_allow_canonical__filter', 'my_allow_canonical', 10, 1 );
* function my_allow_canonical( $allow_canonical ) {
* // your code here
* return $allow_canonical;
* }
* ?>
*/
$enable_canonical = apply_filters( "um_allow_canonical__filter", true );
if( ! $enable_canonical )
return;
if ( !$id = $wp_the_query->get_queried_object_id() )
return;
if ( UM()->config()->permalinks['user'] == $id ) {
$link = esc_url( $this->get_current_url() );
echo "<link rel='canonical' href='$link' />\n";
return;
}
$link = get_permalink( $id );
if ( $page = get_query_var( 'cpage' ) ) {
$link = get_comments_pagenum_link( $page );
echo "<link rel='canonical' href='$link' />\n";
}
}
}
}
+19 -22
View File
@@ -412,43 +412,40 @@ if ( ! class_exists( 'um\core\Query' ) ) {
return false;
}
/**
* Get post data
*
* @param $post_id
* @param int $post_id
*
* @return mixed
* @return array
*/
function post_data( $post_id ) {
public function post_data( $post_id ) {
$array['form_id'] = $post_id;
$mode = $this->get_attr('mode', $post_id);
$meta = get_post_custom( $post_id );
foreach ($meta as $k => $v){
if ( strstr($k, '_um_'.$mode.'_' ) ) {
$k = str_replace('_um_'.$mode.'_', '', $k);
$array[$k] = $v[0];
} elseif ($k == '_um_mode'){
$k = str_replace('_um_', '', $k);
$array[$k] = $v[0];
} elseif ( strstr($k, '_um_') ) {
$k = str_replace('_um_', '', $k);
$array[$k] = $v[0];
$mode = $this->get_attr( 'mode', $post_id );
$meta = get_post_custom( $post_id );
foreach ( $meta as $k => $v ) {
if ( strstr( $k, '_um_' . $mode . '_' ) ) {
$k = str_replace( '_um_' . $mode . '_', '', $k );
$array[ $k ] = $v[0];
} elseif ( '_um_mode' === $k ) {
$k = str_replace( '_um_', '', $k );
$array[ $k ] = $v[0];
} elseif ( strstr( $k, '_um_' ) ) {
$k = str_replace( '_um_', '', $k );
$array[ $k ] = $v[0];
}
}
foreach( $array as $k => $v ) {
if ( strstr( $k, 'login_') || strstr( $k, 'register_' ) || strstr( $k, 'profile_' ) ){
if ( $mode != 'directory' ) {
unset($array[$k]);
foreach ( $array as $k => $v ) {
if ( strstr( $k, 'login_' ) || strstr( $k, 'register_' ) || strstr( $k, 'profile_' ) ) {
if ( 'directory' !== $mode ) {
unset( $array[ $k ] );
}
}
}
return $array;
}
/**
* Capture selected value
*
+34 -28
View File
@@ -655,7 +655,7 @@ if ( ! class_exists( 'um\core\Roles_Capabilities' ) ) {
*
* @return array
*/
function get_roles( $add_default = false, $exclude = null ) {
public function get_roles( $add_default = false, $exclude = null ) {
global $wp_roles;
if ( empty( $wp_roles ) ) {
@@ -670,11 +670,19 @@ if ( ! class_exists( 'um\core\Roles_Capabilities' ) ) {
if ( $exclude ) {
foreach ( $exclude as $role ) {
unset ( $roles[ $role ] );
unset( $roles[ $role ] );
}
}
$roles = array_map( 'stripslashes', $roles );
$roles = array_map(
function( $role ) {
if ( is_string( $role ) ) {
return stripslashes( $role );
}
return $role;
},
$roles
);
return $roles;
}
@@ -741,54 +749,52 @@ if ( ! class_exists( 'um\core\Roles_Capabilities' ) ) {
return $return;
}
/**
* User can ( role settings )
* User can (role settings)
*
* @param $permission
* @return bool|mixed
*/
function um_user_can( $permission ) {
if ( ! is_user_logged_in() )
public function um_user_can( $permission ) {
if ( ! is_user_logged_in() ) {
return false;
}
$user_id = get_current_user_id();
$role = UM()->roles()->get_priority_user_role( $user_id );
$role = UM()->roles()->get_priority_user_role( $user_id );
$permissions = $this->role_data( $role );
/**
* UM hook
* Filters User Permissions.
*
* @type filter
* @title um_user_permissions_filter
* @description Change User Permissions
* @input_vars
* [{"var":"$permissions","type":"array","desc":"User Permissions"},
* {"var":"$user_id","type":"int","desc":"User ID"}]
* @change_log
* ["Since: 2.0"]
* @usage
* <?php add_filter( 'um_user_permissions_filter', 'function_name', 10, 2 ); ?>
* @example
* <?php
* add_filter( 'um_user_permissions_filter', 'my_user_permissions', 10, 2 );
* @param {array} $permissions User Permissions.
* @param {int} $user_id User ID.
*
* @return {array} User Permissions.
*
* @since 2.0
* @hook um_user_permissions_filter
*
* @example <caption>Add custom user permissions.</caption>
* function my_user_permissions( $permissions, $user_id ) {
* // your code here
* return $permissions;
* }
* ?>
* add_filter( 'um_user_permissions_filter', 'my_user_permissions', 10, 2 );
*/
$permissions = apply_filters( 'um_user_permissions_filter', $permissions, $user_id );
if ( isset( $permissions[ $permission ] ) && is_serialized( $permissions[ $permission ] ) )
return unserialize( $permissions[ $permission ] );
if ( isset( $permissions[ $permission ] ) && is_serialized( $permissions[ $permission ] ) ) {
return maybe_unserialize( $permissions[ $permission ] );
}
if ( isset( $permissions[ $permission ] ) && is_array( $permissions[ $permission ] ) )
if ( isset( $permissions[ $permission ] ) && is_array( $permissions[ $permission ] ) ) {
return $permissions[ $permission ];
}
if ( isset( $permissions[ $permission ] ) && $permissions[ $permission ] == 1 )
if ( isset( $permissions[ $permission ] ) && $permissions[ $permission ] == 1 ) {
return true;
}
return false;
}
+7 -11
View File
@@ -242,15 +242,14 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
}
}
/**
* Extend body classes
* Extend body classes.
*
* @param $classes
* @param array $classes
*
* @return array
*/
function body_class( $classes ) {
public function body_class( $classes ) {
$array = UM()->config()->permalinks;
if ( ! $array ) {
return $classes;
@@ -258,7 +257,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
foreach ( $array as $slug => $info ) {
if ( um_is_core_page( $slug ) ) {
$classes[] = 'um';
$classes[] = 'um-page-' . $slug;
if ( is_user_logged_in() ) {
@@ -266,7 +265,6 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
} else {
$classes[] = 'um-page-loggedout';
}
}
}
@@ -673,6 +671,8 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
return '';
}
UM()->fields()->set_id = absint( $this->form_id );
// get data into one global array
$post_data = UM()->query()->post_data( $this->form_id );
$args = array_merge( $args, $post_data );
@@ -716,11 +716,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
if ( 'directory' === $args['mode'] ) {
wp_enqueue_script( 'um_members' );
if ( is_rtl() ) {
wp_enqueue_style( 'um_members_rtl' );
} else {
wp_enqueue_style( 'um_members' );
}
wp_enqueue_style( 'um_members' );
}
if ( 'directory' !== $args['mode'] ) {
+1 -1
View File
@@ -1280,7 +1280,7 @@ if ( ! class_exists( 'um\core\Uploader' ) ) {
//move temporary file from temp directory to the correct user directory
$temp_file_path = UM()->uploader()->get_core_temp_dir() . DIRECTORY_SEPARATOR . $filename;
if ( file_exists( $temp_file_path ) ) {
$extra_hash = hash( 'crc32b', current_time( 'timestamp' ) );
$extra_hash = hash( 'crc32b', time() );
if ( strpos( $filename , 'stream_photo_' ) !== false ) {
$new_filename = str_replace("stream_photo_","stream_photo_{$extra_hash}_", $filename );
+6 -58
View File
@@ -1164,14 +1164,12 @@ if ( ! class_exists( 'um\core\User' ) ) {
return $new;
}
/**
* @param $user_id
*
* @return mixed|string
*/
function get_cached_data( $user_id ) {
public function get_cached_data( $user_id ) {
$disallow_cache = UM()->options()->get( 'um_profile_object_cache_stop' );
if ( $disallow_cache ) {
return '';
@@ -1180,30 +1178,8 @@ if ( ! class_exists( 'um\core\User' ) ) {
if ( is_numeric( $user_id ) && $user_id > 0 ) {
$find_user = get_option( "um_cache_userdata_{$user_id}" );
if ( $find_user ) {
/**
* UM hook
*
* @type filter
* @title um_user_permissions_filter
* @description Change User Permissions
* @input_vars
* [{"var":"$permissions","type":"array","desc":"User Permissions"},
* {"var":"$user_id","type":"int","desc":"User ID"}]
* @change_log
* ["Since: 2.0"]
* @usage
* <?php add_filter( 'um_user_permissions_filter', 'function_name', 10, 2 ); ?>
* @example
* <?php
* add_filter( 'um_user_permissions_filter', 'my_user_permissions', 10, 2 );
* function my_user_permissions( $permissions, $user_id ) {
* // your code here
* return $permissions;
* }
* ?>
*/
$find_user = apply_filters( 'um_user_permissions_filter', $find_user, $user_id );
return $find_user;
/** This filter is documented in includes/core/class-roles-capabilities.php */
return apply_filters( 'um_user_permissions_filter', $find_user, $user_id );
}
}
return '';
@@ -1354,37 +1330,9 @@ if ( ! class_exists( 'um\core\User' ) ) {
$this->profile['roles'] = UM()->roles()->get_all_user_roles( $this->id );
$role_meta = UM()->roles()->role_data( $user_role );
/**
* UM hook
*
* @type filter
* @title um_user_permissions_filter
* @description Change User Permissions
* @input_vars
* [{"var":"$permissions","type":"array","desc":"User Permissions"},
* {"var":"$user_id","type":"int","desc":"User ID"}]
* @change_log
* ["Since: 2.0"]
* @usage
* <?php add_filter( 'um_user_permissions_filter', 'function_name', 10, 2 ); ?>
* @example
* <?php
* add_filter( 'um_user_permissions_filter', 'my_user_permissions', 10, 2 );
* function my_user_permissions( $permissions, $user_id ) {
* // your code here
* return $permissions;
* }
* ?>
*/
/** This filter is documented in includes/core/class-roles-capabilities.php */
$role_meta = apply_filters( 'um_user_permissions_filter', $role_meta, $this->id );
/*$role_meta = array_map( function( $key, $item ) {
if ( strpos( $key, '_um_' ) === 0 )
$key = str_replace( '_um_', '', $key );
return array( $key => $item );
}, array_keys( $role_meta ), $role_meta );*/
$this->profile = array_merge( $this->profile, (array) $role_meta );
$this->profile['super_admin'] = ( is_super_admin( $this->id ) ) ? 1 : 0;
@@ -1549,8 +1497,8 @@ if ( ! class_exists( 'um\core\User' ) ) {
/**
* Set last login for new registered users
*/
function set_last_login() {
update_user_meta( $this->id, '_um_last_login', current_time( 'timestamp' ) );
public function set_last_login() {
update_user_meta( $this->id, '_um_last_login', current_time( 'mysql', true ) );
}
/**
+7 -1
View File
@@ -513,6 +513,12 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) {
}
}
// Validate the Required condition for the Number field. Set the Minimum Number option to allow 0 value.
if ( isset( $array['type'] ) && 'number' === $array['type'] && ! empty( $array['required'] ) && '' === $submitted_data[ $key ] ) {
// translators: %s: title.
UM()->form()->add_error( $key, sprintf( __( '%s is required.', 'ultimate-member' ), $array['title'] ) );
}
if ( isset( $array['type'] ) && $array['type'] == 'checkbox' && isset( $array['required'] ) && $array['required'] == 1 && ! isset( $submitted_data[ $key ] ) ) {
// translators: %s: title.
UM()->form()->add_error( $key, sprintf( __( '%s is required.', 'ultimate-member' ), $array['title'] ) );
@@ -792,7 +798,7 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) {
break;
case 'youtube_video':
if ( ! UM()->validation()->is_url( $submitted_data[ $key ], 'youtube.com/watch?v=' ) && ! UM()->validation()->is_url( $submitted_data[ $key ], 'youtu.be' ) && ! UM()->validation()->is_url( $submitted_data[ $key ], 'youtube.com/shorts/' ) ) {
if ( ! UM()->validation()->is_url( $submitted_data[ $key ] ) || false === um_youtube_id_from_url( $submitted_data[ $key ] ) ) {
// translators: %s: label.
UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s URL', 'ultimate-member' ), $array['label'] ) );
}
+6 -6
View File
@@ -11,15 +11,15 @@ if ( ! defined( 'ABSPATH' ) ) {
function um_submit_form_errors_hook_login( $submitted_data ) {
$user_password = $submitted_data['user_password'];
if ( isset( $submitted_data['username'] ) && $submitted_data['username'] == '' ) {
if ( isset( $submitted_data['username'] ) && '' === $submitted_data['username'] ) {
UM()->form()->add_error( 'username', __( 'Please enter your username or email', 'ultimate-member' ) );
}
if ( isset( $submitted_data['user_login'] ) && $submitted_data['user_login'] == '' ) {
if ( isset( $submitted_data['user_login'] ) && '' === $submitted_data['user_login'] ) {
UM()->form()->add_error( 'user_login', __( 'Please enter your username', 'ultimate-member' ) );
}
if ( isset( $submitted_data['user_email'] ) && $submitted_data['user_email'] == '' ) {
if ( isset( $submitted_data['user_email'] ) && ( '' === $submitted_data['user_email'] || ! is_email( $submitted_data['user_email'] ) ) ) {
UM()->form()->add_error( 'user_email', __( 'Please enter your email', 'ultimate-member' ) );
}
@@ -28,7 +28,7 @@ function um_submit_form_errors_hook_login( $submitted_data ) {
$field = 'username';
if ( is_email( $submitted_data['username'] ) ) {
$data = get_user_by('email', $submitted_data['username'] );
$user_name = isset( $data->user_login ) ? $data->user_login : null;
$user_name = isset( $data->user_login ) ? $data->user_login : '';
} else {
$user_name = $submitted_data['username'];
}
@@ -36,7 +36,7 @@ function um_submit_form_errors_hook_login( $submitted_data ) {
$authenticate = $submitted_data['user_email'];
$field = 'user_email';
$data = get_user_by('email', $submitted_data['user_email'] );
$user_name = isset( $data->user_login ) ? $data->user_login : null;
$user_name = isset( $data->user_login ) ? $data->user_login : '';
} else {
$field = 'user_login';
$user_name = $submitted_data['user_login'];
@@ -160,7 +160,7 @@ add_action( 'um_submit_form_errors_hook_logincheck', 'um_submit_form_errors_hook
* @param $user_id
*/
function um_store_lastlogin_timestamp( $user_id ) {
update_user_meta( $user_id, '_um_last_login', current_time( 'timestamp' ) );
update_user_meta( $user_id, '_um_last_login', current_time( 'mysql', true ) );
// Flush user cache after updating last_login timestamp.
UM()->user()->remove_cache( $user_id );
}
+13 -15
View File
@@ -584,31 +584,28 @@ function um_restore_default_roles( $user_id, $args, $to_update ) {
}
add_action( 'um_after_user_updated', 'um_restore_default_roles', 10, 3 );
/**
* If editing another user
*
* @param $args
*/
function um_editing_user_id_input( $args ) {
if ( true === UM()->fields()->editing && 'profile' === UM()->fields()->set_mode && UM()->user()->target_id ) { ?>
if ( true === UM()->fields()->editing && 'profile' === UM()->fields()->set_mode && UM()->user()->target_id ) {
?>
<input type="hidden" name="user_id" id="user_id" value="<?php echo esc_attr( UM()->user()->target_id ); ?>" />
<input type="hidden" name="profile_nonce" id="profile_nonce" value="<?php echo esc_attr( UM()->form()->nonce ); ?>" />
<?php }
<?php
}
}
add_action( 'um_after_form_fields', 'um_editing_user_id_input' );
/**
* Remove Yoast from front end for the Profile page
*
* @see https://gist.github.com/amboutwe/1c847f9c706ff6f8c9eca76abea23fb6
* @since 2.1.6
*/
if ( !function_exists( 'um_profile_remove_wpseo' ) ) {
if ( ! function_exists( 'um_profile_remove_wpseo' ) ) {
/**
* Remove Yoast from front end for the Profile page
*
* @see https://gist.github.com/amboutwe/1c847f9c706ff6f8c9eca76abea23fb6
* @since 2.1.6
*/
function um_profile_remove_wpseo() {
if ( um_is_core_page( 'user' ) && um_get_requested_user() ) {
@@ -631,7 +628,6 @@ if ( !function_exists( 'um_profile_remove_wpseo' ) ) {
}
}
}
}
add_action( 'get_header', 'um_profile_remove_wpseo', 8 );
@@ -1411,6 +1407,8 @@ function um_pre_profile_shortcode( $args ) {
}
}
}
UM()->fields()->set_mode = 'profile';
}
add_action( 'um_pre_profile_shortcode', 'um_pre_profile_shortcode' );
+1 -7
View File
@@ -463,13 +463,7 @@ function um_submit_form_register( $args, $form_data ) {
}
$args['submitted'] = array_merge( $args['submitted'], $credentials );
// Set registration timestamp.
$timestamp = current_time( 'timestamp' ); // @todo Working on timestamps.
$args['submitted']['timestamp'] = $timestamp;
$args['timestamp'] = $timestamp;
$args = array_merge( $args, $credentials );
$args = array_merge( $args, $credentials );
//get user role from global or form's settings
$user_role = UM()->form()->assigned_role( UM()->form()->form_id );
+52 -19
View File
@@ -1,8 +1,8 @@
<?php if ( ! defined( 'ABSPATH' ) ) {
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Field is required?
*
@@ -13,15 +13,14 @@
*/
function um_edit_label_all_fields( $label, $data ) {
$asterisk = UM()->options()->get( 'form_asterisk' );
if ( $asterisk && isset( $data['required'] ) && $data['required'] == 1 ) {
$label = $label . '<span class="um-req" title="' . esc_attr__( 'Required', 'ultimate-member' ) . '">*</span>';
if ( $asterisk && ! empty( $data['required'] ) ) {
$label .= '<span class="um-req" title="' . esc_attr__( 'Required', 'ultimate-member' ) . '">*</span>';
}
return $label;
}
add_filter( 'um_edit_label_all_fields', 'um_edit_label_all_fields', 10, 2 );
/**
* Outputs a oEmbed field
*
@@ -94,10 +93,11 @@ function um_profile_field_filter_hook__youtube_video( $value, $data ) {
return '';
}
$value = ( strstr( $value, 'http' ) || strstr( $value, '://' ) ) ? um_youtube_id_from_url( $value ) : $value;
$value = '<div class="um-youtube">
<iframe width="600" height="450" src="https://www.youtube.com/embed/' . $value . '" frameborder="0" allowfullscreen></iframe>
</div>';
if ( false !== $value ) {
$value = '<div class="um-youtube">'
. '<iframe width="600" height="450" src="https://www.youtube.com/embed/' . $value . '" frameborder="0" allowfullscreen></iframe>'
. '</div>';
}
return $value;
}
add_filter( 'um_profile_field_filter_hook__youtube_video', 'um_profile_field_filter_hook__youtube_video', 99, 2 );
@@ -254,7 +254,6 @@ function um_profile_field_filter_hook__last_login( $value, $data ) {
if ( ! $value ) {
return '';
}
//$value = sprintf( __('Last login: %s','ultimate-member'), um_user_last_login( um_user('ID') ) );
$value = um_user_last_login( um_user( 'ID' ) );
return $value;
}
@@ -331,12 +330,11 @@ function um_profile_field_filter_hook__time( $value, $data ) {
}
add_filter( 'um_profile_field_filter_hook__time', 'um_profile_field_filter_hook__time', 99, 2 );
/**
* Date field
* Date field.
*
* @param $value
* @param $data
* @param string $value Date string.
* @param array $data Field data.
*
* @return string
*/
@@ -344,18 +342,19 @@ function um_profile_field_filter_hook__date( $value, $data ) {
if ( ! $value ) {
return '';
}
if ( isset( $data['pretty_format'] ) && $data['pretty_format'] == 1 ) {
if ( ! empty( $data['pretty_format'] ) ) {
$value = UM()->datetime()->get_age( $value );
} else {
$format = empty( $data['format_custom'] ) ? $data['format'] : $data['format_custom'];
$value = date_i18n( $format, strtotime( $value ) );
// Don't handle static dates via timezone because can be -1 day for minus UTC timezones (e.g. America).
$value = wp_date( $format, strtotime( $value ), new \DateTimeZone( 'UTC' ) );
}
return $value;
}
add_filter( 'um_profile_field_filter_hook__date', 'um_profile_field_filter_hook__date', 99, 2 );
/**
* File field
* @param $value
@@ -368,7 +367,7 @@ function um_profile_field_filter_hook__file( $value, $data ) {
return '';
}
$file_type = wp_check_filetype( $value );
$uri = UM()->files()->get_download_link( UM()->fields()->set_id, $data['metakey'], um_user( 'ID' ) );
$uri = UM()->files()->get_download_link( UM()->fields()->set_id, $data['metakey'], um_user( 'ID' ) );
$removed = false;
if ( ! file_exists( UM()->uploader()->get_upload_base_dir() . um_user( 'ID' ) . DIRECTORY_SEPARATOR . $value ) ) {
@@ -477,7 +476,7 @@ function um_profile_field_filter_hook__( $value, $data, $type = '' ) {
return $value;
}
if ( ( isset( $data['validate'] ) && '' !== $data['validate'] && 'spotify' !== $data['type'] && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && 'url' === $data['type'] && 'oembed' !== $data['type'] ) ) {
if ( ( isset( $data['validate'] ) && isset( $data['type'] ) && '' !== $data['validate'] && 'spotify' !== $data['type'] && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && 'url' === $data['type'] && 'oembed' !== $data['type'] ) ) {
$alt = ( isset( $data['url_text'] ) && ! empty( $data['url_text'] ) ) ? $data['url_text'] : $value;
$url_rel = ( isset( $data['url_rel'] ) && 'nofollow' === $data['url_rel'] ) ? 'rel="nofollow"' : '';
if ( ! strstr( $value, 'http' )
@@ -1003,3 +1002,37 @@ function um_edit_url_field_value( $value, $key ) {
return $value;
}
add_filter( 'um_edit_url_field_value', 'um_edit_url_field_value', 10, 2 );
/**
* Change field label from "Birth Date" to "Age" in the profile view.
*
* @param string $label Field Label.
* @param string $data Field data.
*
* @return string
*/
function um_view_label_birth_date( $label, $data ) {
if ( ! empty( $data['pretty_format'] ) ) {
$label = __( 'Age', 'ultimate-member' );
}
return $label;
}
add_filter( 'um_view_label_birth_date', 'um_view_label_birth_date', 10, 2 );
/**
* Change field label from "Birth Date" to "Age" in the member directory.
*
* @param string $label Field Label.
* @param string $key Field Key.
* @param string $data Field data.
*
* @return string
*/
function um_md_label_birth_date( $label, $key, $data ) {
if ( 'birth_date' === $key && ! empty( $data['pretty_format'] ) ) {
$label = __( 'Age', 'ultimate-member' );
}
return $label;
}
add_filter( 'um_change_field_label', 'um_md_label_birth_date', 10, 3 );
+27 -43
View File
@@ -1,5 +1,7 @@
<?php if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! is_admin() ) {
/**
@@ -39,7 +41,6 @@ if ( ! is_admin() ) {
}
add_filter( 'wp_nav_menu_objects', 'um_add_custom_message_to_menu', 9999, 2 );
/**
* Conditional menu items
*
@@ -70,62 +71,48 @@ if ( ! is_admin() ) {
$visible = true;
// hide any item that is the child of a hidden item
if ( isset( $item->menu_item_parent ) && in_array( $item->menu_item_parent, $hide_children_of ) ) {
$visible = false;
// Hide any item that is the child of a hidden item.
if ( isset( $item->menu_item_parent ) && in_array( $item->menu_item_parent, $hide_children_of, true ) ) {
$visible = false;
$hide_children_of[] = $item->ID; // for nested menus
}
if ( isset( $mode ) && $visible ) {
switch( $mode ) {
switch ( $mode ) {
case 2:
if ( is_user_logged_in() && ! empty( $roles ) ) {
if ( current_user_can( 'administrator' ) ) {
$visible = true;
if ( ! empty( $roles ) && is_user_logged_in() ) {
$current_user_roles = um_user( 'roles' );
if ( empty( $current_user_roles ) ) {
$visible = false;
} else {
$current_user_roles = um_user( 'roles' );
if ( empty( $current_user_roles ) ) {
$visible = false;
} else {
$visible = ( count( array_intersect( $current_user_roles, (array)$roles ) ) > 0 ) ? true : false;
}
$visible = ( count( array_intersect( $current_user_roles, (array) $roles ) ) > 0 ) ? true : false;
}
} else {
$visible = is_user_logged_in() ? true : false;
$visible = is_user_logged_in();
}
break;
case 1:
$visible = ! is_user_logged_in() ? true : false;
$visible = ! is_user_logged_in();
break;
}
}
/**
* UM hook
* Filters menu item visibility base on Ultimate Member visibility settings.
*
* @type filter
* @title um_nav_menu_roles_item_visibility
* @description Add filter to work with plugins that don't use traditional roles
* @input_vars
* [{"var":"$visible","type":"bool","desc":"Visible?"},
* {"var":"$item","type":"object","desc":"Menu Item"}]
* @change_log
* ["Since: 2.0"]
* @usage
* <?php add_filter( 'um_nav_menu_roles_item_visibility', 'function_name', 10, 2 ); ?>
* @example
* <?php
* add_filter( 'um_nav_menu_roles_item_visibility', 'my_nav_menu_roles_item_visibility', 10, 2 );
* @since 1.3.x
* @hook um_nav_menu_roles_item_visibility
*
* @param {bool} $visible Menu item visibility.
* @param {object} $item Menu item instance.
*
* @return {bool} Menu item visibility.
*
* @example <caption>Make the menu item visible for some custom reason.</caption>
* function my_nav_menu_roles_item_visibility( $visible, $item ) {
* // your code here
* $visible = true;
* return $visible;
* }
* ?>
* add_filter( 'um_nav_menu_roles_item_visibility', 'my_nav_menu_roles_item_visibility', 10, 2 );
*/
$visible = apply_filters( 'um_nav_menu_roles_item_visibility', $visible, $item );
@@ -134,9 +121,7 @@ if ( ! is_admin() ) {
$hide_children_of[] = $item->ID; // store ID of item
} else {
$filtered_items[] = $item;
continue;
}
}
um_reset_user();
@@ -145,7 +130,6 @@ if ( ! is_admin() ) {
}
add_filter( 'wp_nav_menu_objects', 'um_conditional_nav_menu', 9999, 2 );
/**
* Conditional menu items
*