| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456 |
- <?php
- /**
- * Manages remote updates for all Beaver Builder products.
- *
- * @since 1.0
- */
- final class FLUpdater {
- /**
- * The API URL for the Beaver Builder update server.
- *
- * @since 1.0
- * @access private
- * @var string $_updates_api_url
- */
- static private $_updates_api_url = 'http://updates.wpbeaverbuilder.com/';
- /**
- * An internal array of data for each product.
- *
- * @since 1.0
- * @access private
- * @var array $_products
- */
- static private $_products = array();
- /**
- * An internal array of remote responses with
- * update data for each product.
- *
- * @since 1.8.4
- * @access private
- * @var array $_responses
- */
- static private $_responses = array();
- /**
- * An internal array of settings for the updater instance.
- *
- * @since 1.0
- * @access private
- * @var array $settings
- */
- private $settings = array();
- /**
- * Updater constructor method.
- *
- * @since 1.0
- * @param array $settings An array of settings for this instance.
- * @return void
- */
- public function __construct( $settings = array() ) {
- $this->settings = $settings;
- if ( 'plugin' == $settings['type'] ) {
- add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'update_check' ) );
- add_filter( 'plugins_api', array( $this, 'plugin_info' ), 99, 3 );
- add_action( 'in_plugin_update_message-' . self::get_plugin_file( $settings['slug'] ), array( $this, 'update_message' ), 1, 2 );
- } elseif ( 'theme' == $settings['type'] ) {
- add_filter( 'pre_set_site_transient_update_themes', array( $this, 'update_check' ) );
- }
- }
- /**
- * Get the update data response from the API.
- *
- * @since 1.7.7
- * @return object
- */
- public function get_response() {
- $slug = $this->settings['slug'];
- if ( isset( FLUpdater::$_responses[ $slug ] ) ) {
- return FLUpdater::$_responses[ $slug ];
- }
- FLUpdater::$_responses[ $slug ] = FLUpdater::api_request( FLUpdater::$_updates_api_url, array(
- 'fl-api-method' => 'update_info',
- 'license' => FLUpdater::get_subscription_license(),
- 'domain' => network_home_url(),
- 'product' => $this->settings['name'],
- 'slug' => $this->settings['slug'],
- 'version' => $this->settings['version'],
- 'php' => phpversion(),
- ) );
- return FLUpdater::$_responses[ $slug ];
- }
- /**
- * Checks to see if an update is available for the current product.
- *
- * @since 1.0
- * @param object $transient A WordPress transient object with update data.
- * @return object
- */
- public function update_check( $transient ) {
- global $pagenow;
- if ( 'plugins.php' == $pagenow && is_multisite() ) {
- return $transient;
- }
- if ( ! is_object( $transient ) ) {
- $transient = new stdClass();
- }
- if ( ! isset( $transient->checked ) ) {
- $transient->checked = array();
- }
- $response = $this->get_response();
- if ( ! isset( $response->error ) ) {
- $transient->last_checked = time();
- $transient->checked[ $this->settings['slug'] ] = $this->settings['version'];
- if ( 'plugin' == $this->settings['type'] ) {
- $plugin = self::get_plugin_file( $this->settings['slug'] );
- if ( version_compare( $response->new_version, $this->settings['version'], '>' ) ) {
- $transient->response[ $plugin ] = new stdClass();
- $transient->response[ $plugin ]->slug = $response->slug;
- $transient->response[ $plugin ]->new_version = $response->new_version;
- $transient->response[ $plugin ]->url = $response->homepage;
- $transient->response[ $plugin ]->package = $response->package;
- $transient->response[ $plugin ]->tested = $response->tested;
- $transient->response[ $plugin ]->icons = apply_filters( 'fl_updater_icon', array(
- '1x' => FL_BUILDER_URL . 'img/beaver-128.png',
- '2x' => FL_BUILDER_URL . 'img/beaver-256.png',
- 'default' => FL_BUILDER_URL . 'img/beaver-256.png',
- ), $response, $this->settings );
- if ( empty( $response->package ) ) {
- $transient->response[ $plugin ]->upgrade_notice = FLUpdater::get_update_error_message();
- }
- }
- } elseif ( 'theme' == $this->settings['type'] ) {
- if ( version_compare( $response->new_version, $this->settings['version'], '>' ) ) {
- $transient->response[ $this->settings['slug'] ] = array(
- 'new_version' => $response->new_version,
- 'url' => $response->homepage,
- 'package' => $response->package,
- 'tested' => $response->tested,
- );
- }
- }
- }
- return $transient;
- }
- /**
- * Retrives the data for the plugin info lightbox.
- *
- * @since 1.0
- * @param bool $false
- * @param string $action
- * @param object $args
- * @return object|bool
- */
- public function plugin_info( $false, $action, $args ) {
- if ( 'plugin_information' != $action ) {
- return $false;
- }
- if ( ! isset( $args->slug ) || $args->slug != $this->settings['slug'] ) {
- return $false;
- }
- $response = $this->get_response();
- if ( ! isset( $response->error ) ) {
- $info = new stdClass();
- $info->name = $this->settings['name'];
- $info->version = $response->new_version;
- $info->slug = $response->slug;
- $info->plugin_name = $response->plugin_name;
- $info->author = $response->author;
- $info->homepage = $response->homepage;
- $info->requires = $response->requires;
- $info->tested = $response->tested;
- $info->last_updated = $response->last_updated;
- $info->download_link = $response->package;
- $info->sections = (array) $response->sections;
- return apply_filters( 'fl_plugin_info_data', $info, $response );
- }
- return $false;
- }
- /**
- * Shows an update message on the plugins page if an update
- * is available but there is no active subscription.
- *
- * @since 1.0
- * @param array $plugin_data An array of data for this plugin.
- * @param object $response An object with update data for this plugin.
- * @return void
- */
- public function update_message( $plugin_data, $response ) {
- if ( empty( $response->package ) ) {
- echo FLUpdater::get_update_error_message( $plugin_data );
- }
- }
- /**
- * Static method for initializing an instance of the updater
- * for each active product.
- *
- * @since 1.0
- * @return void
- */
- static public function init() {
- include FL_UPDATER_DIR . 'includes/config.php';
- foreach ( $config as $path ) {
- if ( file_exists( $path ) ) {
- require_once $path;
- }
- }
- }
- /**
- * Static method for adding a product to the updater and
- * creating the new instance.
- *
- * @since 1.0
- * @param array $args An array of settings for the product.
- * @return void
- */
- static public function add_product( $args = array() ) {
- if ( is_array( $args ) && isset( $args['slug'] ) ) {
- if ( 'plugin' == $args['type'] ) {
- if ( file_exists( WP_CONTENT_DIR . '/plugins/' . $args['slug'] ) ) {
- self::$_products[ $args['name'] ] = $args;
- new FLUpdater( self::$_products[ $args['name'] ] );
- }
- }
- if ( 'theme' == $args['type'] ) {
- if ( file_exists( WP_CONTENT_DIR . '/themes/' . $args['slug'] ) ) {
- self::$_products[ $args['name'] ] = $args;
- new FLUpdater( self::$_products[ $args['name'] ] );
- }
- }
- }
- }
- /**
- * Static method for rendering the license form.
- *
- * @since 1.0
- * @return void
- */
- static public function render_form() {
- // Activate a subscription?
- if ( isset( $_POST['fl-updater-nonce'] ) ) {
- if ( wp_verify_nonce( $_POST['fl-updater-nonce'], 'updater-nonce' ) ) {
- self::save_subscription_license( $_POST['license'] );
- }
- }
- $license = self::get_subscription_license();
- $subscription = self::get_subscription_info();
- // Include the form ui.
- include FL_UPDATER_DIR . 'includes/form.php';
- }
- /**
- * Renders available subscriptions and downloads.
- *
- * @since 1.10
- * @param object $subscription
- * @return void
- */
- static public function render_subscriptions( $subscription ) {
- if ( isset( $subscription->error ) || ! $subscription->active || ! $subscription->domain->active || ! isset( $subscription->downloads ) ) {
- return;
- }
- if ( ! FLBuilderModel::is_white_labeled() ) {
- include FL_UPDATER_DIR . 'includes/subscriptions.php';
- }
- }
- /**
- * Static method for getting the subscription license key.
- *
- * @since 1.0
- * @return string
- */
- static public function get_subscription_license() {
- $value = get_site_option( 'fl_themes_subscription_email' );
- return $value ? $value : '';
- }
- /**
- * Static method for updating the subscription license.
- *
- * @since 1.0
- * @param string $license The new license key.
- * @return $response mixed
- */
- static public function save_subscription_license( $license ) {
- $response = FLUpdater::api_request(self::$_updates_api_url, array(
- 'fl-api-method' => 'activate_domain',
- 'license' => $license,
- 'domain' => network_home_url(),
- 'products' => json_encode( self::$_products ),
- ));
- update_site_option( 'fl_themes_subscription_email', $license );
- return $response;
- }
- /**
- * Static method for retrieving the subscription info.
- *
- * @since 1.0
- * @return bool
- */
- static public function get_subscription_info() {
- return self::api_request(self::$_updates_api_url, array(
- 'fl-api-method' => 'subscription_info',
- 'domain' => network_home_url(),
- 'license' => FLUpdater::get_subscription_license(),
- ));
- }
- /**
- * Returns an update message for if an update
- * is available but there is no active subscription.
- *
- * @since 1.6.4.3
- * @param array $plugin_data An array of data for this plugin.
- * @return string
- */
- static private function get_update_error_message( $plugin_data = null ) {
- $subscription = FLUpdater::get_subscription_info();
- $license = get_site_option( 'fl_themes_subscription_email' );
- $message = '';
- // updates-core.php
- if ( ! $plugin_data ) {
- if ( ! $license ) {
- $message = __( 'Please enter a valid license key to enable automatic updates.', 'fl-builder' );
- } else {
- $message = __( 'Please subscribe to enable automatic updates for this plugin.', 'fl-builder' );
- }
- } else { // plugins.php
- if ( ! $license ) {
- $link = sprintf( '<a href="%s" target="_blank" style="color: #fff; text-decoration: underline;">%s »</a>', admin_url( '/options-general.php?page=fl-builder-settings#license' ), __( 'Enter License Key', 'fl-builder' ) );
- $text = sprintf( __( 'Please enter a valid license key to enable automatic updates. %s', 'fl-builder' ), $link );
- } else {
- $link = sprintf( '<a href="%s" target="_blank" style="color: #fff; text-decoration: underline;">%s »</a>', $plugin_data['PluginURI'], __( 'Subscribe Now', 'fl-builder' ) );
- $text = sprintf( __( 'Please subscribe to enable automatic updates for this plugin. %s', 'fl-builder' ), $link );
- }
- $message .= '<span style="display:block;padding:10px 20px;margin:10px 0; background: #d54e21; color: #fff;">';
- $message .= __( '<strong>UPDATE UNAVAILABLE!</strong>', 'fl-builder' );
- $message .= ' ';
- $message .= $text;
- $message .= '</span>';
- }
- return $message;
- }
- /**
- * Static method for retrieving the plugin file path for a
- * product relative to the plugins directory.
- *
- * @since 1.0
- * @access private
- * @param string $slug The product slug.
- * @return string
- */
- static private function get_plugin_file( $slug ) {
- if ( 'bb-plugin' == $slug ) {
- $file = $slug . '/fl-builder.php';
- } else {
- $file = $slug . '/' . $slug . '.php';
- }
- return $file;
- }
- /**
- * Static method for sending a request to the store
- * or update API.
- *
- * @since 1.0
- * @access private
- * @param string $api_url The API URL to use.
- * @param array $args An array of args to send along with the request.
- * @return mixed The response or false if there is an error.
- */
- static private function api_request( $api_url = false, $args = array() ) {
- if ( $api_url ) {
- $params = array();
- foreach ( $args as $key => $val ) {
- $params[] = $key . '=' . urlencode( $val );
- }
- return self::remote_get( $api_url . '?' . implode( '&', $params ) );
- }
- return false;
- }
- /**
- * Get a remote response.
- *
- * @since 1.0
- * @access private
- * @param string $url The URL to get.
- * @return mixed The response or false if there is an error.
- */
- static private function remote_get( $url ) {
- $request = wp_remote_get( $url );
- $error = new stdClass();
- $error->error = 'connection';
- if ( is_wp_error( $request ) ) {
- return $error;
- }
- if ( wp_remote_retrieve_response_code( $request ) != 200 ) {
- return $error;
- }
- $body = wp_remote_retrieve_body( $request );
- if ( is_wp_error( $body ) ) {
- return $error;
- }
- $body_decoded = json_decode( $body );
- if ( ! is_object( $body_decoded ) ) {
- return $error;
- }
- return $body_decoded;
- }
- }
|