laipower/wp-content/plugins/menu-icons/includes/settings.php

794 lines
20 KiB
PHP
Raw Normal View History

2020-04-07 13:03:04 +00:00
<?php
/**
* Settings
*
* @package Menu_Icons
* @author Dzikri Aziz <kvcrvt@gmail.com>
*/
/**
* Menu Icons Settings module
*/
final class Menu_Icons_Settings {
const UPDATE_KEY = 'menu-icons-settings-update';
const RESET_KEY = 'menu-icons-settings-reset';
const TRANSIENT_KEY = 'menu_icons_message';
/**
* Default setting values
*
* @since 0.3.0
* @var array
* @access protected
*/
protected static $defaults = array(
'global' => array(
'icon_types' => array( 'dashicons' ),
),
);
/**
* Setting values
*
* @since 0.3.0
* @var array
* @access protected
*/
protected static $settings = array();
/**
* Script dependencies
*
* @since 0.9.0
* @access protected
* @var array
*/
protected static $script_deps = array( 'jquery' );
/**
* Settings init
*
* @since 0.3.0
*/
public static function init() {
// Include Menu Icons for Block Editor
if ( class_exists( '\ThemeIsle\GutenbergMenuIcons' ) ) {
\ThemeIsle\GutenbergMenuIcons::instance();
add_action( 'enqueue_block_assets', array( __CLASS__, '_enqueue_font_awesome' ) );
}
2020-04-07 13:03:04 +00:00
/**
* Allow themes/plugins to override the default settings
*
* @since 0.9.0
*
* @param array $default_settings Default settings.
*/
self::$defaults = apply_filters( 'menu_icons_settings_defaults', self::$defaults );
self::$settings = get_option( 'menu-icons', self::$defaults );
foreach ( self::$settings as $key => &$value ) {
if ( 'global' === $key ) {
// Remove unregistered icon types.
$value['icon_types'] = array_values(
array_intersect(
array_keys( Menu_Icons::get( 'types' ) ),
array_filter( (array) $value['icon_types'] )
)
);
} else {
// Backward-compatibility.
if ( isset( $value['width'] ) && ! isset( $value['svg_width'] ) ) {
$value['svg_width'] = $value['width'];
}
unset( $value['width'] );
}
}
unset( $value );
/**
* Allow themes/plugins to override the settings
*
* @since 0.9.0
*
* @param array $settings Menu Icons settings.
*/
self::$settings = apply_filters( 'menu_icons_settings', self::$settings );
if ( self::is_menu_icons_disabled_for_menu() ) {
return;
}
if ( ! empty( self::$settings['global']['icon_types'] ) ) {
require_once Menu_Icons::get( 'dir' ) . 'includes/picker.php';
Menu_Icons_Picker::init();
self::$script_deps[] = 'icon-picker';
}
add_action( 'load-nav-menus.php', array( __CLASS__, '_load_nav_menus' ), 1 );
add_action( 'wp_ajax_menu_icons_update_settings', array( __CLASS__, '_ajax_menu_icons_update_settings' ) );
}
/**
* Check if menu icons is disabled for a menu
*
* @since 0.8.0
*
* @param int $menu_id Menu ID. Defaults to current menu being edited.
*
* @return bool
*/
public static function is_menu_icons_disabled_for_menu( $menu_id = 0 ) {
if ( empty( $menu_id ) ) {
$menu_id = self::get_current_menu_id();
}
// When we're creating a new menu or the recently edited menu
// could not be found.
if ( empty( $menu_id ) ) {
return true;
}
$menu_settings = self::get_menu_settings( $menu_id );
$is_disabled = ! empty( $menu_settings['disabled'] );
return $is_disabled;
}
/**
* Get ID of menu being edited
*
* @since 0.7.0
* @since 0.8.0 Get the recently edited menu from user option.
*
* @return int
*/
public static function get_current_menu_id() {
global $nav_menu_selected_id;
if ( ! empty( $nav_menu_selected_id ) ) {
return $nav_menu_selected_id;
}
if ( is_admin() && isset( $_REQUEST['menu'] ) ) {
$menu_id = absint( $_REQUEST['menu'] );
} else {
$menu_id = absint( get_user_option( 'nav_menu_recently_edited' ) );
}
return $menu_id;
}
/**
* Get menu settings
*
* @since 0.3.0
*
* @param int $menu_id
*
* @return array
*/
public static function get_menu_settings( $menu_id ) {
$menu_settings = self::get( sprintf( 'menu_%d', $menu_id ) );
$menu_settings = apply_filters( 'menu_icons_menu_settings', $menu_settings, $menu_id );
if ( ! is_array( $menu_settings ) ) {
$menu_settings = array();
}
return $menu_settings;
}
/**
* Get setting value
*
* @since 0.3.0
* @return mixed
*/
public static function get() {
$args = func_get_args();
return kucrut_get_array_value_deep( self::$settings, $args );
}
/**
* Prepare wp-admin/nav-menus.php page
*
* @since 0.3.0
* @wp_hook action load-nav-menus.php
*/
public static function _load_nav_menus() {
add_action( 'admin_enqueue_scripts', array( __CLASS__, '_enqueue_assets' ), 99 );
/**
* Allow settings meta box to be disabled.
*
* @since 0.4.0
*
* @param bool $disabled Defaults to FALSE.
*/
$settings_disabled = apply_filters( 'menu_icons_disable_settings', false );
if ( true === $settings_disabled ) {
return;
}
self::_maybe_update_settings();
self::_add_settings_meta_box();
add_action( 'admin_notices', array( __CLASS__, '_admin_notices' ) );
}
/**
* Update settings
*
* @since 0.3.0
*/
public static function _maybe_update_settings() {
if ( ! empty( $_POST['menu-icons']['settings'] ) ) {
check_admin_referer( self::UPDATE_KEY, self::UPDATE_KEY );
$redirect_url = self::_update_settings( $_POST['menu-icons']['settings'] ); // Input var okay.
wp_redirect( $redirect_url );
} elseif ( ! empty( $_REQUEST[ self::RESET_KEY ] ) ) {
check_admin_referer( self::RESET_KEY, self::RESET_KEY );
wp_redirect( self::_reset_settings() );
}
}
/**
* Update settings
*
* @since 0.7.0
* @access protected
*
* @param array $values Settings values.
*
* @return string Redirect URL.
*/
protected static function _update_settings( $values ) {
update_option(
'menu-icons',
wp_parse_args(
kucrut_validate( $values ),
self::$settings
)
);
set_transient( self::TRANSIENT_KEY, 'updated', 30 );
$redirect_url = remove_query_arg(
array( 'menu-icons-reset' ),
wp_get_referer()
);
return $redirect_url;
}
/**
* Reset settings
*
* @since 0.7.0
* @access protected
* @return string Redirect URL.
*/
protected static function _reset_settings() {
delete_option( 'menu-icons' );
set_transient( self::TRANSIENT_KEY, 'reset', 30 );
$redirect_url = remove_query_arg(
array( self::RESET_KEY, 'menu-icons-updated' ),
wp_get_referer()
);
return $redirect_url;
}
/**
* Settings meta box
*
* @since 0.3.0
* @access private
*/
private static function _add_settings_meta_box() {
add_meta_box(
'menu-icons-settings',
__( 'Menu Icons Settings', 'menu-icons' ),
array( __CLASS__, '_meta_box' ),
'nav-menus',
'side',
'low',
array()
);
}
/**
* Update settings via ajax
*
* @since 0.7.0
* @wp_hook action wp_ajax_menu_icons_update_settings
*/
public static function _ajax_menu_icons_update_settings() {
check_ajax_referer( self::UPDATE_KEY, self::UPDATE_KEY );
if ( empty( $_POST['menu-icons']['settings'] ) ) {
wp_send_json_error();
}
$redirect_url = self::_update_settings( $_POST['menu-icons']['settings'] ); // Input var okay.
wp_send_json_success( array( 'redirectUrl' => $redirect_url ) );
}
/**
* Print admin notices
*
* @since 0.3.0
* @wp_hook action admin_notices
*/
public static function _admin_notices() {
$messages = array(
'updated' => __( '<strong>Menu Icons Settings</strong> have been successfully updated.', 'menu-icons' ),
'reset' => __( '<strong>Menu Icons Settings</strong> have been successfully reset.', 'menu-icons' ),
);
$message_type = get_transient( self::TRANSIENT_KEY );
if ( ! empty( $message_type ) && ! empty( $messages[ $message_type ] ) ) {
printf(
'<div class="updated notice is-dismissible"><p>%s</p></div>',
wp_kses( $messages[ $message_type ], array( 'strong' => true ) )
);
}
delete_transient( self::TRANSIENT_KEY );
}
/**
* Settings meta box
*
* @since 0.3.0
*/
public static function _meta_box() {
?>
<div class="taxonomydiv">
<ul id="menu-icons-settings-tabs" class="taxonomy-tabs add-menu-item-tabs hide-if-no-js">
<?php foreach ( self::get_fields() as $section ) : ?>
<?php
printf(
'<li><a href="#" title="%s" class="mi-settings-nav-tab" data-type="menu-icons-settings-%s">%s</a></li>',
esc_attr( $section['description'] ),
esc_attr( $section['id'] ),
esc_html( $section['title'] )
);
?>
<?php endforeach; ?>
</ul>
<?php foreach ( self::_get_fields() as $section_index => $section ) : ?>
<div id="menu-icons-settings-<?php echo esc_attr( $section['id'] ) ?>"
class="tabs-panel _<?php echo esc_attr( $section_index ) ?>">
<h4 class="hide-if-js"><?php echo esc_html( $section['title'] ) ?></h4>
<?php foreach ( $section['fields'] as $field ) : ?>
<div class="_field">
<?php
printf(
'<label for="%s" class="_main">%s</label>',
esc_attr( $field->id ),
esc_html( $field->label )
);
// Help text.
if ( $field->help_text ) :
printf( '<i>%s</i>', esc_html( $field->help_text ) );
endif;
$field->render();
2020-04-07 13:03:04 +00:00
?>
</div>
<?php endforeach; ?>
</div>
<?php endforeach; ?>
</div>
<p class="submitbox button-controls">
<?php wp_nonce_field( self::UPDATE_KEY, self::UPDATE_KEY ) ?>
<span class="list-controls">
<?php
printf(
'<a href="%s" title="%s" class="select-all submitdelete">%s</a>',
esc_url(
wp_nonce_url(
admin_url( '/nav-menus.php' ),
self::RESET_KEY,
self::RESET_KEY
)
),
esc_attr__( 'Discard all changes and reset to default state', 'menu-icons' ),
esc_html__( 'Reset', 'menu-icons' )
);
?>
</span>
<span class="add-to-menu">
<span class="spinner"></span>
<?php
submit_button(
__( 'Save Settings', 'menu-icons' ),
'secondary',
'menu-icons-settings-save',
false
);
?>
</span>
</p>
<?php
}
/**
* Get settings sections
*
* @since 0.3.0
* @uses apply_filters() Calls 'menu_icons_settings_sections'.
* @return array
*/
public static function get_fields() {
$menu_id = self::get_current_menu_id();
$icon_types = wp_list_pluck( Menu_Icons::get( 'types' ), 'name' );
asort( $icon_types );
$sections = array(
'global' => array(
'id' => 'global',
'title' => __( 'Global', 'menu-icons' ),
'description' => __( 'Global settings', 'menu-icons' ),
'fields' => array(
array(
'id' => 'icon_types',
'type' => 'checkbox',
'label' => __( 'Icon Types', 'menu-icons' ),
'choices' => $icon_types,
'value' => self::get( 'global', 'icon_types' ),
),
array(
'id' => 'fa5_extra_icons',
'type' => 'textarea',
'label' => __( 'FA Custom Icon Classes', 'menu-icons' ),
'value' => self::get( 'global', 'fa5_extra_icons' ),
'help_text' => '( comma separated icons )',
),
2020-04-07 13:03:04 +00:00
),
'args' => array(),
),
);
if ( ! empty( $menu_id ) ) {
$menu_term = get_term( $menu_id, 'nav_menu' );
$menu_key = sprintf( 'menu_%d', $menu_id );
$menu_settings = self::get_menu_settings( $menu_id );
$sections['menu'] = array(
'id' => $menu_key,
'title' => __( 'Current Menu', 'menu-icons' ),
'description' => sprintf(
__( '"%s" menu settings', 'menu-icons' ),
apply_filters( 'single_term_title', $menu_term->name )
),
'fields' => self::get_settings_fields( $menu_settings ),
'args' => array( 'inline_description' => true ),
);
}
return apply_filters( 'menu_icons_settings_sections', $sections, $menu_id );
}
/**
* Get settings fields
*
* @since 0.4.0
*
* @param array $values Values to be applied to each field.
*
* @uses apply_filters() Calls 'menu_icons_settings_fields'.
* @return array
*/
public static function get_settings_fields( array $values = array() ) {
$fields = array(
'hide_label' => array(
'id' => 'hide_label',
'type' => 'select',
'label' => __( 'Hide Label', 'menu-icons' ),
'default' => '',
'choices' => array(
array(
'value' => '',
'label' => __( 'No', 'menu-icons' ),
),
array(
'value' => '1',
'label' => __( 'Yes', 'menu-icons' ),
),
),
),
'position' => array(
'id' => 'position',
'type' => 'select',
'label' => __( 'Position', 'menu-icons' ),
'default' => 'before',
'choices' => array(
array(
'value' => 'before',
'label' => __( 'Before', 'menu-icons' ),
),
array(
'value' => 'after',
'label' => __( 'After', 'menu-icons' ),
),
),
),
'vertical_align' => array(
'id' => 'vertical_align',
'type' => 'select',
'label' => __( 'Vertical Align', 'menu-icons' ),
'default' => 'middle',
'choices' => array(
array(
'value' => 'super',
'label' => __( 'Super', 'menu-icons' ),
),
array(
'value' => 'top',
'label' => __( 'Top', 'menu-icons' ),
),
array(
'value' => 'text-top',
'label' => __( 'Text Top', 'menu-icons' ),
),
array(
'value' => 'middle',
'label' => __( 'Middle', 'menu-icons' ),
),
array(
'value' => 'baseline',
'label' => __( 'Baseline', 'menu-icons' ),
),
array(
'value' => 'text-bottom',
'label' => __( 'Text Bottom', 'menu-icons' ),
),
array(
'value' => 'bottom',
'label' => __( 'Bottom', 'menu-icons' ),
),
array(
'value' => 'sub',
'label' => __( 'Sub', 'menu-icons' ),
),
),
),
'font_size' => array(
'id' => 'font_size',
'type' => 'number',
'label' => __( 'Font Size', 'menu-icons' ),
'default' => '1.2',
'description' => 'em',
'attributes' => array(
'min' => '0.1',
'step' => '0.1',
),
),
'svg_width' => array(
'id' => 'svg_width',
'type' => 'number',
'label' => __( 'SVG Width', 'menu-icons' ),
'default' => '1',
'description' => 'em',
'attributes' => array(
'min' => '.5',
'step' => '.1',
),
),
'image_size' => array(
'id' => 'image_size',
'type' => 'select',
'label' => __( 'Image Size', 'menu-icons' ),
'default' => 'thumbnail',
'choices' => kucrut_get_image_sizes(),
),
);
$fields = apply_filters( 'menu_icons_settings_fields', $fields );
foreach ( $fields as &$field ) {
if ( isset( $values[ $field['id'] ] ) ) {
$field['value'] = $values[ $field['id'] ];
}
if ( ! isset( $field['value'] ) && isset( $field['default'] ) ) {
$field['value'] = $field['default'];
}
}
unset( $field );
return $fields;
}
/**
* Get processed settings fields
*
* @since 0.3.0
* @access private
* @return array
*/
private static function _get_fields() {
if ( ! class_exists( 'Kucrut_Form_Field' ) ) {
require_once Menu_Icons::get( 'dir' ) . 'includes/library/form-fields.php';
}
$keys = array( 'menu-icons', 'settings' );
$sections = self::get_fields();
foreach ( $sections as &$section ) {
$_keys = array_merge( $keys, array( $section['id'] ) );
$_args = array_merge( array( 'keys' => $_keys ), $section['args'] );
foreach ( $section['fields'] as &$field ) {
$field = Kucrut_Form_Field::create( $field, $_args );
}
unset( $field );
}
unset( $section );
return $sections;
}
/**
* Enqueue scripts & styles for Block Icons
*
* @since 0.3.0
* @wp_hook action enqueue_block_assets
*/
public static function _enqueue_font_awesome() {
$url = Menu_Icons::get( 'url' );
wp_register_style(
'font-awesome-5',
"{$url}css/fontawesome/css/all.min.css"
);
}
2020-04-07 13:03:04 +00:00
/**
* Enqueue scripts & styles for Appearance > Menus page
*
* @since 0.3.0
* @wp_hook action admin_enqueue_scripts
*/
public static function _enqueue_assets() {
$url = Menu_Icons::get( 'url' );
$suffix = kucrut_get_script_suffix();
if ( defined( 'MENU_ICONS_SCRIPT_DEBUG' ) && MENU_ICONS_SCRIPT_DEBUG ) {
$script_url = '//localhost:8081/';
} else {
$script_url = $url;
}
wp_enqueue_style(
'menu-icons',
"{$url}css/admin{$suffix}.css",
false,
Menu_Icons::VERSION
);
wp_enqueue_script(
'menu-icons',
"{$script_url}js/admin{$suffix}.js",
self::$script_deps,
Menu_Icons::VERSION,
true
);
$customizer_url = add_query_arg(
array(
'autofocus[section]' => 'custom_css',
'return' => admin_url( 'nav-menus.php' ),
),
admin_url( 'customize.php' )
);
/**
* Allow plugins/themes to filter the settings' JS data
*
* @since 0.9.0
*
* @param array $js_data JS Data.
*/
$menu_current_theme = '';
$theme = wp_get_theme();
if ( ! empty( $theme ) ) {
if ( is_child_theme() && $theme->parent() ) {
2020-04-07 13:03:04 +00:00
$menu_current_theme = $theme->parent()->get( 'Name' );
} else {
$menu_current_theme = $theme->get( 'Name' );
}
}
$upsell_notices = array();
2020-04-07 13:03:04 +00:00
$box_data = '<div id="menu-icons-sidebar">';
if ( ( $menu_current_theme != 'Neve' ) ) {
$upsell_notices['neve'] = array(
'content' => wp_sprintf( '<div class="menu-icon-notice-popup-img"><img src="%s"/></div><div class="menu-icon-notice-popup"><h4>%s</h4>%s', plugin_dir_url( __FILE__ ) . '../images/neve-theme.jpg', __( 'Check-out our latest lightweight FREE theme - Neve', 'menu-icons' ), __( 'Neves mobile-first approach, compatibility with AMP and popular page-builders makes website building accessible for everyone.', 'menu-icons' ) ),
'url' => add_query_arg(
array(
'theme' => 'neve',
),
admin_url( 'theme-install.php' )
),
'btn_text' => __( 'Preview Neve', 'menu-icons' ),
);
}
2020-04-07 13:03:04 +00:00
if ( ! in_array( 'otter-blocks/otter-blocks.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ), true ) ) {
$upsell_notices['otter-blocks'] = array(
'content' => wp_sprintf( '<div class="menu-icon-notice-popup-img"><img src="%s"/></div><div class="menu-icon-notice-popup"><h4>%s</h4>%s', plugin_dir_url( __FILE__ ) . '../images/otter-block.png', __( 'Build professional pages with Otter Blocks', 'menu-icons' ), __( 'Otter is a dynamic collection of page building blocks and templates, covering all the elements you need to build your WordPress site.', 'menu-icons' ) ),
'url' => add_query_arg(
array(
'tab' => 'plugin-information',
'plugin' => 'otter-blocks',
'TB_iframe' => true,
'width' => 772,
'height' => 551,
),
admin_url( 'plugin-install.php' )
),
'btn_text' => __( 'Preview Otter Blocks', 'menu-icons' ),
2020-04-07 13:03:04 +00:00
);
}
if ( ! empty( $upsell_notices ) ) {
$rand_key = array_rand( $upsell_notices );
$menu_upgrade_hestia_box_text = $upsell_notices[ $rand_key ]['content'];
$box_data .= '<div class="nv-upgrade-notice postbox new-card">';
$box_data .= wp_kses_post( wpautop( $menu_upgrade_hestia_box_text ) );
$box_data .= '<a class="button" href="' . $upsell_notices[ $rand_key ]['url'] . '" target="_blank">' . $upsell_notices[ $rand_key ]['btn_text'] . '</a>';
$box_data .= '</div></div>';
2020-04-07 13:03:04 +00:00
}
$js_data = apply_filters(
'menu_icons_settings_js_data',
array(
'text' => array(
'title' => __( 'Select Icon', 'menu-icons' ),
'select' => __( 'Select', 'menu-icons' ),
'remove' => __( 'Remove', 'menu-icons' ),
'change' => __( 'Change', 'menu-icons' ),
'all' => __( 'All', 'menu-icons' ),
'preview' => __( 'Preview', 'menu-icons' ),
'settingsInfo' => sprintf(
'<div> %1$s <p>' . esc_html__( 'Please note that the actual look of the icons on the front-end will also be affected by the style of your active theme. You can add your own CSS using %2$s.', 'menu-icons' ) . '</p></div>',
2020-04-07 13:03:04 +00:00
$box_data,
sprintf(
'<a href="%s">%s</a>',
esc_url( $customizer_url ),
esc_html__( 'the customizer', 'menu-icons' )
)
2020-04-07 13:03:04 +00:00
),
),
'settingsFields' => self::get_settings_fields(),
'activeTypes' => self::get( 'global', 'icon_types' ),
'ajaxUrls' => array(
'update' => add_query_arg( 'action', 'menu_icons_update_settings', admin_url( '/admin-ajax.php' ) ),
),
'menuSettings' => self::get_menu_settings( self::get_current_menu_id() ),
)
);
wp_localize_script( 'menu-icons', 'menuIcons', $js_data );
}
}