Visual Composer: добавляем новые иконки в шорткод vc_icon

Вот уже продолжительное время в своих проектах я использую замечательный плагин — Wpbakery Visual Composer page builder. И все бы ничего, но на днях мне понадобилось расширить стандартный набор иконок в шорткоде vc_icon, и в документации, естественно, была уже устаревшая информация о том как это сделать. Пришлось идти обходными путями…

Перед началом работы

В начале, предполагается, что у вас уже установлен и активирован WPBakery Page Builder плагин. Если нет, то купить и скачать его можно на ThemeForest или отправить соответствующий запрос в свободной форме мне в Telegram , где я вам просто предоставлю свежую лицензионную версию в ознакомительных целях к этой статье 😉 .

Все ли так плохо с плагином Visual Composer?

И да и нет…, но скорее всего, лично для меня да т.к плагин обладает огромным потенциалом, который хоронят в полностью устаревшей документации и почти нулевом сообществе + он еще платный, что явно не добавляет ему плюсов. Вишенкой на торте, является полностью маразматический код/решения (хоть хорошо не всего плагина, а отдельных частей): как например объединения шорткодов Tab и Tour в единое целое с невозможностью нормально их кастомизировать. В любом случае этот плагин решает очень много проблем при заполнении контента, поэтому нужно всячески выкручиваться и постоянно изучать код Visual Composer на предмет новых фич. Итак, давайте теперь перейдем непосредственно к решению проблемы, но сразу хочу сделать оговорку, что ниже приведенный пример полностью работает на плагине Visual Composer WordPress версии 5.0.1 и я очень надеюсь, что будет работать и с более новыми версиями.

Подключаем необходимые файлы

Будем поступать мудро и создадим новый файл, например visual-composer.php в inc директории темы, и подключим его в functions.php:

/**
 * Visual Composer Settings
 *
 * @since Theme Name 1.0
 */
require( trailingslashit( get_template_directory() ) . 'inc/visual-composer.php' );

Теперь, внутри подключаемого файла для подстраховки напишем следующую конструкцию:

if ( !in_array( 'js_composer/js_composer.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
	return;
}

Формируем новый список иконочных шрифтов

Сперва, нам нужно подключить хук-событие vc_after_init и в вызываемой функции vc_after_init_actions, для начала просто получить параметры выпадающего списка шрифтов, которые затем мы просто дополним. Параметры получим с помощью создания экземпляра класса WPBMap, который принимает два значения — имя шорткода и имя его получаемого параметра (WPBMap::getParam( $shortcode, $param );). Может так случиться, что вы не будете знать название параметра, но из этой ситуации можно выйти создав новый экземпляр класса WPBMap и вывести все параметры заданного шорткода с помощью метода getShortCode :

$params = WPBMap::getShortCode('vc_icon');
var_dump($params);

Далее, в полученный параметр (массив) просто добавим имя шрифта и его идентификатор и в конце, обновленный массив параметров загоним в Visual Composer с помощью функции vc_update_shortcode_param. Ниже, пример добавления имени шрифта Feather в общий выпадающий список:

if ( ! function_exists( 'vc_after_init_actions' ) ) {
	/**
	 * VC after init actions
	 */
	function vc_after_init_actions() {

		$vc_shortcodes = array(
			'vc_icon'           => array( 'type' )
		);

		foreach ( $vc_shortcodes as $key => $value ) {

			foreach ( $value as $param_value ) {
				$param = WPBMap::getParam( $key, $param_value );
				switch ( $key ) {
					
					case 'vc_icon' :
							$param['value'][ __( 'Feather', 'theme' ) ]     = 'feather';
							$param['weight'] = 90;
						break;
				}

				vc_update_shortcode_param( $key, $param );
			}
		}

	}

	add_action( 'vc_after_init', 'vc_after_init_actions', 999 );
}

Код, выше естественно можно описать намного проще. Просто я взял пример со своего проекта в котором нужно кастомизировать кучу шорткодов, поэтому для удобства я и создал массив $vc_shortcodes который прогоняю и изменяю, что нужно под себя. Также, обратите внимание на следующую строчку кода: $param['weight'] = 90;. Эта строчка очень важна т.к определяет сортировку/положение элемента внутри билдера т.е. чем больше значение тем выше элемент в списке. Подробнее можно прочитать тут, однако там информация уже устаревшая, но для общего плана я думаю будет полезной 🙂

 Новый шрифт feather

Добавляем новые параметры в vc_icon

Итак, имя/ключ шрифта добавили. Теперь, как добавить сами иконки в общий выпадающий список ниже? Для этого нам понадобится функция vc_add_params или vc_add_param() (в зависимости от того, что вам нужно — добавить много параметров или только один). Добавляем функцию сразу после foreach из кода выше:

vc_add_params( 'vc_icon',
			array(
				array(
					'type'        => 'iconpicker',
					'heading'     => __( 'Icon', 'theme' ),
					'param_name'  => 'icon_feather',
					'value'       => "icon-eye",
					'settings'    => array(
						'emptyIcon'    => false,
						'iconsPerPage' => 131,
						'type'         => 'feather'
					),
					'weight'      => 80,
					'dependency'  => array(
						'element' => 'type',
						'value'   => 'feather',
					),
					'description' => __( 'Select icon from library.', 'theme' )
				)
			)
);

Обратите внимание на ключ type — он очень важен и именно опираясь на его значение, мы будем дальше подключать все необходимые классы иконок, и не только. Теперь, оставляем функцию vc_after_init_actions и подключаем фильтр, который будет брать наш шрифт с type = feather и подключать к нему массивс иконками, вида — имя_класса => читаемое_название. Естественно, все названия классов берем с файла стилей, который идет с каждым шрифтом. Поэтому добавляем фильтр vc_iconpicker-type-имя_типа т.е в нашем случае будет vc_iconpicker-type-feather:

function vc_iconpicker_type_feather( $icons ) {

	$icons = array(
		array('icon-eye' => 'Eye'),
		array('icon-paper-clip' => 'Paper clip'),
		array('icon-mail' => 'Mail'),
		array('icon-toggle' => 'Toggle'),
		array('icon-layout' => 'Layout') # Далее перечисление всех классов
	);

	return $icons;
}
add_filter( 'vc_iconpicker-type-feather', 'vc_iconpicker_type_feather', 999 );

В коде выше, я естественно, в целях экономии описал не все классы, а лишь описал несколько для примера. 

Подключаем необходимые стили

Это финальный шаг, на котором остается только подключить все css файлы шрифта во front/back сайта:

/**
 * Define Template URL
 */
if ( ! defined( 'TEMPLATE_URL' ) ) {
	define( 'TEMPLATE_URL', trailingslashit( get_template_directory_uri() ) );
}

/**
 * Define CSS URL
 */
if ( ! defined( 'CSS_PATH ' ) ) {
	define( 'CSS_PATH ', TEMPLATE_URL . 'assets/css/' );
}

add_action( 'vc_base_register_front_css', 'feather_vc_iconpicker_base_register_css' );
add_action( 'vc_base_register_admin_css', 'feather_vc_iconpicker_base_register_css' );
function feather_vc_iconpicker_base_register_css(){
	wp_register_style('feather', CSS_PATH . 'feather.css');
}

add_action( 'vc_backend_editor_enqueue_js_css', 'feather_vc_iconpicker_editor_jscss' );
add_action( 'vc_frontend_editor_enqueue_js_css', 'feather_vc_iconpicker_editor_jscss' );
function feather_vc_iconpicker_editor_jscss(){
	wp_enqueue_style( 'feather' );
}

add_action('vc_enqueue_font_icon_element', 'feather_enqueue_font');
function feather_enqueue_font($font){
	switch ( $font ) {
		case 'feather':
			wp_enqueue_style( 'feather' );
			break;
	}
}

Все, после этих строк, уже можно переходить в шорткод Icon и пользоваться новым набором иконок.

Новые иконки в visual composer

В заключение

Возможно вы уже догадались, что подключать все шрифты в фильтре vc_iconpicker-type-feather, «ручками» очень трудоемкая и ненужная работа (если классов очень много конечно), т.к приходиться брать имя класса, класть в строку, а потом еще писать читабельное название. Поэтому, все это дело я решил автоматизировать и по быстрому накидал следующий не очень красивый/правильный, но рабочий код:

$string = '
.icon-eye:before {
  content: "\e000";
}

.icon-paper-clip:before {
  content: "\e001";
}

.icon-mail:before {
  content: "\e002";
}';

$string =  preg_replace(
	array(
		'/\./',
		'/{/',
		'/}/',
		'/:before/',
		'/content: "(.*?)";/',
		'/(.*?)-(.*?)-(.*?)\s/',
		'/(?<=\s|^)(icon)-(.*?)\s/',
		"/(\r?\n){2,}/"
	),
	array(
		'',
		'',
		'',
		'',
		'',
		'array(\'$1-$2-$3\' => \'$2 $3\'),',
		'array(\'icon-$2\' => \'$2\'),',
		""
	), $string );

var_dump($string);

Как вы могли уже догадаться, код выше чистит css шрифта Feather и выводить на экран, то что можно просто скопировать и вставить внутрь функции vc_iconpicker_type_feather. Также, возможно кому-то будет полезен код для Bootstrap иконок:

$string =  preg_replace(
	array(
		'/\./',
		'/{/',
		'/}/',
		'/:before/',
		'/content: "(.*?)"/',
		'/,/',
		'/(.*?)-(.*?)-(.*?)\s/',
		'/(?<=\s|^)(glyphicon)-(.*?)\s/',
		"/(\r?\n){2,}/"
	),
	array(
		'',
		'',
		'',
		'',
		'',
		"\n",
		'array(\'$1-$2-$3\' => \'$2 $3\'),',
		'array(\'glyphicon-$2\' => \'$2\'),',
		""
	), $string );

echo preg_replace_callback('/=> \'[a-z]/', 'upper', $string);

function upper($matches) {
	return strtoupper($matches[0]);
}

Подписаться на новые статьи