bject( $type_obj->slug ); } return false; } /** * Get font manager fonts as font family => font type array * @return array */ private function get_font_types() { static $font_types = false; if ( ! $font_types ) { $font_types = get_option( self::FONTS_NAME_TYPE_OPTION_NAME, [] ); } return $font_types; } /** * Generates a list of all Font Manager fonts and stores it in the options table * @return array */ private function generate_fonts_list() { $fonts = new \WP_Query( [ 'post_type' => self::CPT, 'posts_per_page' => -1, ] ); $new_fonts = []; $font_types = []; foreach ( $fonts->posts as $font ) { $font_type = $this->get_font_type_by_post_id( $font->ID, true ); if ( false === $font_type ) { continue; } $font_types = array_replace( $font_types, $font_type->get_font_family_type( $font->ID, $font->post_title ) ); $new_fonts = array_replace( $new_fonts, $font_type->get_font_data( $font->ID, $font->post_title ) ); } update_option( self::FONTS_NAME_TYPE_OPTION_NAME, $font_types ); update_option( self::FONTS_OPTION_NAME, $new_fonts ); return $new_fonts; } /** * runs on Elementor font post save and calls the font type handler save meta method * * @param int $post_id * @param \WP_Post $post * @param bool $update * * @return mixed */ public function save_post_meta( $post_id, $post, $update ) { // If this is an autosave, our form has not been submitted, // so we don't want to do anything. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return $post_id; } // Check the user's permissions. if ( ! current_user_can( 'edit_post', $post_id ) ) { return $post_id; } // Check if our nonce is set. if ( ! isset( $_POST[ self::CPT . '_nonce' ] ) ) { return $post_id; } // Verify that the nonce is valid. if ( ! wp_verify_nonce( Pro_Utils::_unstable_get_super_global_value( $_POST, self::CPT . '_nonce' ), self::CPT ) ) { return $post_id; } // Save font type // only custom for now $custom_font = $this->get_font_type_object( 'custom' ); wp_set_object_terms( $post_id, $custom_font->get_type(), self::TAXONOMY ); // Let Font type handle saving // Sanitize the whole $_POST array $custom_font->save_meta( $post_id, Pro_Utils::_unstable_get_super_global_value( [ 'data' => $_POST ], 'data' ) ); } /** * Helper to clean font list on save/update */ public function clear_fonts_list() { delete_option( self::FONTS_OPTION_NAME ); delete_option( self::FONTS_NAME_TYPE_OPTION_NAME ); } /** * Get fonts array form the database or generate a new list if $force is set to true * * @param bool $force * * @return array|bool|mixed */ public function get_fonts() { static $fonts = false; if ( false !== $fonts ) { return $fonts; } $fonts = $this->generate_fonts_list(); $fonts = get_option( self::FONTS_OPTION_NAME, false ); return $fonts; } /** * Enqueue fonts css * * @param $post_css */ public function enqueue_fonts( $post_css ) { $used_fonts = $post_css->get_fonts(); $font_manager_fonts = $this->get_fonts(); $font_types = $this->get_font_types(); foreach ( $used_fonts as $font_family ) { if ( ! isset( $font_types[ $font_family ] ) || in_array( $font_family, $this->enqueued_fonts ) ) { continue; } $font_type_name = $font_types[ $font_family ]; if ( 'variable' === $font_type_name ) { $font_type_name = 'custom'; } $font_type = $this->get_font_type_object( $font_type_name ); if ( ! $font_type ) { continue; } $font_data = []; if ( isset( $font_manager_fonts[ $font_family ] ) ) { $font_data = $font_manager_fonts[ $font_family ]; } $font_type->enqueue_font( $font_family, $font_data, $post_css ); $this->enqueued_fonts[] = $font_family; } } public function register_ajax_actions( Ajax $ajax ) { $ajax->register_ajax_action( 'pro_assets_manager_panel_action_data', [ $this, 'assets_manager_panel_action_data' ] ); } public function add_finder_item( array $categories ) { $categories['settings']['items']['custom-fonts'] = [ 'title' => esc_html__( 'Custom Fonts', 'elementor-pro' ), 'icon' => 'typography', 'url' => admin_url( static::MENU_SLUG ), 'keywords' => [ 'custom', 'fonts', 'elementor' ], ]; if ( ! $this->can_use_custom_fonts() ) { $lock = new Feature_Lock( [ 'type' => 'custom-font' ] ); $categories['settings']['items']['custom-fonts']['lock'] = $lock->get_config(); } return $categories; } public function admin_menu_make_open_on_subpage( $parent_file ) { if ( static::MENU_SLUG === $parent_file ) { $parent_file = Settings::PAGE_ID; } return $parent_file; } /** * Register Font Manager action and filter hooks */ protected function actions() { add_action( 'init', [ $this, 'register_post_type_and_tax' ] ); if ( is_admin() ) { add_action( 'init', [ $this, 'redirect_admin_old_page_to_new' ] ); add_action( 'elementor/admin/menu/register', function ( Admin_Menu_Manager $admin_menu_manager ) { $this->register_admin_menu( $admin_menu_manager ); } ); // TODO: BC - Remove after `Admin_Menu_Manager` will be the standard. add_action( 'admin_menu', function () { if ( did_action( 'elementor/admin/menu/register' ) ) { return; } $menu_title = _x( 'Custom Fonts', 'Elementor Font', 'elementor-pro' ); add_submenu_page( Settings::PAGE_ID, $menu_title, $menu_title, self::CAPABILITY, static::MENU_SLUG ); }, 50 ); add_action( 'admin_head', [ $this, 'clean_admin_listing_page' ] ); } // TODO: Maybe just ignore all of those when the user can't use custom fonts? add_filter( 'post_row_actions', [ $this, 'post_row_actions' ], 10, 2 ); add_filter( 'manage_' . self::CPT . '_posts_columns', [ $this, 'manage_columns' ], 100 ); add_action( 'save_post_' . self::CPT, [ $this, 'save_post_meta' ], 10, 3 ); add_action( 'save_post_' . self::CPT, [ $this, 'clear_fonts_list' ], 100 ); add_filter( 'elementor/fonts/groups', [ $this, 'register_fonts_groups' ] ); add_filter( 'elementor/fonts/additional_fonts', [ $this, 'register_fonts_in_control' ] ); add_filter( 'elementor/finder/categories', [ $this, 'add_finder_item' ] ); add_action( 'elementor/css-file/post/parse', [ $this, 'enqueue_fonts' ] ); add_action( 'elementor/css-file/global/parse', [ $this, 'enqueue_fonts' ] ); add_filter( 'post_updated_messages', [ $this, 'post_updated_messages' ] ); add_filter( 'enter_title_here', [ $this, 'update_enter_title_here' ], 10, 2 ); add_filter( 'elementor/typography/font_variables', [ $this, 'get_font_variables' ] ); add_filter( 'elementor/typography/font_variable_ranges', [ $this, 'get_font_variable_ranges' ] ); add_filter( 'parent_file', [ $this, 'admin_menu_make_open_on_subpage' ] ); // Ajax. add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_actions' ] ); /** * Elementor fonts manager loaded. * * Fires after the fonts manager was fully loaded and instantiated. * * @since 2.0.0 * * @param Fonts_Manager $this An instance of fonts manager. */ do_action( 'elementor_pro/fonts_manager_loaded', $this ); } /** * Fonts_Manager constructor. */ public function __construct() { $this->actions(); $this->add_font_type( 'custom', new Fonts\Custom_Fonts() ); $this->add_font_type( 'typekit', new Fonts\Typekit_Fonts() ); } }
Fatal error: Uncaught Error: Class 'ElementorPro\Modules\AssetsManager\AssetTypes\Fonts_Manager' not found in /var/www/html/dportilho.com.br/web/wp-content/plugins/elementor-pro/modules/assets-manager/module.php:39 Stack trace: #0 /var/www/html/dportilho.com.br/web/wp-content/plugins/elementor/core/base/module.php(85): ElementorPro\Modules\AssetsManager\Module->__construct() #1 /var/www/html/dportilho.com.br/web/wp-content/plugins/elementor-pro/core/modules-manager.php(98): Elementor\Core\Base\Module::instance() #2 /var/www/html/dportilho.com.br/web/wp-content/plugins/elementor-pro/plugin.php(403): ElementorPro\Core\Modules_Manager->__construct() #3 /var/www/html/dportilho.com.br/web/wp-includes/class-wp-hook.php(324): ElementorPro\Plugin->on_elementor_init('') #4 /var/www/html/dportilho.com.br/web/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array) #5 /var/www/html/dportilho.com.br/web/wp-includes/plugin.php(517): WP_Hook->do_action(Array) #6 /var/www/html/dportilho.com.br/web/wp-content/plugins/element in /var/www/html/dportilho.com.br/web/wp-content/plugins/elementor-pro/modules/assets-manager/module.php on line 39