* @codeCoverageIgnore
*/
class Menu_Icons_OBFX_Module extends Orbit_Fox_Module_Abstract {
/**
* The default icon to use.
*/
const DEFAULT_ICON = 'dashicons-obfx-default-icon';
/**
* Menu_Icons_OBFX_Module constructor.
*
* @since 1.0.0
* @access public
*/
public function __construct() {
parent::__construct();
$this->name = __( 'Menu Icons', 'themeisle-companion' );
$this->description = __( 'Module to define menu icons for navigation.', 'themeisle-companion' );
$this->active_default = true;
add_action( 'admin_init', array( $this, 'check_conflict' ), 99 );
}
/**
* Determine if module should be loaded.
*
* @since 1.0.0
* @access public
* @return bool
*/
public function enable_module() {
return true;
}
/**
* The loading logic for the module.
*
* @since 1.0.0
* @access public
*/
public function load() {
}
/**
* Method to define hooks needed.
*
* @since 1.0.0
* @access public
*/
public function hooks() {
$this->loader->add_action( 'wp_update_nav_menu_item', $this, 'save_fields', 10, 3 );
// Do not change the priority of this from 1.
$this->loader->add_filter( 'wp_edit_nav_menu_walker', $this, 'custom_walker', 1 );
$this->loader->add_filter( 'wp_setup_nav_menu_item', $this, 'show_menu', 10, 1 );
}
/**
* Show the menu item.
*
* @access public
* @return WP_Post $menu the menu object.
*/
public function show_menu( $menu ) {
$icon = get_post_meta( $menu->ID, 'obfx_menu_icon', true );
if ( ! empty( $icon ) ) {
$menu->icon = $icon;
if ( ! is_admin() ) {
// usually, icons are of the format fa-x or dashicons-x and when displayed they are displayed with classes 'fa fa-x' or 'dashicons dashicons-x'.
// so let's determine the prefix class.
$array = explode( '-', $icon );
$prefix = reset( $array );
$prefix = apply_filters( 'obfx_menu_icons_icon_class', $prefix, $icon );
$menu->title = sprintf( '%s', $prefix, $icon, $menu->title );
}
}
return $menu;
}
/**
* Return the custom walker.
*
* @access public
* @return Walker_Nav_Menu_Edit $walker the walker.
*/
public function custom_walker( $walker ) {
if ( ! class_exists( 'Menu_Icons_OBFX_Walker' ) ) {
require_once $this->get_dir() . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'class-menu-icons-obfx-walker.php';
}
$walker = 'Menu_Icons_OBFX_Walker';
return $walker;
}
/**
* Check if font awesome should load.
*
* @return bool
*/
private function should_load_fa() {
// Get all locations
$locations = get_nav_menu_locations();
if ( empty( $locations ) ) {
return false;
}
foreach ( $locations as $location => $menu_id ) {
$menu_items = wp_get_nav_menu_items( $menu_id );
if ( ! is_array( $menu_items ) ) {
continue;
}
foreach ( $menu_items as $menu_item ) {
$icon = get_post_meta( $menu_item->ID, 'obfx_menu_icon', true );
if ( ! empty( $icon ) ) {
return true;
}
}
}
return false;
}
/**
* Method that returns an array of scripts and styles to be loaded
* for the front end part.
*
* @since 1.0.0
* @access public
* @return array
*/
public function public_enqueue() {
if ( $this->should_load_fa() === false ) {
return array();
}
return array(
'css' => array(
'https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css' => array( 'dashicons' ),
'public' => false,
),
);
}
/**
* Method that returns an array of scripts and styles to be loaded
* for the admin part.
*
* @since 1.0.0
* @access public
* @return array
*/
public function admin_enqueue() {
$current_screen = get_current_screen();
if ( ! isset( $current_screen->id ) ) {
return array();
}
if ( $current_screen->id != 'nav-menus' ) {
return array();
}
// Our walker has not been registered because another custom walker exists.
if ( ! class_exists( 'Menu_Icons_OBFX_Walker' ) ) {
return array();
}
$this->localized = array(
'admin' => array(
'icons' => apply_filters( 'obfx_menu_icons_icon_list', $this->get_dashicons() ),
'icon_default' => self::DEFAULT_ICON,
'i10n' => array(
/*
* translators: %s Plugin name
*/
'powered_by' => sprintf( __( 'Powered by %s plugin', 'themeisle-companion' ), '' . apply_filters( 'themeisle_companion_friendly_name', '' ) . '' ),
),
),
);
$font_awesome = array(
'vendor/font-awesome.min' => false,
'vendor/fontawesome-iconpicker.min' => array( 'vendor/font-awesome.min' ),
);
if ( wp_style_is( 'font-awesome', 'registered' ) || wp_style_is( 'font-awesome', 'enqueued' ) ) {
$font_awesome = array(
'vendor/fontawesome-iconpicker.min' => array( 'font-awesome' ),
);
}
return array(
'css' => array_merge(
$font_awesome,
array(
'admin' => array( 'vendor/fontawesome-iconpicker.min' ),
)
),
'js' => array(
'vendor/bootstrap.min' => array( 'jquery' ),
'vendor/fontawesome-iconpicker.min' => array( 'vendor/bootstrap.min' ),
'admin' => array( 'vendor/fontawesome-iconpicker.min', 'jquery' ),
),
);
}
/**
* Method to define the options fields for the module
*
* @since 1.0.0
* @access public
* @return array
*/
public function options() {
return array();
}
/**
* Return all the dashicons.
*
* @access private
* @return array
*/
private function get_dashicons() {
return array( 'dashicons-menu', 'dashicons-admin-site', 'dashicons-dashboard', 'dashicons-admin-post', 'dashicons-admin-media', 'dashicons-admin-links', 'dashicons-admin-page', 'dashicons-admin-comments', 'dashicons-admin-appearance', 'dashicons-admin-plugins', 'dashicons-admin-users', 'dashicons-admin-tools', 'dashicons-admin-settings', 'dashicons-admin-network', 'dashicons-admin-home', 'dashicons-admin-generic', 'dashicons-admin-collapse', 'dashicons-welcome-write-blog', 'dashicons-welcome-add-page', 'dashicons-welcome-view-site', 'dashicons-welcome-widgets-menus', 'dashicons-welcome-comments', 'dashicons-welcome-learn-more', 'dashicons-format-aside', 'dashicons-format-image', 'dashicons-format-gallery', 'dashicons-format-video', 'dashicons-format-status', 'dashicons-format-quote', 'dashicons-format-chat', 'dashicons-format-audio', 'dashicons-camera', 'dashicons-images-alt', 'dashicons-images-alt2', 'dashicons-video-alt', 'dashicons-video-alt2', 'dashicons-video-alt3', 'dashicons-image-crop', 'dashicons-image-rotate-left', 'dashicons-image-rotate-right', 'dashicons-image-flip-vertical', 'dashicons-image-flip-horizontal', 'dashicons-undo', 'dashicons-redo', 'dashicons-editor-bold', 'dashicons-editor-italic', 'dashicons-editor-ul', 'dashicons-editor-ol', 'dashicons-editor-quote', 'dashicons-editor-alignleft', 'dashicons-editor-aligncenter', 'dashicons-editor-alignright', 'dashicons-editor-insertmore', 'dashicons-editor-spellcheck', 'dashicons-editor-distractionfree', 'dashicons-editor-kitchensink', 'dashicons-editor-underline', 'dashicons-editor-justify', 'dashicons-editor-textcolor', 'dashicons-editor-paste-word', 'dashicons-editor-paste-text', 'dashicons-editor-removeformatting', 'dashicons-editor-video', 'dashicons-editor-customchar', 'dashicons-editor-outdent', 'dashicons-editor-indent', 'dashicons-editor-help', 'dashicons-editor-strikethrough', 'dashicons-editor-unlink', 'dashicons-editor-rtl', 'dashicons-align-left', 'dashicons-align-right', 'dashicons-align-center', 'dashicons-align-none', 'dashicons-lock', 'dashicons-calendar', 'dashicons-visibility', 'dashicons-post-status', 'dashicons-edit', 'dashicons-trash', 'dashicons-arrow-up', 'dashicons-arrow-down', 'dashicons-arrow-right', 'dashicons-arrow-left', 'dashicons-arrow-up-alt', 'dashicons-arrow-down-alt', 'dashicons-arrow-right-alt', 'dashicons-arrow-left-alt', 'dashicons-arrow-up-alt2', 'dashicons-arrow-down-alt2', 'dashicons-arrow-right-alt2', 'dashicons-arrow-left-alt2', 'dashicons-sort', 'dashicons-leftright', 'dashicons-list-view', 'dashicons-exerpt-view', 'dashicons-share', 'dashicons-share-alt', 'dashicons-share-alt2', 'dashicons-twitter', 'dashicons-rss', 'dashicons-email', 'dashicons-email-alt', 'dashicons-facebook', 'dashicons-facebook-alt', 'dashicons-googleplus', 'dashicons-networking', 'dashicons-hammer', 'dashicons-art', 'dashicons-migrate', 'dashicons-performance', 'dashicons-wordpress', 'dashicons-wordpress-alt', 'dashicons-pressthis', 'dashicons-update', 'dashicons-screenoptions', 'dashicons-info', 'dashicons-cart', 'dashicons-feedback', 'dashicons-cloud', 'dashicons-translation', 'dashicons-tag', 'dashicons-category', 'dashicons-yes', 'dashicons-no', 'dashicons-no-alt', 'dashicons-plus', 'dashicons-minus', 'dashicons-dismiss', 'dashicons-marker', 'dashicons-star-filled', 'dashicons-star-half', 'dashicons-star-empty', 'dashicons-flag', 'dashicons-location', 'dashicons-location-alt', 'dashicons-vault', 'dashicons-shield', 'dashicons-shield-alt', 'dashicons-sos', 'dashicons-search', 'dashicons-slides', 'dashicons-analytics', 'dashicons-chart-pie', 'dashicons-chart-bar', 'dashicons-chart-line', 'dashicons-chart-area', 'dashicons-groups', 'dashicons-businessman', 'dashicons-id', 'dashicons-id-alt', 'dashicons-products', 'dashicons-awards', 'dashicons-forms', 'dashicons-testimonial', 'dashicons-portfolio', 'dashicons-book', 'dashicons-book-alt', 'dashicons-download', 'dashicons-upload', 'dashicons-backup', 'dashicons-clock', 'dashicons-lightbulb', 'dashicons-desktop', 'dashicons-tablet', 'dashicons-smartphone', 'dashicons-smiley' );
}
/**
* Save menu item's icon.
*
* @access public
*
* @param int $menu_id Nav menu ID.
* @param int $menu_item_db_id Menu item ID.
* @param array $menu_item_args Menu item data.
*/
public static function save_fields( $menu_id, $menu_item_db_id, $menu_item_args ) {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
return;
}
if ( ! function_exists( 'get_current_screen' ) ) {
return;
}
$screen = get_current_screen();
if ( ! $screen instanceof WP_Screen || 'nav-menus' !== $screen->id ) {
return;
}
check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' );
if ( isset( $_POST['menu-item-icon'][ $menu_item_db_id ] ) ) {
$icon = sanitize_text_field( $_POST['menu-item-icon'][ $menu_item_db_id ] );
if ( self::DEFAULT_ICON === $icon ) {
$icon = '';
}
update_post_meta( $menu_item_db_id, 'obfx_menu_icon', $icon );
}
}
/**
* Checks if there is any conflict with a theme/plugin.
*/
public function check_conflict() {
// We need to include this so that the wp_edit_nav_menu_walker filter does not misbehave.
require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
// Let's check if another walker has been defined.
$walker = apply_filters( 'wp_edit_nav_menu_walker', '', '' );
// Yes, a conflict!
if ( ! empty( $walker ) && $walker !== 'Menu_Icons_OBFX_Walker' ) {
$reflector = new ReflectionClass( $walker );
$path = str_replace( '\\', '/', $reflector->getFileName() );
$name = '';
$type = '';
if ( false !== strpos( $path, 'themes' ) ) {
$type = __( 'theme', 'themeisle-companion' );
$theme = wp_get_theme();
$name = $theme->get( 'Name' );
} else {
$path = explode( 'plugins', $path );
$path = explode( DIRECTORY_SEPARATOR, isset( $path[1] ) ? $path[1] : '' );
$path = array_values( array_filter( $path ) );
if ( isset( $path[0] ) ) {
$name = ' ' . esc_attr( $path[0] ) . '';
}
$type = __( 'plugin', 'themeisle-companion' );
}
/*
* translators: %1$s Component name %2$s Component type
*/
$this->description .= '
' . sprintf( __( 'There appears to be a conflict with the %1$s %2$s. This module may not work as expected.', 'themeisle-companion' ), $type, $name ) . '';
$this->active_default = false;
}
}
}