Newer
Older
wordpress-ojs-pugin / includes / class-plugin.php
<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class WP_OJS_SSO_Plugin {

    private static $instance = null;

    public static function instance() {
        if ( null === self::$instance ) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct() {
        $this->load_dependencies();
        add_action( 'plugins_loaded', [ $this, 'init' ] );
    }

    private function load_dependencies() {
        require_once WP_OJS_SSO_DIR . 'includes/class-settings.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-user-meta.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-subscription-fields.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-user-subscription-media.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-file-upload.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-registration.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-profile.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-oidc-bridge.php';
        require_once WP_OJS_SSO_DIR . 'includes/class-oidc-server-it-locale.php';
    }

    public function init() {
        load_plugin_textdomain( 'wp-ojs-sso-bridge', false, dirname( WP_OJS_SSO_BASENAME ) . '/languages' );
        self::maybe_load_translations_from_po();

        WP_OJS_SSO_OIDC_Server_It_Locale::init();

        WP_OJS_SSO_Settings::instance();
        WP_OJS_SSO_User_Meta::instance();
        WP_OJS_SSO_Subscription_Fields::instance();
        WP_OJS_SSO_File_Upload::instance();
        WP_OJS_SSO_Registration::instance();
        WP_OJS_SSO_Profile::instance();
        WP_OJS_SSO_OIDC_Bridge::instance();

        add_action( 'delete_user', [ 'WP_OJS_SSO_Subscription_Media', 'on_delete_user' ] );

        add_action( 'admin_notices', [ $this, 'dependency_notice' ] );
    }

    /**
     * WordPress only loads .mo files; without a compiled catalog, strings stay in English.
     * For Italian locales, load the shipped .po via core POMO when no .mo is present.
     */
    private static function maybe_load_translations_from_po() {
        if ( 0 !== strpos( get_locale(), 'it' ) ) {
            return;
        }
        if ( is_textdomain_loaded( 'wp-ojs-sso-bridge' ) ) {
            return;
        }
        $pofile = WP_OJS_SSO_DIR . 'languages/wp-ojs-sso-bridge-it_IT.po';
        if ( ! is_readable( $pofile ) ) {
            return;
        }
        require_once ABSPATH . 'wp-includes/pomo/po.php';
        $po = new PO();
        if ( ! $po->import_from_file( $pofile ) ) {
            return;
        }
        $GLOBALS['l10n']['wp-ojs-sso-bridge'] = $po;
    }

    public function dependency_notice() {
        if ( ! is_plugin_active( 'openid-connect-server/openid-connect-server.php' ) ) {
            printf(
                '<div class="notice notice-warning"><p>%s</p></div>',
                esc_html__( 'WP OJS SSO Bridge requires the "OpenID Connect Server" plugin by Automattic for SSO functionality.', 'wp-ojs-sso-bridge' )
            );
        }
    }

    public static function get_option( $key = null, $default = null ) {
        $opts = get_option( 'wp_ojs_sso_bridge_settings', [] );
        if ( null === $key ) {
            return $opts;
        }
        return $opts[ $key ] ?? $default;
    }

    public static function activate() {
        flush_rewrite_rules();
        $upload_dir = wp_upload_dir();
        $plugin_upload = $upload_dir['basedir'] . '/ojs-sso-bridge';
        if ( ! is_dir( $plugin_upload ) ) {
            wp_mkdir_p( $plugin_upload );
            file_put_contents( $plugin_upload . '/.htaccess', "Require all denied\n" );
            file_put_contents( $plugin_upload . '/index.php', "<?php\n// Silence is golden.\n" );
        }
    }

    public static function deactivate() {
        wp_clear_scheduled_hook( 'wp_ojs_sso_cleanup' );
        flush_rewrite_rules();
    }
}