plugin_basename = plugin_basename(__FILE__); $this->define( 'WPO_WCPDF_VERSION', $this->version ); // load the localisation & classes add_action( 'plugins_loaded', array( $this, 'translations' ) ); add_filter( 'load_textdomain_mofile', array( $this, 'textdomain_fallback' ), 10, 2 ); add_action( 'plugins_loaded', array( $this, 'load_classes' ), 9 ); add_action( 'in_plugin_update_message-'.$this->plugin_basename, array( $this, 'in_plugin_update_message' ) ); } /** * Define constant if not already set * @param string $name * @param string|bool $value */ private function define( $name, $value ) { if ( ! defined( $name ) ) { define( $name, $value ); } } /** * Load the translation / textdomain files * * Note: the first-loaded translation file overrides any following ones if the same translation is present */ public function translations() { if ( function_exists( 'determine_locale' ) ) { // WP5.0+ $locale = determine_locale(); } else { $locale = is_admin() && function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale(); } $locale = apply_filters( 'plugin_locale', $locale, 'woocommerce-pdf-invoices-packing-slips' ); $dir = trailingslashit( WP_LANG_DIR ); $textdomains = array( 'woocommerce-pdf-invoices-packing-slips' ); if ( $this->legacy_mode_enabled() === true ) { $textdomains[] = 'wpo_wcpdf'; } /** * Frontend/global Locale. Looks in: * * - WP_LANG_DIR/woocommerce-pdf-invoices-packing-slips/woocommerce-pdf-invoices-packing-slips-LOCALE.mo * - WP_LANG_DIR/plugins/woocommerce-pdf-invoices-packing-slips-LOCALE.mo * - woocommerce-pdf-invoices-packing-slips/languages/woocommerce-pdf-invoices-packing-slips-LOCALE.mo (which if not found falls back to:) * - WP_LANG_DIR/plugins/woocommerce-pdf-invoices-packing-slips-LOCALE.mo */ foreach ( $textdomains as $textdomain ) { unload_textdomain( $textdomain ); load_textdomain( $textdomain, $dir . 'woocommerce-pdf-invoices-packing-slips/woocommerce-pdf-invoices-packing-slips-' . $locale . '.mo' ); load_textdomain( $textdomain, $dir . 'plugins/woocommerce-pdf-invoices-packing-slips-' . $locale . '.mo' ); load_plugin_textdomain( $textdomain, false, dirname( plugin_basename(__FILE__) ) . '/languages' ); } } /** * Maintain backwards compatibility with old translation files * Uses old .mo file if it exists in any of the override locations */ public function textdomain_fallback( $mo, $textdomain ) { $plugin_domain = 'woocommerce-pdf-invoices-packing-slips'; $old_domain = 'wpo_wcpdf'; if ( $textdomain !== $plugin_domain && $textdomain !== $old_domain ) { return $mo; } $mopath = trailingslashit( dirname( $mo ) ); $mofile = basename( $mo ); if ( $textdomain == $old_domain ) { $textdomain = $plugin_domain; $mofile = str_replace( $old_domain, $textdomain, $mofile ); } if ( $textdomain === $plugin_domain ) { $old_mofile = str_replace( $textdomain, $old_domain, $mofile ); if ( file_exists( $mopath.$old_mofile ) ) { // we have an old override - use it return $mopath.$old_mofile; } // prevent loading outdated language packs $pofile = str_replace( '.mo', '.po', $mofile ); if ( file_exists( $mopath.$pofile ) ) { // load po file $podata = file_get_contents( $mopath.$pofile ); // set revision date threshold $block_before = strtotime( '2017-05-15' ); // read revision date preg_match( '~PO-Revision-Date: (.*?)\\\n~s', $podata, $matches ); if ( isset( $matches[1] ) ) { $revision_date = $matches[1]; if ( $revision_timestamp = strtotime( $revision_date ) ) { // check if revision is before threshold date if ( $revision_timestamp < $block_before ) { // try bundled $bundled_file = $this->plugin_path() . '/languages/'. $mofile; if ( file_exists( $bundled_file ) ) { return $bundled_file; } else { return ''; } // delete po & mo file if possible // @unlink($pofile); // @unlink($mofile); } } } } } return $mopath.$mofile; } /** * Load the main plugin classes and functions */ public function includes() { // WooCommerce compatibility classes include_once( $this->plugin_path() . '/includes/compatibility/abstract-wc-data-compatibility.php' ); include_once( $this->plugin_path() . '/includes/compatibility/class-wc-date-compatibility.php' ); include_once( $this->plugin_path() . '/includes/compatibility/class-wc-core-compatibility.php' ); include_once( $this->plugin_path() . '/includes/compatibility/class-wc-order-compatibility.php' ); include_once( $this->plugin_path() . '/includes/compatibility/class-wc-product-compatibility.php' ); include_once( $this->plugin_path() . '/includes/compatibility/wc-datetime-functions-compatibility.php' ); // Third party compatibility include_once( $this->plugin_path() . '/includes/compatibility/class-wcpdf-compatibility-third-party-plugins.php' ); // Plugin classes include_once( $this->plugin_path() . '/includes/wcpdf-functions.php' ); $this->settings = include_once( $this->plugin_path() . '/includes/class-wcpdf-settings.php' ); $this->documents = include_once( $this->plugin_path() . '/includes/class-wcpdf-documents.php' ); $this->main = include_once( $this->plugin_path() . '/includes/class-wcpdf-main.php' ); include_once( $this->plugin_path() . '/includes/class-wcpdf-assets.php' ); include_once( $this->plugin_path() . '/includes/class-wcpdf-admin.php' ); include_once( $this->plugin_path() . '/includes/class-wcpdf-frontend.php' ); include_once( $this->plugin_path() . '/includes/class-wcpdf-install.php' ); // Backwards compatibility with self include_once( $this->plugin_path() . '/includes/legacy/class-wcpdf-legacy.php' ); include_once( $this->plugin_path() . '/includes/legacy/class-wcpdf-legacy-deprecated-hooks.php' ); // PHP MB String fallback functions include_once( $this->plugin_path() . '/includes/compatibility/mb-string-compatibility.php' ); } /** * Instantiate classes when woocommerce is activated */ public function load_classes() { if ( $this->is_woocommerce_activated() === false ) { add_action( 'admin_notices', array ( $this, 'need_woocommerce' ) ); return; } if ( version_compare( PHP_VERSION, '5.3', '<' ) ) { add_action( 'admin_notices', array ( $this, 'required_php_version' ) ); return; } // all systems ready - GO! $this->includes(); } /** * Check if legacy mode is enabled */ public function legacy_mode_enabled() { if (!isset($this->legacy_mode)) { $debug_settings = get_option( 'wpo_wcpdf_settings_debug' ); $this->legacy_mode = isset($debug_settings['legacy_mode']); } return $this->legacy_mode; } /** * Check if woocommerce is activated */ public function is_woocommerce_activated() { $blog_plugins = get_option( 'active_plugins', array() ); $site_plugins = is_multisite() ? (array) maybe_unserialize( get_site_option('active_sitewide_plugins' ) ) : array(); if ( in_array( 'woocommerce/woocommerce.php', $blog_plugins ) || isset( $site_plugins['woocommerce/woocommerce.php'] ) ) { return true; } else { return false; } } /** * WooCommerce not active notice. * * @return string Fallack notice. */ public function need_woocommerce() { $error = sprintf( __( 'WooCommerce PDF Invoices & Packing Slips requires %sWooCommerce%s to be installed & activated!' , 'woocommerce-pdf-invoices-packing-slips' ), '', '' ); $message = '

' . $error . '

'; echo $message; } /** * PHP version requirement notice */ public function required_php_version() { $error = __( 'WooCommerce PDF Invoices & Packing Slips requires PHP 5.3 or higher (5.6 or higher recommended).', 'woocommerce-pdf-invoices-packing-slips' ); $how_to_update = __( 'How to update your PHP version', 'woocommerce-pdf-invoices-packing-slips' ); $message = sprintf('

%s

%s

', $error, 'http://docs.wpovernight.com/general/how-to-update-your-php-version/', $how_to_update); echo $message; } /** * Show plugin changes. Code adapted from W3 Total Cache. */ public function in_plugin_update_message( $args ) { $transient_name = 'wpo_wcpdf_upgrade_notice_' . $args['Version']; if ( false === ( $upgrade_notice = get_transient( $transient_name ) ) ) { $response = wp_safe_remote_get( 'https://plugins.svn.wordpress.org/woocommerce-pdf-invoices-packing-slips/trunk/readme.txt' ); if ( ! is_wp_error( $response ) && ! empty( $response['body'] ) ) { $upgrade_notice = self::parse_update_notice( $response['body'], $args['new_version'] ); set_transient( $transient_name, $upgrade_notice, DAY_IN_SECONDS ); } } echo wp_kses_post( $upgrade_notice ); } /** * Parse update notice from readme file. * * @param string $content * @param string $new_version * @return string */ private function parse_update_notice( $content, $new_version ) { // Output Upgrade Notice. $matches = null; $regexp = '~==\s*Upgrade Notice\s*==\s*=\s*(.*)\s*=(.*)(=\s*' . preg_quote( $new_version ) . '\s*=|$)~Uis'; $upgrade_notice = ''; if ( preg_match( $regexp, $content, $matches ) ) { $notices = (array) preg_split( '~[\r\n]+~', trim( $matches[2] ) ); // Convert the full version strings to minor versions. $notice_version_parts = explode( '.', trim( $matches[1] ) ); $current_version_parts = explode( '.', $this->version ); if ( 3 !== sizeof( $notice_version_parts ) ) { return; } $notice_version = $notice_version_parts[0] . '.' . $notice_version_parts[1]; $current_version = $current_version_parts[0] . '.' . $current_version_parts[1]; // Check the latest stable version and ignore trunk. if ( version_compare( $current_version, $notice_version, '<' ) ) { $upgrade_notice .= '

'; foreach ( $notices as $index => $line ) { $upgrade_notice .= preg_replace( '~\[([^\]]*)\]\(([^\)]*)\)~', '${1}', $line ); } } } return wp_kses_post( $upgrade_notice ); } /** * Get the plugin url. * @return string */ public function plugin_url() { return untrailingslashit( plugins_url( '/', __FILE__ ) ); } /** * Get the plugin path. * @return string */ public function plugin_path() { return untrailingslashit( plugin_dir_path( __FILE__ ) ); } } // class WPO_WCPDF endif; // class_exists /** * Returns the main instance of WooCommerce PDF Invoices & Packing Slips to prevent the need to use globals. * * @since 1.6 * @return WPO_WCPDF */ function WPO_WCPDF() { return WPO_WCPDF::instance(); } WPO_WCPDF(); // load plugin // legacy class for plugin detecting if ( !class_exists( 'WooCommerce_PDF_Invoices' ) ) { class WooCommerce_PDF_Invoices{ public static $version; public function __construct() { self::$version = WPO_WCPDF()->version; } } new WooCommerce_PDF_Invoices(); }