Adding Custom Icons to Divi

Divi comes pre-packaged with a selection of icons which can be used with modules such as the blurb module. These icons are 'font icons' provided by Elegant Themes and there is no in-built way to add new fonts. Fortunately, there is a way we can work around this to add our own custom icons.

Note: this post is about uploading your own icons for use in modules that support the Divi icon picker. See here if you instead want more icons in the Social Media Follow Module.

Adding Custom Icons using Divi Booster

Divi Booster plugin lets you add new icons to the list of built-in icons. This makes them easily available to your modules, with no need to upload the image each time you want to use it. The icons will be available in modules which normally have the option to add an icon, such as the blurb and button modules.

To add custom icons using Divi Booster:

  1. Go to the Divi Booster settings page
  2. Open the 'Site-wide Settings' toggle
  3. Open the 'Icons' sub-toggle
  4. Tick the checkbox next to the 'Add custom icons for use in modules' option to enable the feature.
  5. Click on 'Choose Image' to select the icon you want from the media library (or upload a new one), then click 'Use Image'.

The option should now look something like this:

There isn't a limit on how many icons you can add. However, there is a bit trick to it. You can currently only add one image at a time. When you save the settings, another upload box will appear so you can add another icon. So just save after you upload each icon and you can add as many as you like. To get rid of an icon, click on the little 'X' next to the icon you would like to remove.

Save the Divi Booster settings and your icon will now be available to you in the modules icon list.

Note: to use SVGs, add SVG support to WordPress with a plugin such as SVG Support.

Styling the Custom Icons

It'll depend slightly on which module the icons are being used in, but in general the size can be set in the same way as the rest of the icons. Similarly, the background should work as long as your icon image has a transparent background itself. Changing the icon color is a different matter. The built-in icons are 'font icons', meaning they are basically text, while the icons added in that Divi Booster option will be images. This means that the settings for changing the color of the built-in icons won't work on the added image icons. I hope to be able to add something in the future (probably along the lines of the filter options Divi includes for the entire module area). I'll update here if / when I'm able to. In the meantime, the best I can suggest is to modify the colors of your icons in an image editing program prior to uploading.

Adding Custom Blurb Icons in Divi

It is now possible to add blurb icons directly in Divi, by going into the settings for your blurb module settings and setting "Use Icon" to "No" and then selecting an image to display with your blurb, like so:

Note that the Divi option lets you upload a custom icon to a single blurb module. Note that this is differs from the Divi Booster option which lets you add icons to the icon list (and which are therefore available to all your blurb modules). Depending on your needs one or the other of these may suit you better.

Adding Custom Icons Manually using PHP

Important: the PHP code given here doesn't work in Divi 4.13 upwards. Divi Booster has already been updated to be compatible with the latest version of Divi. I hope to be able to update the manual code with the relevant fixes here soon.

Here's how to add custom icons manually via PHP code. 

First, add the following PHP code to your site (e.g. in the functions.php file of your child theme). Be sure to take a backup / test on a staging site before using on a live site. There's a lot of code (adding custom icons is a tricky business), but you can basically ignore it all. The only thing that really matters is the last line, which I explain below.

if (!class_exists('DBDBCustomIcon')) {
	
	class DBDBCustomIcon {
		
		protected $id;
		protected $url;		
		
		public function __construct($id, $url='') {
			$this->id = $id;
			$this->url = $url;
		}
		
		public static function setup() {
			add_action('wp_head', array(__CLASS__, 'outputUserCss'));
			add_action('wp_head', array(__CLASS__, 'outputSharedUserJs'));
			add_action('wp_footer', array(__CLASS__, 'outputVisualBuilderJs'));
		}
		
		public static function outputUserCss() {
			echo '<style>'.self::getUserCss().'</style>';
		}
		
		public static function outputSharedUserJs() {
			echo '<script>'.self::getSharedUserJs().'</script>';
		}
		
		public static function outputVisualBuilderJs() {
			if (function_exists('et_fb_enabled') && et_fb_enabled()) {
				echo '<script>jQuery(function($){'.self::getMutationObserverJs().'});</script>';
			}
		}
		
		public function init() {
			$fontSymbolsPriority = apply_filters('DBDBCustomIcon_font_icon_symbols_priority', 50);
			add_filter('et_pb_font_icon_symbols', array($this, 'addToFontSymbols'), $fontSymbolsPriority);
			add_action('admin_head', array($this, 'outputIconPickerCss'));
			add_action('wp_head', array($this, 'outputIconPickerCssFb'));
			add_action('wp_footer', array($this, 'outputIconUpdateJs'));
			add_action('wp_head', array($this, 'db014_user_css_for_custom_button_icon'));
			add_action('wp_head', array($this, 'db014_user_css_for_custom_button_icons'));
			add_action('wp_head', array($this, 'db014_user_css_for_inline_icons'));
			add_action('wp_head', array($this, 'db014_user_css_for_custom_hover_icon'));
			add_action('wp_head', array($this, 'db014_user_css_to_hide_unwanted_icons'));
		}
		
		function db014_user_css_for_custom_button_icons() { ?>
			<style>
			.et_pb_custom_button_icon[data-icon="<?php esc_attr_e($this->id); ?>"]:before, 
			.et_pb_custom_button_icon[data-icon="<?php esc_attr_e($this->id); ?>"]:after {
				background-size: auto 1em;
				background-repeat: no-repeat;
				min-width: 20em;
				height: 100%;
				content: "" !important;
				background-position: left center;
				position: absolute;
				top: 0;
			}
			.et_pb_custom_button_icon[data-icon="<?php esc_attr_e($this->id); ?>"] { 
				overflow: hidden;
			}
			</style>
			<?php
		}

		function db014_user_css_for_inline_icons() { ?>
			<style>
			.et_pb_posts .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"]:before,
			.et_pb_portfolio_item .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"]:before {
				content: '' !important;
				-webkit-transition: all 0.4s;
				-moz-transition: all 0.4s;
				transition: all 0.4s;
			}
			.et_pb_posts .entry-featured-image-url:hover .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"] img,
			.et_pb_portfolio_item .et_portfolio_image:hover .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"] img { 
				margin-top:0px; transition: all 0.4s;
			}
			.et_pb_posts .entry-featured-image-url .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"] img, 
			.et_pb_portfolio_item .et_portfolio_image .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"] img { 
				margin-top: 14px; 
			}
			.et_pb_dmb_breadcrumbs a:first-child .db014_custom_hover_icon {
				position: relative !important;
				left: 0%; 
				transform: none;
				vertical-align: middle;
				margin-right: 8px;
			}
			.et_pb_dmb_breadcrumbs li .db014_custom_hover_icon {
				position: relative !important;
				left: 0%; 
				transform: none;
				vertical-align: middle;
				margin-right: 8px;
				margin-left: 4px;
			}
			</style>
			<?php
		}

		function db014_user_css_for_custom_hover_icon() { ?>
			<style>
			.db014_custom_hover_icon { 
				width:auto !important; 
				max-width:32px !important; 
				min-width:0 !important;
				height:auto !important; 
				max-height:32px !important; 
				min-height:0 !important;
				position:absolute;
				top:50%;
				left:50%;
				-webkit-transform: translate(-50%,-50%); 
				-moz-transform: translate(-50%,-50%); 
				-ms-transform: translate(-50%,-50%); 
				transform: translate(-50%,-50%); 
			}
			</style>
			<?php	
		}

		function db014_user_css_to_hide_unwanted_icons() { ?>
			<style>
			.et_pb_gallery .et_pb_gallery_image .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"]:before,
			.et_pb_blog_grid .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"]:before,
			.et_pb_image .et_pb_image_wrap .et_pb_inline_icon[data-icon="<?php esc_attr_e($this->id); ?>"]:before,
			.et_pb_dmb_breadcrumbs > ol > li > a:first-child[data-icon="<?php esc_attr_e($this->id); ?>"]:before,
			.et_pb_dmb_breadcrumbs > ol > li[data-icon="<?php esc_attr_e($this->id); ?>"]:before
			{ 
				display:none !important; 
			}
			</style>
			<?php
		}
		
		function db014_user_css_for_custom_button_icon() { 
			$id = $this->id;
			$url = $this->url;
			$icon = '.et_pb_custom_button_icon[data-icon="'.esc_html($id).'"]';
			$bg_img = empty($url)?'none':"url('".esc_html($url)."')";
			echo <<<END
			<style>
			$icon:before, 
			$icon:after {
				background-image: $bg_img;		
			}
			</style>
END;

			$is_svg = preg_match('#\.svg(\?[^.]*)?$#', $url);
			if ($is_svg) {
				// IE SVG background-size (as "auto" not supported) 
				// - width = half the 2em padding allocated for icon, and 50% height of button
				echo <<<END
				<style>
				body.ie $icon:before, 
				body.ie $icon:after {
					background-size: 1em 50%; 	
				}
				</style>
END;
			}
		}
		
		public function addToFontSymbols($fontSymbols) {
			$fontSymbols[] = $this->id;
			return $fontSymbols;
		}
		
		public function outputIconUpdateJs() { ?>
			<script>
			jQuery(function($){
				<?php if (!function_exists('et_fb_enabled') || !et_fb_enabled()) { ?>
				db014_update_icon(<?php echo json_encode($this->id); ?>, <?php echo json_encode($this->url); ?>);
				<?php } ?>
				$(document).on('db_vb_custom_icons_updated', function () {
					db014_update_icon(<?php echo json_encode($this->id); ?>, <?php echo json_encode($this->url); ?>);
				});
			});
			</script>
			<?php
		}		
		
		public function outputIconPickerCssFb() {
			if (function_exists('et_fb_enabled') && et_fb_enabled()) {
				$this->outputIconPickerCss();
			}
		}
		
		public function outputIconPickerCss() {
			echo '<style>'.$this->getIconPickerCss().'</style>';
		}
		
		public function getIconPickerCss() {
			$url = esc_html($this->url);
			$id = esc_attr($this->id);
			return <<<END
			.et-fb-option--select-icon li[data-icon="{$id}"]:after,
			.et-pb-option--select_icon li[data-icon="{$id}"]:before,
			.et-pb-option ul.et_font_icon li[data-icon="{$id}"]::before { 
				background: url('{$url}') no-repeat center center; 
				background-size: cover; 
				content: 'a' !important; 
				width: 16px !important; 
				height: 16px !important; 
				color: rgba(0,0,0,0) !important; 
			}
END;
		}		
		
		protected static function getSharedUserJs() {
			return <<<'END'
			function db014_update_icon(icon_id, icon_url) {
				db014_update_icons(jQuery(document), icon_id, icon_url);
				var $app_frame = jQuery("#et-fb-app-frame");
				if ($app_frame) {
					db014_update_icons($app_frame.contents(), icon_id, icon_url);
				}
			}
			
			function db014_update_icons(doc, icon_id, icon_url) { 
				db014_update_custom_icons(doc, icon_id, icon_url);
				db014_update_custom_inline_icons(doc, icon_id, icon_url);
			}
	
			function db014_update_custom_icons(doc, icon_id, icon_url) {
				var $custom_icons = doc.find('.et-pb-icon:contains("'+icon_id+'")');	
				var icon_visible = (icon_url !== '');
				var $icons = $custom_icons.filter(function(){ return jQuery(this).text() == icon_id; }); 
				$icons.addClass('db-custom-icon');
				$icons.html('<img class="dbdb-custom-icon-img" src="'+icon_url+'"/>');
				$icons.toggle(icon_visible); 
			}
			
			function db014_update_custom_inline_icons(doc, icon_id, icon_url) {
				var $custom_inline_icons = doc.find('.et_pb_inline_icon[data-icon="'+icon_id+'"]');
				var icon_visible = (icon_url !== '');
				var $icons_inline = $custom_inline_icons.filter(function(){ return jQuery(this).attr('data-icon') == icon_id; });
				$icons_inline.addClass('db-custom-icon');
				$icons_inline.each(function(){
					if (jQuery(this).children('.db014_custom_hover_icon').length === 0) {
						if (jQuery(this).closest('.et_pb_dmb_breadcrumbs').length === 0) {
							jQuery(this).html('<img class="db014_custom_hover_icon"/>');
						} else {
							jQuery(this).prepend(jQuery('<img class="db014_custom_hover_icon"/>'));
						}
					}
					jQuery(this).children('.db014_custom_hover_icon').attr('src', icon_url);
				});
				$icons_inline.toggle(icon_visible);
			}
END;
		}
		
		protected static function getMutationObserverJs() { 
			return <<<'END'
			db014_watch_for_changes_that_might_update_icons();
			
			function db014_watch_for_changes_that_might_update_icons() {
				var target = document.getElementById('et-fb-app'); 
				var observer = new MutationObserver(function(mutations) {
					mutations.forEach(function(mutation) {
						if (mutation.type === 'characterData') {
							$(document).trigger('db_vb_custom_icons_updated');
						} else if (mutation.type === 'childList') {
							if (db014_may_contain_icons(mutation.target)) {
								$(document).trigger('db_vb_custom_icons_updated');
							}
						} else if (mutation.type === 'attributes') {
							$(document).trigger('db_vb_custom_icons_updated');
						}

					});
				});
				observer.observe(
					document.getElementById('et-fb-app'), 
					{ 
						attributes: true, 
						attributeFilter: ["class"],
						childList: true, 
						characterData: true,
						subtree: true
					}
				);
			}
			
			function db014_may_contain_icons(target) {
				if (target.className === undefined) { 
					return false; 
				}
				var classes = target.className;
				if (classes.search === undefined) { 
					return false; 
				}
				if (classes.search(/(et-pb-icon|et_pb_inline_icon|et-fb-root-ancestor|et_pb_root--vb|et-fb-post-content|et_pb_section|et_pb_row|et_pb_column)/i) !== -1) {
					return true;
				}
				return false;
			}
END;
		}
		
		protected static function getUserCss() { 
			return <<<'END'
			.db-custom-icon img { 
				height: 1em;
			}
END;
		}
	}
}

DBDBCustomIcon::setup();
(new DBDBCustomIcon('myicon', 'http://www.mysite.com/angry-bird-icon.png'))->init();

The final line is the one that actually adds an icon. To add your own icon, give it an id (it doesn't much matter what – I've called mine "myicon"), and change the image url to that of your icon. This calls the class added by the rest of the code, and does all the work of adding the icon to Divi. If you need more icons, just repeat the last line with a different id / URL. 

If you now go into the settings for a module which accepts icons, such as the blurb module you should see something like this:

custom divi icons 2

 

Notice that the final icon is now our custom icon.

Select the new icon and save the blurb module. Now view the page with your blurb module. If all goes well, you should see your new icon, like so:

custom divi icons

This post may contain referral links which may earn a commission for this site

Divi Booster

Hundreds of new features for Divi
in one easy-to-use plugin

157 Comments

  1. I just purchased Divi Booster – specifically to add icons to the icon picker. I follow your instructions but I can only add 1 icon. After saving Divi Booster settings and attempting to add a second icon the first uploaded icon is removed from the picker and the two spaces for uploading icons both show the last uploaded icon. I have tried several times and get the same result.

    Reply
    • Hey Cale, sorry to hear you've having this issue. I've just done some testing and it doesn't happen on my test sites (latest Divi, WP, etc). It does, however, remind me of a case I saw a few years back where a another plugin was inadvertently messing up the HTML of the Divi Booster settings page and causing something similar. I forget the details, but we were ultimately able to resolve that one. Is there any chance I'd be able to login to the site to take a look for myself? If so, perhaps you could send through the login details via the contact form? Alternatively, try temporarily disabling the other plugins on the site to see if that resolves it. I hope that helps!

      Reply
  2. Hello Dan, I followed your CSS and did everything correctly, but its not show up, is it because of different version of WordPress or DIVI? Seems the CSS not working, and I don't want too much plugins for my site, please help, thank you.

    Reply
    • Hi Jasper, unfortunately the Divi 4.13 update made some big changes to the handling of icons that were incompatible with the code given in the post. While I've been able to fix the custom icon feature in Divi Booster, I haven't yet managed to update the PHP code in this post. I hope to do so soon. So my sincere apologies, the manual PHP code version won't work at the moment in the latest version of Divi.

      Reply
  3. Hi Dan, I've recently started using the plug-in to add customized icons to my site, mainly to add a customized scroll down icon to the Scroll Down Icon list in the Header. Unfortunately, no added icons are showing, and I can't find any relevant info addressing this issue. Is there a way to solve this using this plug-in?

    Reply
    • Hey Mor, ​the fullwidth header module's scroll down icon picker is implemented a bit differently to the icon picker in other modules, and so the Divi Booster custom icon feature wasn't applying to it. However, I've just gone through now and added support for custom icons in scroll down icons, which will be in the next update (v3.7.0). After updating, custom icons added via "Divi > Divi Booster > Site-wide settings > Icons" should become available in the fullwidth header module. I hope to have it released before the end of the week. I'll let you know when it's ready. I hope it does what you need, but let me know if not. Cheers!

      Reply
      • I've now released the update (v3.7.0) to add support for custom icons in the fullwidth header scroll down icon picker. Hope it helps!

        Reply
  4. Hi I bought divi booster specifically to be able to add custom icons to a site, its all activated and I have followed the steps to add a custom icon but when i go to the button in the divi builder the custom icon isnt an option within the icons.

    Reply
    • Hi Rachel, sorry you've been having this issue. The recent Divi update made some sweeping changes to the way it handles icons, which ultimately stopped the Divi Booster feature from working. I've now released an update to address this (v3.6.8). Hopefully the update will get the icons working for you, but please let me know if not. Thanks!

      Reply
  5. Hello Dan,
    I would like to inform you that my custom icon has suddenly disappeared from the list of built-in icons. I have been using my custom icon for at least 3 years through your plugin. And I used it in each of my many blurbs that were on my 74 pages until a few days ago. On some of my pages even 3 or 4 blurbs have been visible in my posts.
    Now today I immediately had the suspicion that it must be only because of the last Divi update a few days ago.

    So I just did a downgrade (rollback)from 4.13 to 4.12.1 in the Divi Theme Updates.
    Lo and behold, my custom icon appears again in the built-in icons list.

    What do you think is the reason that the update to Divi 4.13 made my custom icon disappear?

    Thank you for your respond,
    Torsten

    Reply
    • Hi Torsten

      Thanks for getting in touch and sorry you've been having this issue.

      You're absolutely right, it's the recent Divi update which has caused this feature to stop working. The update made some quite sweeping changes to the way Divi handles icons, and I'm currently working on a fix to restore the icons / feature. I'm hoping to have it sorted out before the end of this week, and I'll let you know as soon as I have an update ready.

      Sorry for the hassle,
      Dan

      Reply
    • Hey Torsten

      I've just released the update (v3.6.8) to address the custom icon issue, so it should show up in your WordPress plugins page shortly. If you don't see it right away, click the "Check for Updates" link next to the plugin and it should pick it up. If you aren't able to update via the WordPress plugins page, you can also access the download in your Divi Booster account.

      I hope the update helps, but please let me know if you have any questions about it.

      Thanks and my apologies again,
      Dan

      Reply
      • Jumping in.

        Experiencing the same issues as Torsten. Been using this feature a long time and now it's broken.

        Upgrading to version 3.6.8 doesn't clear the issue. (Everything else is updated.) I've saved my Booster settings but the custom icons still isn't available through the blurb module.

        Do I need to activate something to have this feature running again? Any suggestions?

        Thanks in advance.

        Reply
        • Hey Rickard, there's nothing you should need to do to re-activate the feature. One change though is that the custom icons now appear at the very start of the icon list, rather than the end as used to be the case. I'd suggest checking for them there. if you still don't see them, is there any chance I'd be able to login and take a look for you? If this is possible, you can send the details via the contact form. Thanks!

          Reply
          • Hi Dan. Thank you for your reply. This was exactly the issue. I was looking for them at the end of the list. Things seems to be working as expected. Great. Thanks!

          • Great! Thanks for letting me know, Rickard!

  6. Hi Dan,

    First of all, I wanted to say thanks – I've been using your plugin for (?) six years – maybe more now? Wow… Where has that time gone!?

    I followed your tutorial and added an icon, but couldn't see it (it is in the divi-booster section but doesn't come through to the blurb. I cleared my cache as you suggested in the comments.

    What I really want to do is add our logo as a bullet point for a list. Is this possible?

    Many thanks,

    Matt

    Reply
    • Hey Matt, sorry I'm just replying now. Yeah, six years, mate – it launched in Feb 2015. Like you I have absolutely no idea where the time has gone! :)

      I've updated the instructions in the post to clarify a couple of things, just in case that was the issue. Specifically, make sure the checkbox next to the feature is ticked, and check the screenshot of the module settings for an example of where to find the icon – it'll show up at the end of the icon list. Hopefully that points you in the right direction, but if you're still not seeing the icon, perhaps you could send through a login via the contact form so that I can take a look for myself?

      It's possible in general to use an image as the list bullet points, though I haven't tried doing so with a custom icon yet. Is there any chance you're able to send through an example of the list and logo image (URL)? I'll have a go at it on my test site when I get a chance, but it would be great to see your setup so that I can make sure anything I come up with will work on your site. Cheers!

      Reply

Submit a Comment

Your email address will not be published.