Last active
June 15, 2022 17:14
-
-
Save DeoThemes/af8a369b33dc8920118c82cae2af3078 to your computer and use it in GitHub Desktop.
A simple Elementor extension to create icon boxes with custom icon font.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Plugin Name: Deo Elementor Extension | |
* Description: Custom Elementor extension. | |
* Plugin URI: https://elementor.com/ | |
* Version: 1.0.0 | |
* Author: DeoThemes | |
* Author URI: https://elementor.com/ | |
* Text Domain: deo-elementor-extension | |
*/ | |
namespace DeoThemes; | |
use DeoThemes\Widgets\Deo_Icon_Box_Widget; | |
use DeoThemes\Controls\Deo_Icon_Box_Control; | |
define( 'DEO_PLUGIN_PATH', plugin_dir_path( __FILE__ ) ); | |
define( 'DEO_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); | |
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly. | |
/** | |
* Main Elementor Test Extension Class | |
* | |
* The main class that initiates and runs the plugin. | |
* | |
* @since 1.0.0 | |
*/ | |
final class Deo_Elementor_Extension { | |
/** | |
* Plugin Version | |
* | |
* @since 1.0.0 | |
* | |
* @var string The plugin version. | |
*/ | |
const VERSION = '1.0.0'; | |
/** | |
* Minimum Elementor Version | |
* | |
* @since 1.0.0 | |
* | |
* @var string Minimum Elementor version required to run the plugin. | |
*/ | |
const MINIMUM_ELEMENTOR_VERSION = '2.0.0'; | |
/** | |
* Minimum PHP Version | |
* | |
* @since 1.0.0 | |
* | |
* @var string Minimum PHP version required to run the plugin. | |
*/ | |
const MINIMUM_PHP_VERSION = '7.0'; | |
/** | |
* Instance | |
* | |
* @since 1.0.0 | |
* | |
* @access private | |
* @static | |
* | |
* @var Elementor_Test_Extension The single instance of the class. | |
*/ | |
private static $_instance = null; | |
/** | |
* Instance | |
* | |
* Ensures only one instance of the class is loaded or can be loaded. | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
* @static | |
* | |
* @return Elementor_Test_Extension An instance of the class. | |
*/ | |
public static function instance() { | |
if ( is_null( self::$_instance ) ) { | |
self::$_instance = new self(); | |
} | |
return self::$_instance; | |
} | |
/** | |
* Constructor | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function __construct() { | |
add_action( 'init', [ $this, 'i18n' ] ); | |
add_action( 'plugins_loaded', [ $this, 'init' ] ); | |
} | |
/** | |
* Load Textdomain | |
* | |
* Load plugin localization files. | |
* | |
* Fired by `init` action hook. | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function i18n() { | |
load_plugin_textdomain( 'elementor-test-extension' ); | |
} | |
/** | |
* Initialize the plugin | |
* | |
* Load the plugin only after Elementor (and other plugins) are loaded. | |
* Checks for basic plugin requirements, if one check fail don't continue, | |
* if all check have passed load the files required to run the plugin. | |
* | |
* Fired by `plugins_loaded` action hook. | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function init() { | |
// Check if Elementor installed and activated | |
if ( ! did_action( 'elementor/loaded' ) ) { | |
add_action( 'admin_notices', [ $this, 'admin_notice_missing_main_plugin' ] ); | |
return; | |
} | |
// Check for required Elementor version | |
if ( ! version_compare( ELEMENTOR_VERSION, self::MINIMUM_ELEMENTOR_VERSION, '>=' ) ) { | |
add_action( 'admin_notices', [ $this, 'admin_notice_minimum_elementor_version' ] ); | |
return; | |
} | |
// Check for required PHP version | |
if ( version_compare( PHP_VERSION, self::MINIMUM_PHP_VERSION, '<' ) ) { | |
add_action( 'admin_notices', [ $this, 'admin_notice_minimum_php_version' ] ); | |
return; | |
} | |
// Include plugin files | |
//$this->includes(); | |
// Register assets | |
//add_action( 'elementor/frontend/after_register_scripts', [ $this, 'register_assets' ] ); | |
add_action( 'elementor/frontend/after_register_styles', [ $this, 'register_styles' ] ); | |
// ICOMOON STYLES | |
add_action( 'elementor/editor/after_enqueue_scripts', [ $this, 'register_styles' ] ); | |
add_action( 'elementor/frontend/after_register_styles', [ $this, 'register_styles' ] ); | |
add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'register_styles' ] ); | |
// Register widgets | |
add_action( 'elementor/widgets/widgets_registered', [ $this, 'on_widgets_registered' ] ); | |
// Register controls | |
add_action( 'elementor/controls/controls_registered', [ $this, 'on_widgets_registered' ] ); | |
} | |
/** | |
* On Widgets Registered | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function on_widgets_registered() { | |
$this->includes(); | |
$this->register_widgets(); | |
$this->register_controls(); | |
} | |
/** | |
* Admin notice | |
* | |
* Warning when the site doesn't have Elementor installed or activated. | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function admin_notice_missing_main_plugin() { | |
if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] ); | |
$message = sprintf( | |
/* translators: 1: Plugin name 2: Elementor */ | |
esc_html__( '"%1$s" requires "%2$s" to be installed and activated.', 'elementor-test-extension' ), | |
'<strong>' . esc_html__( 'Elementor Test Extension', 'elementor-test-extension' ) . '</strong>', | |
'<strong>' . esc_html__( 'Elementor', 'elementor-test-extension' ) . '</strong>' | |
); | |
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message ); | |
} | |
/** | |
* Admin notice | |
* | |
* Warning when the site doesn't have a minimum required Elementor version. | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function admin_notice_minimum_elementor_version() { | |
if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] ); | |
$message = sprintf( | |
/* translators: 1: Plugin name 2: Elementor 3: Required Elementor version */ | |
esc_html__( '"%1$s" requires "%2$s" version %3$s or greater.', 'elementor-test-extension' ), | |
'<strong>' . esc_html__( 'Elementor Test Extension', 'elementor-test-extension' ) . '</strong>', | |
'<strong>' . esc_html__( 'Elementor', 'elementor-test-extension' ) . '</strong>', | |
self::MINIMUM_ELEMENTOR_VERSION | |
); | |
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message ); | |
} | |
/** | |
* Admin notice | |
* | |
* Warning when the site doesn't have a minimum required PHP version. | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function admin_notice_minimum_php_version() { | |
if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] ); | |
$message = sprintf( | |
/* translators: 1: Plugin name 2: PHP 3: Required PHP version */ | |
esc_html__( '"%1$s" requires "%2$s" version %3$s or greater.', 'elementor-test-extension' ), | |
'<strong>' . esc_html__( 'Elementor Test Extension', 'elementor-test-extension' ) . '</strong>', | |
'<strong>' . esc_html__( 'PHP', 'elementor-test-extension' ) . '</strong>', | |
self::MINIMUM_PHP_VERSION | |
); | |
printf( '<div class="notice notice-warning is-dismissible"><p>%1$s</p></div>', $message ); | |
} | |
/** | |
* Include Files | |
* | |
* Load required plugin core files. | |
* | |
* @since 1.0.0 | |
* | |
* @access public | |
*/ | |
public function includes() { | |
require_once( __DIR__ . '/widgets/deo-icon-box-widget.php' ); | |
require_once( __DIR__ . '/controls/deo-icon-box-control.php' ); | |
} | |
public function register_widgets() { | |
\Elementor\Plugin::instance()->widgets_manager->register_widget_type( new Deo_Icon_Box_Widget() ); | |
} | |
public function register_controls() { | |
$controls_manager = \Elementor\Plugin::$instance->controls_manager; | |
$controls_manager->register_control( 'icon', new Deo_Icon_Box_Control ); | |
} | |
public function register_styles() { | |
wp_enqueue_style( 'font-icons', plugins_url( '/assets/css/font-icons.css', __FILE__ ) ); | |
wp_enqueue_style( 'icomoon', plugins_url( 'style.css', __FILE__ ) ); | |
wp_enqueue_style( 'icomoon', plugins_url( 'style.css', __FILE__ ) ); | |
wp_enqueue_style( 'icomoon', plugins_url( 'style.css', __FILE__ ) ); | |
} | |
} | |
Deo_Elementor_Extension::instance(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace DeoThemes\Controls; | |
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly. | |
class Deo_Icon_Box_Control extends \Elementor\Base_Control { | |
// Retrieve icon control type. | |
public function get_type() { | |
return 'icon'; | |
} | |
// Retrieve icons. | |
// Make your own list, and use the IcoMoon font 'style.css' Classes to build your array | |
public static function get_icons() { | |
return [ | |
'icon-noun_977768' => 'noun professional', | |
'icon-noun_977793' => 'health safety', | |
'icon-noun_1245026' => 'bicycle', | |
'icon-noun_1248182' => 'engineer mechanical', | |
'icon-noun_1258170' => 'engineer solve', | |
'icon-noun_1267333' => 'human resources', | |
'icon-noun_1273446' => 'engineer fit', | |
'icon-noun_1273443' => 'manager', | |
'icon-noun_1278287' => 'weather cold', | |
'icon-noun_977698' => 'technician', | |
]; | |
} | |
// Retrieve the default settings of the icons control to return the default settings while initializing the icons control. | |
protected function get_default_settings() { | |
return [ | |
'icons' => self::get_icons(), | |
]; | |
} | |
// Render icons control output in the editor. | |
public function content_template() { | |
?> | |
<div class="elementor-control-field"> | |
<label class="elementor-control-title">{{{ data.label }}}</label> | |
<div class="elementor-control-input-wrapper"> | |
<select class="elementor-control-icon" data-setting="{{ data.name }}" data-placeholder="<?php _e( 'Select Icon', 'elementor' ); ?>"> | |
<option value=""><?php _e( 'Select Icon', 'elementor' ); ?></option> | |
<# _.each( data.icons, function( option_title, option_value ) { #> | |
<option value="{{ option_value }}">{{{ option_title }}}</option> | |
<# } ); #> | |
</select> | |
</div> | |
</div> | |
<# if ( data.description ) { #> | |
<div class="elementor-control-field-description">{{ data.description }}</div> | |
<# } #> | |
<?php | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace DeoThemes\Widgets; | |
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly. | |
class Deo_Icon_Box_Widget extends \Elementor\Widget_Base { | |
/** | |
* Get widget name. | |
* | |
* Retrieve oEmbed widget name. | |
* | |
* @since 1.0.0 | |
* @access public | |
* | |
* @return string Widget name. | |
*/ | |
public function get_name() { | |
return 'oembed'; | |
} | |
/** | |
* Get widget title. | |
* | |
* Retrieve oEmbed widget title. | |
* | |
* @since 1.0.0 | |
* @access public | |
* | |
* @return string Widget title. | |
*/ | |
public function get_title() { | |
return __( 'Deo Icon Box', 'plugin-name' ); | |
} | |
/** | |
* Get widget icon. | |
* | |
* Retrieve oEmbed widget icon. | |
* | |
* @since 1.0.0 | |
* @access public | |
* | |
* @return string Widget icon. | |
*/ | |
public function get_icon() { | |
return 'fa fa-code'; | |
} | |
/** | |
* Get widget categories. | |
* | |
* Retrieve the list of categories the oEmbed widget belongs to. | |
* | |
* @since 1.0.0 | |
* @access public | |
* | |
* @return array Widget categories. | |
*/ | |
public function get_categories() { | |
return [ 'general' ]; | |
} | |
/** | |
* Register oEmbed widget controls. | |
* | |
* Adds different input fields to allow the user to change and customize the widget settings. | |
* | |
* @since 1.0.0 | |
* @access protected | |
*/ | |
protected function _register_controls() { | |
$this->start_controls_section( | |
'content_section', | |
[ | |
'label' => __( 'Content', 'plugin-name' ), | |
'tab' => \Elementor\Controls_Manager::TAB_CONTENT, | |
] | |
); | |
$this->add_control( | |
'icon', | |
[ | |
'label' => __( 'Icons', 'plugin-name' ), | |
'type' => \Elementor\Controls_Manager::ICON, | |
'include' => [ | |
'icon-noun_977768', | |
'icon-noun_977793' | |
], | |
'default' => 'icon-noun_977768', | |
] | |
); | |
$this->end_controls_section(); | |
} | |
/** | |
* Render widget output on the frontend. | |
* | |
* Written in PHP and used to generate the final HTML. | |
* | |
* @since 1.0.0 | |
* @access protected | |
*/ | |
protected function render() { | |
$settings = $this->get_settings_for_display(); | |
echo '<svg class="feature__icon"><use xlink:href="' . DEO_PLUGIN_URL . 'assets/img/icons/orion-svg-sprite.svg#' . $settings['icon'] . '"></use></svg>'; | |
echo '<i class="' . $settings['icon'] . '" aria-hidden="true"></i>'; | |
} | |
protected function _content_template() { | |
?> | |
<i class="{{ settings.icon }}" aria-hidden="true"></i> | |
<?php | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment