Files
2026-04-28 15:13:50 +02:00

240 lines
6.8 KiB
PHP

<?php
/**
* Main plugin orchestrator.
*
* Handles plugin bootstrap, hook registration, admin asset management,
* and initializes core components.
*
* @package Head_Footer_Code
* @since 1.4.0
*/
namespace Techwebux\Hfc;
// If this file is called directly, abort.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Main {
/** @var array Settings retrieved from the main controller. */
private static $settings = null;
/** @var Plugin_Info Plugin metadata object. */
protected $plugin;
/**
* Initializes the class and registers hooks.
*/
public function __construct() {
$this->plugin = new Plugin_Info();
Common::init( $this->plugin );
add_filter( 'safe_style_css', array( $this, 'extend_safe_css' ) );
add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
}
/**
* Checks environment compatibility during plugin activation.
*
* Aborts activation and informs the user if the server PHP version
* or WordPress version does not meet the minimum requirements.
*
* @return void
*/
public static function plugin_activation() {
$plugin = Plugin_Info::get_static_data();
$requirements = array(
'PHP' => array(
'min' => $plugin->min_php,
'current' => PHP_VERSION,
),
'WordPress' => array(
'min' => $plugin->min_wp,
'current' => $GLOBALS['wp_version'],
),
);
foreach ( $requirements as $type => $ver ) {
if ( version_compare( $ver['current'], $ver['min'], '<' ) ) {
deactivate_plugins( $plugin->file );
wp_die(
'<p>' . sprintf(
/* translators: 1: Plugin name, 2: PHP or WordPress, 3: current version, 4: minimum version */
esc_html__( '%1$s activation error: %2$s %3$s is outdated. Minimum required: %4$s.', 'head-footer-code' ),
'<strong>' . esc_html( $plugin->name ) . '</strong>',
esc_html( $type ),
esc_html( $ver['current'] ),
esc_html( $ver['min'] )
) . '</p>'
);
}
}
}
/**
* Function to load subclasses, check and update if it has to be done
*/
public function plugins_loaded() {
$settings = self::get_settings();
// Include back-end/front-end resources based on capabilities.
// https://wordpress.org/documentation/article/roles-and-capabilities/
if ( is_admin() && current_user_can( 'publish_posts' ) && Common::user_has_allowed_role() ) {
// Load Settings if the current user can manage options
if ( current_user_can( 'manage_options' ) ) {
new Settings( $this->plugin, $settings );
}
// Always load the Grid and Metabox classes for allowed roles.
new Grid( $this->plugin, $settings );
new Metabox_Article( $this->plugin, $settings );
new Metabox_Taxonomy( $this->plugin, $settings );
} elseif ( ! is_admin() ) {
// Load front-end magic.
new Front( $this->plugin, $settings );
}
// Bail if this plugin data doesn't need updating.
if ( get_option( 'auhfc_db_ver' ) >= $this->plugin->db_ver ) {
return;
}
// Lock initiated updating
if ( get_transient( 'auhfc_updating' ) ) {
return;
}
set_transient( 'auhfc_updating', true, 5 * MINUTE_IN_SECONDS );
// Require update script and trigger update function.
require_once $this->plugin->dir . '/update.php';
auhfc_update();
// Remove updating lock
delete_transient( 'auhfc_updating' );
}
/**
* Enqueue admin styles and scripts to enable code editor in plugin settings and custom column on article and taxonomy listings
*
* @param string $hook Current page hook.
*/
public function admin_enqueue_scripts( $hook ) {
// Admin Stylesheet.
if ( in_array( $hook, array( 'post.php', 'post-new.php', 'edit.php', 'edit-tags.php', 'tools_page_' . $this->plugin->slug ), true ) ) {
wp_enqueue_style(
'head-footer-code-admin',
$this->plugin->url . 'assets/css/admin.min.css',
array(),
$this->plugin->version
);
}
// Codemirror Assets.
$screen = get_current_screen();
// Prepare conditions
$is_hfc_settings = ( 'tools_page_' . $this->plugin->slug === $hook );
$is_post_edit = in_array( $hook, array( 'post.php', 'post-new.php' ), true );
$is_term_edit = ( 'term.php' === $hook && in_array( $screen->taxonomy, self::$settings['article']['taxonomies'], true ) );
if ( $is_hfc_settings || $is_post_edit || $is_term_edit ) {
// Define $cm_settings to prevent undefined variable error.
$cm_settings = array(
'codeEditor' => wp_enqueue_code_editor(
array(
'type' => 'text/html',
'codemirror' => array(
'autoRefresh' => true, // Deal with metaboxes rendering
'extraKeys' => array(
'Tab' => 'indentMore', // Enable TAB indent
),
),
)
),
);
wp_localize_script( 'code-editor', 'cm_settings', $cm_settings );
wp_enqueue_style( 'wp-codemirror' );
wp_enqueue_script( 'wp-codemirror' );
wp_enqueue_style(
'head-footer-code-edit',
$this->plugin->url . 'assets/css/edit.min.css',
array(),
$this->plugin->version
);
}
return;
}
/**
* Allow widely used style properties for KSES, eg. `display` in WP prior 7.0
* and `visibility` used in GTM noscript.
*
* @param array $styles The current array of allowed CSS properties.
* @return array Modified array of allowed CSS properties.
*/
public function extend_safe_css( $styles ) {
return array_unique( array_merge( (array) $styles, array( 'display', 'visibility' ) ) );
}
/**
* Retrieves and parses plugin settings with default fallback values.
*
* @return array {
* Array of settings.
* @type array $sitewide Site-wide settings (head, body, footer, priorities).
* @type array $homepage Homepage-specific settings.
* @type array $article Post type and role-based access settings.
* }
*/
public static function get_settings() {
// If settings are already cached, return them.
if ( null !== self::$settings ) {
return self::$settings;
}
// Define default settings.
$settings = array(
'sitewide' => array(
'head' => '',
'body' => '',
'footer' => '',
'priority_h' => 10,
'priority_b' => 10,
'priority_f' => 10,
'do_shortcode_h' => 'n',
'do_shortcode_b' => 'n',
'do_shortcode_f' => 'n',
),
'homepage' => array(
'head' => '',
'body' => '',
'footer' => '',
'behavior' => 'append',
'paged' => 'yes',
),
'article' => array(
'post_types' => array(),
'taxonomies' => array(),
'allowed_roles' => array(),
),
);
// Fetch and merge settings for each group.
foreach ( $settings as $key => $default_values ) {
$saved_settings = get_option( "auhfc_settings_{$key}", $default_values );
$settings[ $key ] = wp_parse_args( $saved_settings, $default_values );
}
// Cache the results.
self::$settings = $settings;
return $settings;
}
}