OwlCyberSecurity - MANAGER
Edit File: font-awesome-icon-block-init.php
<?php namespace FortAwesome; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } require_once trailingslashit( FONTAWESOME_DIR_PATH ) . 'includes/class-fontawesome-svg-styles-manager.php'; /** * We need to register the block-editor script explicitly, instead of * just relying on it to be registered by `register_block_type`, because we need to add some dependencies. * * Thus, our block.json does not express its "editorScript" as something like "file:./index.js", * it will reference the resource handle used in this registration, like: "font-awesome-block-editor". */ function enqueue_font_awesome_block_editor_assets() { wp_register_script( 'font-awesome-block-editor', trailingslashit( FONTAWESOME_DIR_URL ) . 'block-editor/build/index.js', array( FontAwesome::ADMIN_RESOURCE_HANDLE, FontAwesome::RESOURCE_HANDLE_ICON_CHOOSER, ), FontAwesome::PLUGIN_VERSION, array( 'in_footer' => false ) ); wp_register_style( 'font-awesome-block-editor', trailingslashit( FONTAWESOME_DIR_URL ) . 'block-editor/build/index.css', array( FontAwesome_SVG_Styles_Manager::RESOURCE_HANDLE_SVG_STYLES, ), FontAwesome::PLUGIN_VERSION ); /** * This is to ensure that even when a webfont/css stylesheet is loaded at * the same time as we have inline SVGs in the page, the icon classes * on the <svg> elements don't up with ::before pseudo-elements on them * due to the rules in the webfont/css stylesheet. It probably wouldn't * result in anything rendering there, but it's better for there to be no * pseudo-elements present at all on the <svg> elements. */ $frontend_inline_style = <<< EOT .wp-block-font-awesome-icon svg::before, .wp-rich-text-font-awesome-icon svg::before {content: unset;} EOT; wp_add_inline_style( FontAwesome_SVG_Styles_Manager::RESOURCE_HANDLE_SVG_STYLES, $frontend_inline_style ); } function block_init() { if ( ! function_exists( 'is_wp_version_compatible' ) || ! is_wp_version_compatible( '5.8.0' ) ) { return; } /** * It's important that our block editor assets are registered on the `enqueue_block_editor_assets` action, because: * * 1. otherwise, it would happen on the `init` hook, and apparently this always triggers `wp_default_packages_vendor` * in WordPress core wp-includes/script-loader.php to run, and when it does, if there are * any `lodash` dependencies, it adds a duplicate inline `after` script like this: * ``` * window.lodash = _.noConflict() * window.lodash = _.noConflict() * ``` * * This is not idempotent: so calling it twice has the effect of making the global `_` undefined, * which breaks other scripts that depend on the global `_`. * * By invoking `wp_register_script()` within the `enqueue_block_editor_assets` hook, * that `wp_default_packages_vendor` function doesn't get called a second time, and thus, * the `window.lodash = _.noConflict()` is not duplicated, and thus the `_` global is not * reset to `undefined`. * * At the time of writing, this plugin depended on neither the 'lodash' nor 'underscore' script * handles. So wasn't that this plugin had loaded a conflicting version of lodash. It's that other * code in WordPress core *does* load conflicting versions, and it depends on the proper functioning * of `_.noConflict()` to resolve that. So we need to avoid running our code in such a way that causes * the side effect of calling `_.noConflict()` twice. * * (Since resolving this problem, this plugin *did* take a dependency on the 'lodash' version that * ships with WordPress core, to eliminate the need to bundle it separately. It still has no * direct or transitive dependencies on underscore--the older version of lodash). * * 2. We need these assets to be loaded for the block editor, on the back end only, never on * frontend page loads. The docs indicate that we should prefer using `enqueue_block_assets`. * However, since this plugin needs to be compatible with WordPress earlier than 6.3, we can't, * because it was only in WP 6.3 that assets enqueued under `enqueue_block_assets` would be * added to the editor content iframe as well as outside the iframe. So we need to continue * using the older hook. It's no big deal, though, since--for our plugin--the older mechanism * happens to accomplish exactly what we want: * (a) load the assets in the editor UI, and * (b) load them inside the editor's content iframe, * (c) but only load them there on the back end, never on the front end. * * https://developer.wordpress.org/block-editor/how-to-guides/enqueueing-assets-in-the-editor/ */ if ( is_wp_version_compatible( '6.3.0' ) ) { add_action( 'enqueue_block_assets', 'FortAwesome\enqueue_font_awesome_block_editor_assets' ); } else { add_action( 'enqueue_block_editor_assets', 'FortAwesome\enqueue_font_awesome_block_editor_assets' ); } register_block_type( __DIR__ . '/build' ); }