From 0d1e0d75bb6f57cfdfbdc27d56ed5b467aff2e15 Mon Sep 17 00:00:00 2001 From: Rumperuu Date: Mon, 26 Apr 2021 11:46:30 +0100 Subject: [PATCH] refactor: clear up Plugin init, add activator/deactivator hooks --- src/footnotes.php | 81 +++- src/includes/class-footnotes-activator.php | 33 ++ src/includes/class-footnotes-deactivator.php | 33 ++ src/includes/class-footnotes.php | 471 +++++++++++++++++++ 4 files changed, 595 insertions(+), 23 deletions(-) create mode 100644 src/includes/class-footnotes-activator.php create mode 100644 src/includes/class-footnotes-deactivator.php create mode 100644 src/includes/class-footnotes.php diff --git a/src/footnotes.php b/src/footnotes.php index e00e390..f208a09 100755 --- a/src/footnotes.php +++ b/src/footnotes.php @@ -1,9 +1,15 @@ run(); -// Requires the core Plugin file. -require_once dirname( __FILE__ ) . '/class/init.php'; - -// Add links to the ‘Installed Plugins’ page on the WordPress dashboard. -add_filter( 'plugin_action_links_' . PLUGIN_ENTRYPOINT, array( 'Footnotes_Hooks', 'get_plugin_links' ), 10, 2 ); - -// Initialize the Plugin. -$g_obj_mci_footnotes = new Footnotes(); -// Run the Plugin. -$g_obj_mci_footnotes->run(); + // Add the links to the dashboard plugins page. + // TODO: Move this somewhere more appropriate. + add_filter( "plugin_action_links_footnotes/footnotes.php", array( 'Footnotes_Hooks', 'get_plugin_links' ), 10, 2 ); +} +run_footnotes(); diff --git a/src/includes/class-footnotes-activator.php b/src/includes/class-footnotes-activator.php new file mode 100644 index 0000000..0ff3f4b --- /dev/null +++ b/src/includes/class-footnotes-activator.php @@ -0,0 +1,33 @@ +initialize_dashboard(); + // Initialize the Plugin Task. + $this->initialize_task(); + + // Register all Public Stylesheets and Scripts. + add_action( 'init', array( $this, 'register_public' ) ); + // Enqueue all Public Stylesheets and Scripts. + add_action( 'wp_enqueue_scripts', array( $this, 'register_public' ) ); + // Register all Widgets of the Plugin.. + add_action( 'widgets_init', array( $this, 'initialize_widgets' ) ); + } + + /** + * Initializes all Widgets of the Plugin. + * + * @since 1.5.0 + * + * - Update: Fix for deprecated PHP function create_function(), thanks to @psykonevro @daliasued bug reports, thanks to @felipelavinz code contribution + * + * @since 1.6.5 + * + * @contributor @felipelavinz + * @link https://github.com/media-competence-institute/footnotes/commit/87173d2980c7ff90e12ffee94ca7153e11163793 + * + * @reporter @psykonevro + * @link https://wordpress.org/support/topic/bug-function-create_function-is-deprecated/ + * @link https://wordpress.org/support/topic/deprecated-function-create_function-14/ + * + * @reporter @daliasued + * @link https://wordpress.org/support/topic/deprecated-function-create_function-14/#post-13312853 + * + * create_function() was deprecated in PHP 7.2.0 and removed in PHP 8.0.0. + * @link https://www.php.net/manual/en/function.create-function.php + * + * The fix is to move add_action() above into run(), + * and use the bare register_widget() here. + * @see self::run() + * + * Also, the visibility of initialize_widgets() is not private any longer. + */ + public function initialize_widgets() { + register_widget( 'Footnotes_Widget_Reference_Container' ); + } + + /** + * Initializes the Dashboard of the Plugin and loads them. + * + * @since 1.5.0 + */ + private function initialize_dashboard() { + new Footnotes_Layout_Init(); + } + + /** + * Initializes the Plugin Task and registers the Task hooks. + * + * @since 1.5.0 + */ + private function initialize_task() { + $this->a_obj_task = new Footnotes_Task(); + $this->a_obj_task->register_hooks(); + } + + /** + * Registers and enqueues scripts and stylesheets to the public pages. + * + * @since 1.5.0 + * + * @since 2.0.0 Update: Tooltips: fix disabling bug by loading jQuery UI library, thanks to @rajinderverma @ericcorbett2 @honlapdavid @mmallett bug reports, thanks to @vonpiernik code contribution. + * @since 2.0.3 add versioning of public.css for cache busting + * @since 2.0.4 add jQuery UI from WordPress + * @since 2.1.4 automate passing version number for cache busting + * @since 2.1.4 optionally enqueue an extra stylesheet + */ + public function register_public() { + + /** + * Enqueues external scripts. + * + * - Bugfix: Libraries: optimize processes by loading external and internal scripts only if needed, thanks to @docteurfitness issue report. + * + * @since 2.5.5 + * @reporter @docteurfitness + * @link https://wordpress.org/support/topic/simply-speed-optimisation/ + * + * The condition about tooltips was missing, only the not-alternative-tooltips part was present. + */ + // Set conditions re-used for stylesheet enqueuing and in class/task.php. + self::$a_bool_amp_enabled = Footnotes_Convert::to_bool( Footnotes_Settings::instance()->get( Footnotes_Settings::C_STR_FOOTNOTES_AMP_COMPATIBILITY_ENABLE ) ); + self::$a_bool_tooltips_enabled = Footnotes_Convert::to_bool( Footnotes_Settings::instance()->get( Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ENABLED ) ); + self::$a_bool_alternative_tooltips_enabled = Footnotes_Convert::to_bool( Footnotes_Settings::instance()->get( Footnotes_Settings::C_STR_FOOTNOTES_MOUSE_OVER_BOX_ALTERNATIVE ) ); + self::$a_str_script_mode = Footnotes_Settings::instance()->get( Footnotes_Settings::C_STR_FOOTNOTES_REFERENCE_CONTAINER_SCRIPT_MODE ); + + /** + * Enqueues the jQuery library registered by WordPress. + * + * - Bugfix: Reference container: optional alternative expanding and collapsing without jQuery for use with hard links, thanks to @hopper87it @pkverma99 issue reports. + * + * @since 2.5.6 + * + * @reporter @hopper87it + * @link https://wordpress.org/support/topic/footnotes-wp-rocket/ + * + * jQuery is also used for animated scrolling, so it was loaded by default. + * The function wp_enqueue_script() avoids loading the same library multiple times. + * After adding the alternative reference container, jQuery has become optional, + * but still enabled by default. + */ + if ( ! self::$a_bool_amp_enabled ) { + + if ( 'jquery' === self::$a_str_script_mode || ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) ) { + + wp_enqueue_script( 'jquery' ); + + } + + if ( self::$a_bool_tooltips_enabled && ! self::$a_bool_alternative_tooltips_enabled ) { + + /** + * Enqueues the jQuery Tools library shipped with the plugin. + * + * Redacted jQuery.browser, completed minification; + * see full header in js/jquery.tools.js. + * + * Add versioning. + * + * @since 2.1.2 + * + * No '-js' in the handle, is appended automatically. + * + * Deferring to the footer breaks jQuery tooltip display. + */ + wp_enqueue_script( + 'mci-footnotes-jquery-tools', + plugins_url( 'footnotes/public/js/jquery.tools.min.js' ), + array(), + '1.2.7.redacted.2', + false + ); + + /** + * Enqueues some jQuery UI libraries registered by WordPress. + * + * - Update: Tooltips: fix disabling bug by loading jQuery UI library, thanks to @rajinderverma @ericcorbett2 @honlapdavid @mmallett bug reports, thanks to @vonpiernik code contribution. + * + * @since 2.0.0 + * + * @reporter @rajinderverma + * @link https://wordpress.org/support/topic/tooltip-hover-not-showing/ + * + * @reporter @ericcorbett2 + * @link https://wordpress.org/support/topic/tooltip-hover-not-showing/#post-13324142 + * + * @reporter @honlapdavid + * @link https://wordpress.org/support/topic/tooltip-hover-not-showing/#post-13355421 + * + * @reporter @mmallett + * @link https://wordpress.org/support/topic/tooltip-hover-not-showing/#post-13445437 + * + * Fetch jQuery UI from cdnjs.cloudflare.com. + * @since 2.0.0 + * @contributor @vonpiernik + * @link https://wordpress.org/support/topic/tooltip-hover-not-showing/#post-13456762 + * + * jQueryUI re-enables the tooltip infobox disabled when WPv5.5 was released. * @since 2.1.2 + * + * - Update: Libraries: Load jQuery UI from WordPress, thanks to @check2020de issue report. + * + * @since 2.0.4 + * @reporter @check2020de + * @link https://wordpress.org/support/topic/gdpr-issue-with-jquery/ + * @link https://wordpress.stackexchange.com/questions/273986/correct-way-to-enqueue-jquery-ui + * + * If alternative tooltips are enabled, these libraries are not needed. + */ + wp_enqueue_script( 'jquery-ui-core' ); + wp_enqueue_script( 'jquery-ui-widget' ); + wp_enqueue_script( 'jquery-ui-position' ); + wp_enqueue_script( 'jquery-ui-tooltip' ); + + } + } + + /** + * Enables enqueuing a new-scheme stylesheet. + * + * @since 2.5.5 + * + * Enables enqueuing the formatted individual stylesheets if false. + * WARNING: This facility is designed for development and must NOT be used in production. + * + * The Boolean may be set at the bottom of the plugin’s main PHP file. + * @see footnotes.php + */ + if ( PRODUCTION_ENV ) { + + /** + * Enqueues a minified united external stylesheet in production. + * + * - Update: Stylesheets: increase speed and energy efficiency by tailoring stylesheets to the needs of the instance, thanks to @docteurfitness design contribution. + * - Bugfix: Stylesheets: minify to shrink the carbon footprint, increase speed and implement best practice, thanks to @docteurfitness issue report. + * + * @since 2.5.5 + * + * @contributor @docteurfitness + * @link https://wordpress.org/support/topic/simply-speed-optimisation/ + * + * @reporter @docteurfitness + * @link https://wordpress.org/support/topic/simply-speed-optimisation/ + * + * The dashboard stylesheet is minified as-is. + * @see class/dashboard/layout.php + * + * @since 2.0.3 add versioning of public.css for cache busting. + * Plugin version number is needed for busting browser caches after each plugin update. + * + * @since 2.1.4 automate passing version number for cache busting. + * The constant C_STR_FOOTNOTES_VERSION is defined at start of footnotes.php. + * + * The media scope argument 'all' is the default. + * No need to use '-css' in the handle, as this is appended automatically. + */ + // Set tooltip mode for use in stylesheet name. + if ( self::$a_bool_tooltips_enabled ) { + + if ( self::$a_bool_amp_enabled ) { + $l_str_tooltip_mode_short = 'ampt'; + $l_str_tooltip_mode_long = 'amp-tooltips'; + + } elseif ( self::$a_bool_alternative_tooltips_enabled ) { + $l_str_tooltip_mode_short = 'altt'; + $l_str_tooltip_mode_long = 'alternative-tooltips'; + + } else { + $l_str_tooltip_mode_short = 'jqtt'; + $l_str_tooltip_mode_long = 'jquery-tooltips'; + + } + } else { + $l_str_tooltip_mode_short = 'nott'; + $l_str_tooltip_mode_long = 'no-tooltips'; + } + + // Set basic responsive page layout mode for use in stylesheet name. + $l_str_page_layout_option = Footnotes_Settings::instance()->get( Footnotes_Settings::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT ); + switch ( $l_str_page_layout_option ) { + case 'reference-container': + $l_str_layout_mode = '1'; + break; + case 'entry-content': + $l_str_layout_mode = '2'; + break; + case 'main-content': + $l_str_layout_mode = '3'; + break; + case 'none': + default: + $l_str_layout_mode = '0'; + break; + } + + // Enqueue the tailored united minified stylesheet. + wp_enqueue_style( + 'mci-footnotes-' . $l_str_tooltip_mode_long . '-pagelayout-' . $l_str_page_layout_option, + plugins_url( + Footnotes_Config::C_STR_PLUGIN_NAME . '/css/footnotes-' . $l_str_tooltip_mode_short . 'brpl' . $l_str_layout_mode . '.min.css' + ), + array(), + C_STR_FOOTNOTES_VERSION, + 'all' + ); + + } else { + + /** + * Enqueues external stylesheets, ONLY in development now. + * + * @since 2.1.4 optionally enqueue an extra stylesheet. + * + * This optional layout fix is useful by lack of layout support. + */ + wp_enqueue_style( + 'mci-footnotes-common', + plugins_url( Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-common.css' ), + array(), + filemtime( + plugin_dir_path( + dirname( __FILE__, 1 ) + ) . 'css/dev-common.css' + ) + ); + wp_enqueue_style( + 'mci-footnotes-tooltips', + plugins_url( Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-tooltips.css' ), + array(), + filemtime( + plugin_dir_path( + dirname( __FILE__, 1 ) + ) . 'css/dev-tooltips.css' + ) + ); + + if ( self::$a_bool_amp_enabled ) { + wp_enqueue_style( + 'mci-footnotes-amp', + plugins_url( Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-amp-tooltips.css' ), + array(), + filemtime( + plugin_dir_path( + dirname( __FILE__, 1 ) + ) . 'css/dev-amp-tooltips.css' + ) + ); + } + + if ( self::$a_bool_alternative_tooltips_enabled ) { + wp_enqueue_style( + 'mci-footnotes-alternative', + plugins_url( Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-tooltips-alternative.css' ), + array(), + filemtime( + plugin_dir_path( + dirname( __FILE__, 1 ) + ) . 'css/dev-tooltips-alternative.css' + ) + ); + } + + $l_str_page_layout_option = Footnotes_Settings::instance()->get( Footnotes_Settings::C_STR_FOOTNOTES_PAGE_LAYOUT_SUPPORT ); + if ( 'none' !== $l_str_page_layout_option ) { + wp_enqueue_style( + 'mci-footnotes-layout-' . $l_str_page_layout_option, + plugins_url( + Footnotes_Config::C_STR_PLUGIN_NAME . '/css/dev-layout-' . $l_str_page_layout_option . '.css' + ), + array(), + filemtime( + plugin_dir_path( + dirname( __FILE__, 1 ) + ) . 'css/dev-layout-' . $l_str_page_layout_option . '.css' + ), + 'all' + ); + } + } + } +}