관리-도구
편집 파일: class-kkart-plugin-updates.php
<?php /** * Class for displaying plugin warning notifications and determining 3rd party plugin compatibility. * * @package Kkart\Admin * @version 3.2.0 */ use Automattic\Jetpack\Constants; if ( ! defined( 'ABSPATH' ) ) { exit; } /** * KKART_Admin_Plugin_Updates Class. */ class KKART_Plugin_Updates { /** * This is the header used by extensions to show requirements. * * @var string */ const VERSION_REQUIRED_HEADER = 'KKART requires at least'; /** * This is the header used by extensions to show testing. * * @var string */ const VERSION_TESTED_HEADER = 'KKART tested up to'; /** * The version for the update to Kkart. * * @var string */ protected $new_version = ''; /** * Array of plugins lacking testing with the major version. * * @var array */ protected $major_untested_plugins = array(); /** * Common JS for initializing and managing thickbox-based modals. */ protected function generic_modal_js() { ?> <script> ( function( $ ) { // Initialize thickbox. tb_init( '.kkart-thickbox' ); var old_tb_position = false; // Make the KKART thickboxes look good when opened. $( '.kkart-thickbox' ).on( 'click', function( evt ) { var $overlay = $( '#TB_overlay' ); if ( ! $overlay.length ) { $( 'body' ).append( '<div id="TB_overlay"></div><div id="TB_window" class="kkart_untested_extensions_modal_container"></div>' ); } else { $( '#TB_window' ).removeClass( 'thickbox-loading' ).addClass( 'kkart_untested_extensions_modal_container' ); } // WP overrides the tb_position function. We need to use a different tb_position function than that one. // This is based on the original tb_position. if ( ! old_tb_position ) { old_tb_position = tb_position; } tb_position = function() { $( '#TB_window' ).css( { marginLeft: '-' + parseInt( ( TB_WIDTH / 2 ), 10 ) + 'px', width: TB_WIDTH + 'px' } ); $( '#TB_window' ).css( { marginTop: '-' + parseInt( ( TB_HEIGHT / 2 ), 10 ) + 'px' } ); }; }); // Reset tb_position to WP default when modal is closed. $( 'body' ).on( 'thickbox:removed', function() { if ( old_tb_position ) { tb_position = old_tb_position; } }); })( jQuery ); </script> <?php } /* |-------------------------------------------------------------------------- | Message Helpers |-------------------------------------------------------------------------- | | Methods for getting messages. */ /** * Get the inline warning notice for major version updates. * * @return string */ protected function get_extensions_inline_warning_major() { $upgrade_type = 'major'; $plugins = $this->major_untested_plugins; $version_parts = explode( '.', $this->new_version ); $new_version = $version_parts[0] . '.0'; if ( empty( $plugins ) ) { return; } /* translators: %s: version number */ $message = sprintf( __( "<strong>Heads up!</strong> The versions of the following plugins you're running haven't been tested with Kkart %s. Please update them or confirm compatibility before updating Kkart, or you may experience issues:", 'kkart' ), $new_version ); ob_start(); include __DIR__ . '/views/html-notice-untested-extensions-inline.php'; return ob_get_clean(); } /** * Get the warning notice for the modal window. * * @return string */ protected function get_extensions_modal_warning() { $version_parts = explode( '.', $this->new_version ); $new_version = $version_parts[0] . '.0'; $plugins = $this->major_untested_plugins; ob_start(); include __DIR__ . '/views/html-notice-untested-extensions-modal.php'; return ob_get_clean(); } /* |-------------------------------------------------------------------------- | Data Helpers |-------------------------------------------------------------------------- | | Methods for getting & manipulating data. */ /** * Get installed plugins that have a tested version lower than the input version. * * In case of testing major version compatibility and if current KKART version is >= major version part * of the $new_version, no plugins are returned, even if they don't explicitly declare compatibility * with the $new_version. * * @param string $new_version Kkart version to test against. * @param string $release 'major' or 'minor'. * @return array of plugin info arrays */ public function get_untested_plugins( $new_version, $release ) { $extensions = array_merge( $this->get_plugins_with_header( self::VERSION_TESTED_HEADER ), $this->get_plugins_for_kkart() ); $untested = array(); $new_version_parts = explode( '.', $new_version ); $version = $new_version_parts[0]; if ( 'minor' === $release ) { $version .= '.' . $new_version_parts[1]; } foreach ( $extensions as $file => $plugin ) { if ( ! empty( $plugin[ self::VERSION_TESTED_HEADER ] ) ) { $plugin_version_parts = explode( '.', $plugin[ self::VERSION_TESTED_HEADER ] ); if ( ! is_numeric( $plugin_version_parts[0] ) || ( 'minor' === $release && ! isset( $plugin_version_parts[1] ) ) || ( 'minor' === $release && ! is_numeric( $plugin_version_parts[1] ) ) ) { continue; } $plugin_version = $plugin_version_parts[0]; if ( 'minor' === $release ) { $plugin_version .= '.' . $plugin_version_parts[1]; } if ( version_compare( $plugin_version, $version, '<' ) ) { $untested[ $file ] = $plugin; } } else { $plugin[ self::VERSION_TESTED_HEADER ] = __( 'unknown', 'kkart' ); $untested[ $file ] = $plugin; } } return $untested; } /** * Get plugins that have a valid value for a specific header. * * @param string $header Plugin header to search for. * @return array Array of plugins that contain the searched header. */ protected function get_plugins_with_header( $header ) { $plugins = get_plugins(); $matches = array(); foreach ( $plugins as $file => $plugin ) { if ( ! empty( $plugin[ $header ] ) ) { $matches[ $file ] = $plugin; } } return apply_filters( 'kkart_get_plugins_with_header', $matches, $header, $plugins ); } /** * Get plugins which "maybe" are for Kkart. * * @return array of plugin info arrays */ protected function get_plugins_for_kkart() { $plugins = get_plugins(); $matches = array(); foreach ( $plugins as $file => $plugin ) { if ( 'Kkart' !== $plugin['Name'] && ( stristr( $plugin['Name'], 'kkart' ) || stristr( $plugin['Description'], 'kkart' ) ) ) { $matches[ $file ] = $plugin; } } return apply_filters( 'kkart_get_plugins_for_kkart', $matches, $plugins ); } }