Files
ultimatemember/includes/admin/core/class-admin-notices.php
T
2018-06-18 10:42:17 +03:00

648 lines
19 KiB
PHP

<?php
namespace um\admin\core;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {
/**
* Class Admin_Notices
* @package um\admin\core
*/
class Admin_Notices {
/**
* Notices list
*
* @var array
*/
var $list = array();
/**
* Admin_Notices constructor.
*/
function __construct() {
add_action( 'admin_init', array( &$this, 'create_languages_folder' ) );
add_action( 'admin_init', array( &$this, 'create_list' ), 10 );
add_action( 'admin_notices', array( &$this, 'render_notices' ), 1 );
//add_action( 'wp_ajax_um_dimiss_notice', array( &$this, 'dimiss_notice' ) );
}
function create_list() {
$this->old_extensions_notice();
$this->main_notices();
$this->localize_note();
$this->show_update_messages();
$this->check_wrong_install_folder();
$this->admin_notice_tracking();
$this->need_upgrade();
$this->check_wrong_licenses();
//$this->future_changed();
/**
* UM hook
*
* @type action
* @title um_admin_create_notices
* @description Add notices to wp-admin
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_create_notices', 'function_name', 10 );
* @example
* <?php
* add_action( 'um_admin_create_notices', 'my_admin_create_notices', 10 );
* function my_admin_create_notices() {
* // your code here
* }
* ?>
*/
do_action( 'um_admin_create_notices' );
}
/**
* @return array
*/
function get_admin_notices() {
return $this->list;
}
/**
* @param $admin_notices
*/
function set_admin_notices( $admin_notices ) {
$this->list = $admin_notices;
}
/**
* @param $a
* @param $b
*
* @return mixed
*/
function notice_priority_sort( $a, $b ) {
if ( $a['priority'] == $b['priority'] ) {
return 0;
}
return ( $a['priority'] < $b['priority'] ) ? -1 : 1;
}
/**
* Add notice to UM notices array
*
* @param string $key
* @param array $data
* @param int $priority
*/
function add_notice( $key, $data, $priority = 10 ) {
$admin_notices = $this->get_admin_notices();
if ( empty( $admin_notices[ $key ] ) ) {
$admin_notices[ $key ] = array_merge( $data, array( 'priority' => $priority ) );
$this->set_admin_notices( $admin_notices );
}
}
/**
* Remove notice from UM notices array
*
* @param string $key
*/
function remove_notice( $key ) {
$admin_notices = $this->get_admin_notices();
if ( ! empty( $admin_notices[ $key ] ) ) {
unset( $admin_notices[ $key ] );
$this->set_admin_notices( $admin_notices );
}
}
/**
* Render all admin notices
*/
function render_notices() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$admin_notices = $this->get_admin_notices();
$hidden = get_user_meta( get_current_user_id(), 'um_hidden_admin_notices', true );
$hidden = empty( $hidden ) ? array() : $hidden;
uasort( $admin_notices, array( &$this, 'notice_priority_sort' ) );
foreach ( $admin_notices as $key => $admin_notice ) {
if ( empty( $hidden ) || ! in_array( $key, $hidden ) ) {
$this->display_notice( $key );
}
}
/**
* UM hook
*
* @type action
* @title um_admin_after_main_notices
* @description Insert some content after main admin notices
* @change_log
* ["Since: 2.0"]
* @usage add_action( 'um_admin_after_main_notices', 'function_name', 10 );
* @example
* <?php
* add_action( 'um_admin_after_main_notices', 'my_admin_after_main_notices', 10 );
* function my_admin_after_main_notices() {
* // your code here
* }
* ?>
*/
do_action( 'um_admin_after_main_notices' );
}
/**
* Display single admin notice
*
* @param string $key
* @param bool $echo
*
* @return void|string
*/
function display_notice( $key, $echo = true ) {
$admin_notices = $this->get_admin_notices();
if ( empty( $admin_notices[ $key ] ) ) {
return;
}
$notice_data = $admin_notices[ $key ];
$class = ! empty( $notice_data['class'] ) ? $notice_data['class'] : 'updated';
$dimissible = ! empty( $admin_notices[ $key ]['dimissible'] );
ob_start(); ?>
<div class="<?php echo esc_attr( $class ) ?> um-admin-notice notice <?php echo $dimissible ? 'is-dismissible' : '' ?>" data-key="<?php echo $key ?>">
<?php echo ! empty( $notice_data['message'] ) ? $notice_data['message'] : '' ?>
</div>
<?php $notice = ob_get_clean();
if ( $echo ) {
echo $notice;
return;
} else {
return $notice;
}
}
/**
* To store plugin languages
*/
function create_languages_folder() {
$path = UM()->files()->upload_basedir;
$path = str_replace( '/uploads/ultimatemember', '', $path );
$path = $path . '/languages/plugins/';
$path = str_replace( '//', '/', $path );
if ( ! file_exists( $path ) ) {
$old = umask(0);
@mkdir( $path, 0777, true );
umask( $old );
}
}
/**
* Show notice for customers with old extension's versions
*/
function old_extensions_notice() {
$show = false;
$old_extensions = array(
'bbpress',
'followers',
'friends',
'instagram',
'mailchimp',
'messaging',
'mycred',
'notices',
'notifications',
'online',
'private-content',
'profile-completeness',
'recaptcha',
'reviews',
'social-activity',
'social-login',
'terms-conditions',
'user-tags',
'verified-users',
'woocommerce',
);
$slugs = array_map( function( $item ) {
return 'um-' . $item . '/um-' . $item . '.php';
}, $old_extensions );
$active_plugins = UM()->dependencies()->get_active_plugins();
foreach ( $slugs as $slug ) {
if ( in_array( $slug, $active_plugins ) ) {
$plugin_data = get_plugin_data( um_path . '..' . DIRECTORY_SEPARATOR . $slug );
if ( version_compare( '2.0', $plugin_data['Version'], '>' ) ) {
$show = true;
break;
}
}
}
if ( ! $show ) {
return;
}
$this->add_notice( 'old_extensions', array(
'class' => 'error',
'message' => '<p>' . sprintf( __( '<strong>%s %s</strong> requires 2.0 extensions. You have pre 2.0 extensions installed on your site. <br /> Please update %s extensions to latest versions. For more info see this <a href="%s" target="_blank">doc</a>.', 'ultimate-member' ), ultimatemember_plugin_name, ultimatemember_version, ultimatemember_plugin_name, 'http://docs.ultimatemember.com/article/266-updating-to-2-0-versions-of-extensions' ) . '</p>',
), 0 );
}
/**
* Show main notices
*/
function main_notices() {
$hide_exif_notice = get_option( 'um_hide_exif_notice' );
if ( ! extension_loaded( 'exif' ) && ! $hide_exif_notice ) {
$this->add_notice( 'exif_disabled', array(
'class' => 'updated',
'message' => '<p>' . sprintf(__( 'Exif is not enabled on your server. Mobile photo uploads will not be rotated correctly until you enable the exif extension. <a href="%s">Hide this notice</a>', 'ultimate-member' ), add_query_arg('um_adm_action', 'um_hide_exif_notice') ) . '</p>',
), 10 );
}
// Regarding page setup
$pages = UM()->config()->permalinks;
if ( $pages && is_array( $pages ) ) {
$err = false;
foreach ( $pages as $slug => $page_id ) {
$page = get_post( $page_id );
if ( ! isset( $page->ID ) && in_array( $slug, array( 'user', 'account', 'members', 'register', 'login', 'logout', 'password-reset' ) ) ) {
$err = true;
}
}
if ( $err ) {
$this->add_notice( 'wrong_pages', array(
'class' => 'updated',
'message' => '<p>' . __( 'One or more of your Ultimate Member pages are not correctly setup. Please visit <strong>Ultimate Member > Settings</strong> to re-assign your missing pages.', 'ultimate-member' ) . '</p>',
), 20 );
}
if ( isset( $pages['user'] ) ) {
$test = get_post( $pages['user'] );
if ( isset( $test->post_parent ) && $test->post_parent > 0 ) {
$this->add_notice( 'wrong_user_page', array(
'class' => 'updated',
'message' => '<p>' . __( 'Ultimate Member Setup Error: User page can not be a child page.', 'ultimate-member' ) . '</p>',
), 25 );
}
}
if ( isset( $pages['account'] ) ) {
$test = get_post( $pages['account'] );
if ( isset( $test->post_parent ) && $test->post_parent > 0 ) {
$this->add_notice( 'wrong_account_page', array(
'class' => 'updated',
'message' => '<p>' . __( 'Ultimate Member Setup Error: Account page can not be a child page.', 'ultimate-member' ) . '</p>',
), 30 );
}
}
}
}
/**
* Localization notice
*/
function localize_note() {
$locale = get_option( 'WPLANG' );
if ( ! $locale || strstr( $locale, 'en_' ) ) {
return;
}
if ( file_exists( WP_LANG_DIR . '/plugins/ultimatemember-' . $locale . '.mo' ) ) {
return;
}
$hide_locale_notice = get_option( 'um_hide_locale_notice' );
if ( $hide_locale_notice ) {
return;
}
if ( isset( UM()->available_languages[ $locale ] ) ) {
$download_uri = add_query_arg( 'um_adm_action', 'um_language_downloader' );
$this->add_notice( 'locale', array(
'class' => 'updated',
'message' => '<p>' . sprintf( __( 'Your site language is <strong>%1$s</strong>. Good news! Ultimate Member is already available in <strong>%2$s language</strong>. <a href="%3$s">Download the translation</a> files and start using the plugin in your language now. <a href="%4$s">Hide this notice</a>','ultimate-member'), $locale, UM()->available_languages[ $locale ], $download_uri, add_query_arg( 'um_adm_action', 'um_hide_locale_notice' ) ) . '</p>',
), 40 );
} else {
$this->add_notice( 'locale', array(
'class' => 'updated',
'message' => '<p>' . sprintf( __( 'Ultimate Member has not yet been translated to your language: <strong>%1$s</strong>. If you have translated the plugin you need put these files <code>ultimatemember-%1$s.po and ultimatemember-%1$s.mo</code> in <strong>/wp-content/languages/plugins/</strong> for the plugin to be translated in your language. <a href="%2$s">Hide this notice</a>', 'ultimate-member' ), $locale, add_query_arg( 'um_adm_action', 'um_hide_locale_notice' ) ) . '</p>',
), 40 );
}
}
/**
* Updating users
*/
function show_update_messages() {
if ( ! isset( $_REQUEST['update'] ) ) {
return;
}
$update = $_REQUEST['update'];
switch( $update ) {
case 'confirm_delete':
$confirm_uri = admin_url( 'users.php?' . http_build_query( array(
'um_adm_action' => 'delete_users',
'user' => array_map( 'intval', (array) $_REQUEST['user'] ),
'confirm' => 1
) ) );
$users = '';
if ( isset( $_REQUEST['user'] ) ){
foreach ( $_REQUEST['user'] as $user_id ) {
$user = get_userdata( $user_id );
$users .= '#' . $user_id . ': ' . $user->user_login . '<br />';
}
}
$ignore = admin_url('users.php');
$messages[0]['err_content'] = sprintf( __( 'Are you sure you want to delete the selected user(s)? The following users will be deleted: <p>%s</p> <strong>This cannot be undone!</strong>','ultimate-member'), $users);
$messages[0]['err_content'] .= '<p><a href="'. esc_html( $confirm_uri ) .'" class="button-primary">' . __( 'Remove', 'ultimate-member' ) . '</a>&nbsp;&nbsp;<a href="'.$ignore.'" class="button">' . __('Undo','ultimate-member') . '</a></p>';
break;
case 'language_updated':
$messages[0]['content'] = __( 'Your translation files have been updated successfully.', 'ultimate-member' );
break;
case 'purged_temp':
$messages[0]['content'] = __( 'Your temp uploads directory is now clean.', 'ultimate-member' );
break;
case 'cleared_cache':
$messages[0]['content'] = __( 'Your user cache is now removed.', 'ultimate-member' );
break;
case 'got_updates':
$messages[0]['content'] = __( 'You got the latest upgrades.', 'ultimate-member' );
break;
case 'often_updates':
$messages[0]['err_content'] = __( 'Try again later. You can run this action once daily.', 'ultimate-member' );
break;
case 'form_duplicated':
$messages[0]['content'] = __( 'The form has been duplicated successfully.', 'ultimate-member' );
break;
case 'user_updated':
$messages[0]['content'] = __( 'User has been updated.', 'ultimate-member' );
break;
case 'users_updated':
$messages[0]['content'] = __( 'Users have been updated.', 'ultimate-member' );
break;
case 'users_role_updated':
$messages[0]['content'] = __( 'Changed roles.', 'ultimate-member' );
break;
case 'err_users_updated':
$messages[0]['err_content'] = __( 'Super administrators cannot be modified.', 'ultimate-member' );
$messages[1]['content'] = __( 'Other users have been updated.', 'ultimate-member' );
}
if ( ! empty( $messages ) ) {
foreach ( $messages as $message ) {
if ( isset( $message['err_content'] ) ) {
$this->add_notice( 'actions', array(
'class' => 'error',
'message' => '<p>' . $message['err_content'] . '</p>',
), 50 );
} else {
$this->add_notice( 'actions', array(
'class' => 'updated',
'message' => '<p>' . $message['content'] . '</p>',
), 50 );
}
}
}
}
/**
* Check if plugin is installed with correct folder
*/
function check_wrong_install_folder() {
$invalid_folder = false;
$slug_array = explode( '/', um_plugin );
if ( $slug_array[0] != 'ultimate-member' ) {
$invalid_folder = true;
}
if ( $invalid_folder ) {
$this->add_notice( 'invalid_dir', array(
'class' => 'error',
'message' => '<p>' . sprintf( __( 'You have installed <strong>%s</strong> with wrong folder name. Correct folder name is <strong>"ultimate-member"</strong>.', 'ultimate-member' ), ultimatemember_plugin_name ) . '</p>',
), 1 );
}
}
/**
* Show admin notices
*/
public function admin_notice_tracking() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$hide_notice = get_option( 'um_tracking_notice' );
if ( $hide_notice ) {
return;
}
$optin_url = esc_url( add_query_arg( 'um_adm_action', 'opt_into_tracking' ) );
$optout_url = esc_url( add_query_arg( 'um_adm_action', 'opt_out_of_tracking' ) );
ob_start(); ?>
<p>
<?php printf( __( 'Thanks for installing <strong>%s</strong>! We hope you like the plugin. To fund full-time development and support of the plugin we also sell extensions for %s via our website. If you subscribe to our mailing list we will immediately email you a 20%% discount code for our <a href="%s" target="_blank">extensions bundle</a> (you\'ll need to confirm your subscription via email).', 'ultimate-member' ), ultimatemember_plugin_name, ultimatemember_plugin_name, 'https://ultimatemember.com/core-extensions-bundle/' ); ?>
</p>
<p>
<a href="<?php echo esc_url( $optin_url ) ?>" class="button button-primary"><?php _e( 'Subscribe to mailing list', 'ultimate-member' ) ?></a>
&nbsp;
<a href="<?php echo esc_url( $optout_url ) ?>" class="button-secondary"><?php _e( 'No thanks', 'ultimate-member' ) ?></a>
</p>
<p class="description" style="font-size: 11px;">
<?php printf( __( 'By clicking the subscribe button you are agreeing to join our mailing list (managed via MailChimp). See our <a href="%s" target="_blank">privacy policy</a>', 'ultimate-member' ), 'https://ultimatemember.com/support/policy/' ); ?>
</p>
<?php $message = ob_get_clean();
$this->add_notice( 'tracking_notice', array(
'class' => 'updated',
'message' => $message,
), 2 );
}
function check_wrong_licenses() {
$invalid_license = 0;
$arr_inactive_license_keys = array();
if ( empty( UM()->admin_settings()->settings_structure['licenses']['fields'] ) ) {
return;
}
foreach ( UM()->admin_settings()->settings_structure['licenses']['fields'] as $field_data ) {
$license = get_option( "{$field_data['id']}_edd_answer" );
if ( ( is_object( $license ) && 'valid' == $license->license ) || 'valid' == $license )
continue;
if ( ( is_object( $license ) && 'inactive' == $license->license ) || 'inactive' == $license ) {
$arr_inactive_license_keys[ ] = $license->item_name;
}
$invalid_license++;
}
if ( ! empty( $arr_inactive_license_keys ) ) {
$this->add_notice( 'license_key', array(
'class' => 'error',
'message' => '<p>' . sprintf( __( 'There are %d inactive %s license keys for this site. This site is not authorized to get plugin updates. You can active this site on <a href="%s">www.UltimateMember.com</a>.', 'ultimate-member' ), count( $arr_inactive_license_keys ) , ultimatemember_plugin_name, 'https://ultimatemember.com' ) . '</p>',
), 3 );
}
if ( $invalid_license ) {
$this->add_notice( 'license_key', array(
'class' => 'error',
'message' => '<p>' . sprintf( __( 'You have %d invalid or expired license keys for %s. Please go to the <a href="%s">Licenses page</a> to correct this issue.', 'ultimate-member' ), $invalid_license, ultimatemember_plugin_name, add_query_arg( array('page'=>'um_options', 'tab' => 'licenses'), admin_url( 'admin.php' ) ) ) . '</p>',
), 3 );
}
}
function need_upgrade() {
if ( ! empty( UM()->admin_upgrade()->necessary_packages ) ) {
$url = add_query_arg( array( 'page' => 'um_upgrade' ), admin_url( 'admin.php' ) );
ob_start(); ?>
<p>
<?php printf( __( '<strong>%s version %s</strong> needs to be updated to work correctly.<br />It is necessary to update the structure of the database and options that are associated with <strong>%s %s</strong>.<br />Please visit <a href="%s">"Upgrade"</a> page and run the upgrade process.', 'ultimate-member' ), ultimatemember_plugin_name, ultimatemember_version, ultimatemember_plugin_name, ultimatemember_version, $url ); ?>
</p>
<p>
<a href="<?php echo esc_url( $url ) ?>" class="button button-primary"><?php _e( 'Upgrade Now', 'ultimate-member' ) ?></a>
&nbsp;
</p>
<?php $message = ob_get_clean();
$this->add_notice( 'upgrade', array(
'class' => 'error',
'message' => $message,
), 4 );
} else {
if ( isset( $_GET['msg'] ) && 'updated' == $_GET['msg'] ) {
$this->add_notice( 'upgrade', array(
'class' => 'updated',
'message' => '<p>' . sprintf( __( '<strong>%s %s</strong> Successfully Upgraded', 'ultimate-member' ), ultimatemember_plugin_name, ultimatemember_version ) . '</p>',
), 4 );
}
}
}
/**
* Check Future Changes notice
*/
function future_changed() {
ob_start(); ?>
<p>
<?php printf( __( '<strong>%s</strong> future plans! Detailed future list is <a href="%s" target="_blank">here</a>', 'ultimate-member' ), ultimatemember_plugin_name, '#' ); ?>
</p>
<?php $message = ob_get_clean();
$this->add_notice( 'future_changes', array(
'class' => 'updated',
'message' => $message,
//'dimissible' => true,
), 2 );
}
function dimiss_notice() {
if ( empty( $_POST['key'] ) ) {
wp_send_json_error( __( 'Wrong Data', 'ultimate-member' ) );
}
$hidden_notices = get_user_meta( get_current_user_id(), 'um_hidden_admin_notices', true );
$hidden_notices = empty( $hidden_notices ) ? array() : $hidden_notices;
$hidden_notices[] = $_POST['key'];
update_user_meta( get_current_user_id(), 'um_hidden_admin_notices', $hidden_notices );
wp_send_json_success();
}
}
}