patcher = $patcher;
// If the product is bundled, early exit.
$is_bundled = $this->patcher->is_bundled();
if ( $is_bundled ) {
return;
}
// Get the patches when we're in the patcher page.
$args = $this->patcher->get_args();
if ( isset( $args['is_patcher_page'] ) && true === $args['is_patcher_page'] ) {
$this->patches = Fusion_Patcher_Client::get_patches( $this->patcher->get_args() );
}
// Add menu page.
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
// Call register settings function.
add_action( 'admin_init', array( $this, 'settings' ) );
add_action( 'admin_init', array( $this, 'init' ), 999 );
add_filter( 'whitelist_options', array( $this, 'whitelist_options' ) );
add_filter( 'custom_menu_order', array( $this, 'reorder_submenus' ) );
}
/**
* Additional actions.
*
* @access public
* @since 1.0.0
*/
public function init() {
$is_patcher_page = $this->patcher->get_args( 'is_patcher_page' );
if ( null === $is_patcher_page || false === $is_patcher_page ) {
return;
}
// Set the $patches property.
$bundles = $this->patcher->get_args( 'bundled' );
if ( ! $bundles ) {
$bundles = array();
}
foreach ( $bundles as $bundle ) {
$instance = $this->patcher->get_instance( $bundle );
if ( is_object( $instance ) ) {
$bundle_patches = Fusion_Patcher_Client::get_patches( $instance->get_args() );
foreach ( $bundle_patches as $key => $value ) {
if ( ! isset( $this->patches[ $key ] ) ) {
$this->patches[ $key ] = $value;
}
}
}
}
// Add the patcher to the support screen.
add_action( 'fusion_admin_pages_patcher', array( $this, 'form' ) );
}
/**
* Adds a submenu page.
*
* @access public
* @since 1.0.0
*/
public function admin_menu() {
if ( isset( self::$menu_added[ $this->patcher->get_args( 'context' ) ] ) && self::$menu_added[ $this->patcher->get_args( 'context' ) ] ) {
return;
}
add_submenu_page(
$this->patcher->get_args( 'parent_slug' ),
$this->patcher->get_args( 'page_title' ),
$this->patcher->get_args( 'menu_title' ),
'manage_options',
$this->patcher->get_args( 'context' ) . '-fusion-patcher',
array( $this, 'admin_page' )
);
self::$menu_added[ $this->patcher->get_args( 'context' ) ] = true;
}
/**
* Reorders the Avada/FB submenu page.
*
* @access public
* @since 1.0.0
*/
public function reorder_submenus() {
global $submenu;
if ( isset( $submenu['avada'] ) && isset( $submenu['avada'][8] ) ) {
$theme_options_entry = $submenu['avada'][7];
$patcher_entry = $submenu['avada'][8];
$submenu['avada'][7] = $patcher_entry;
$submenu['avada'][8] = $theme_options_entry;
}
}
/**
* The admin-page contents.
*
* @access public
* @since 1.0.0
*/
public function admin_page() {
?>
manually_applied_patches();
?>
footer_content();
?>
patches ) ) {
return;
}
// Register settings for the patch contents.
foreach ( $this->patches as $key => $value ) {
register_setting( 'fusion_patcher_' . $key, 'fusion_patch_contents_' . $key );
}
}
/**
* The page contents.
*
* @access public
* @return void
*/
public function form() {
if ( isset( self::$printed_forms[ $this->patcher->get_args( 'context' ) ] ) ) {
return;
}
// Determine if there are available patches, and build an array of them.
$available_patches = array();
foreach ( $this->patches as $patch_id => $patch_args ) {
if ( ! isset( $patch_args['patch'] ) ) {
continue;
}
foreach ( $patch_args['patch'] as $key => $unique_patch_args ) {
// Make sure the context is right.
if ( $this->patcher->get_args( 'context' ) === $unique_patch_args['context'] ) {
// Make sure the version is right.
if ( $this->patcher->get_args( 'version' ) === $unique_patch_args['version'] ) {
$available_patches[] = $patch_id;
$context[ $this->patcher->get_args( 'context' ) ] = true;
}
}
// Check for bundled products.
$bundles = $this->patcher->get_args( 'bundled' );
if ( ! $bundles ) {
$bundles = array();
}
foreach ( $bundles as $bundle ) {
$instance = $this->patcher->get_instance( $bundle );
if ( is_object( $instance ) ) {
// Make sure the context is right.
if ( $instance->get_args( 'context' ) === $unique_patch_args['context'] ) {
// Make sure the version is right.
if ( $instance->get_args( 'version' ) === $unique_patch_args['version'] ) {
$available_patches[] = $patch_id;
$context[ $instance->get_args( 'context' ) ] = true;
}
}
}
}
}
}
// Make sure we have a unique array.
$available_patches = array_unique( $available_patches );
// Sort the array by value and re-index the keys.
sort( $available_patches );
// Get an array of the already applied patches.
$applied_patches = get_site_option( 'fusion_applied_patches', array() );
// Get an array of patches that failed to be applied.
$failed_patches = get_site_option( 'fusion_failed_patches', array() );
// Get the array of messages to display.
$messages = Fusion_Patcher_Admin_Notices::get_messages();
?>
patcher->get_args( 'name' ) ), esc_attr( $this->patcher->get_args( 'version' ) ) ); ?>
patcher->get_args( 'name' ) ), esc_attr( $this->patcher->get_args( 'version' ) ) ); ?>
$message ) : ?>
|
|
|
|
|
$patch_id ) : ?>
patches ) ) {
continue;
}
// Get the patch arguments.
$patch_args = $this->patches[ $patch_id ];
// Has the patch been applied?
$patch_applied = ( in_array( $patch_id, $applied_patches, true ) );
// Has the patch failed?
$patch_failed = ( in_array( $patch_id, $failed_patches, true ) );
// If there is no previous patch, we can apply it.
if ( ! isset( $available_patches[ $key - 1 ] ) ) {
$can_apply = true;
}
// If the previous patch exists and has already been applied,
// then we can apply this one.
if ( isset( $available_patches[ $key - 1 ] ) ) {
if ( in_array( $available_patches[ $key - 1 ], $applied_patches, true ) ) {
$can_apply = true;
}
}
?>
|
#
|
|
|
|
|
|
patcher->get_args( 'context' ) ] = true;
// Delete some messages.
Fusion_Patcher_Admin_Notices::remove_messages_option();
}
/**
* Format the patch.
* We're encoding everything here for security reasons.
* We're also going to check the current versions of Avada & Fusion-Core,
* and then build the hash for this patch using the files that are needed.
*
* @since 4.0.0
* @access private
* @param array $patch The patch array.
* @return string
*/
private function format_patch( $patch ) {
$patches = array();
if ( ! isset( $patch['patch'] ) ) {
return;
}
foreach ( $patch['patch'] as $key => $args ) {
if ( ! isset( $args['context'] ) || ! isset( $args['path'] ) || ! isset( $args['reference'] ) ) {
continue;
}
$valid_contexts = array();
$valid_contexts[] = $this->patcher->get_args( 'context' );
$bundled = $this->patcher->get_args( 'bundled' );
if ( ! empty( $bundled ) ) {
foreach ( $bundled as $product ) {
$valid_contexts[] = $product;
}
}
foreach ( $valid_contexts as $context ) {
if ( $context === $args['context'] ) {
$patcher_instance = $this->patcher->get_instance( $context );
if ( null === $patcher_instance ) {
continue;
}
$v1 = Fusion_Helper::normalize_version( $patcher_instance->get_args( 'version' ) );
$v2 = Fusion_Helper::normalize_version( $args['version'] );
if ( version_compare( $v1, $v2, '==' ) ) {
$patches[ $context ][ $args['path'] ] = $args['reference'];
}
}
}
}
return base64_encode( wp_json_encode( $patches ) );
}
/**
* Make sure manually applied patches show as successful.
*
* @access private
* @since 5.0.3
*/
private function manually_applied_patches() {
$manual_patches_found = '';
if ( isset( $_GET['manually-applied-patch'] ) ) {
$manual_patches_found = sanitize_text_field( wp_unslash( $_GET['manually-applied-patch'] ) );
}
if ( defined( 'FUSION_MANUALLY_APPLIED_PATCHES' ) ) {
$manual_patches_found = FUSION_MANUALLY_APPLIED_PATCHES . ',' . $manual_patches_found;
}
if ( empty( $manual_patches_found ) ) {
return;
}
$messages_option = get_site_option( Fusion_Patcher_Admin_Notices::$option_name );
$manual_patches = explode( ',', $manual_patches_found );
$applied_patches = get_site_option( 'fusion_applied_patches', array() );
$failed_patches = get_site_option( 'fusion_failed_patches', array() );
foreach ( $manual_patches as $patch ) {
$patch = (int) trim( $patch );
// Update the applied-patches option.
if ( ! in_array( $patch, $applied_patches, true ) ) {
$applied_patches[] = $patch;
update_site_option( 'fusion_applied_patches', $applied_patches );
}
// If the patch is in the array of failed patches, remove it.
if ( in_array( $patch, $failed_patches, true ) ) {
$failed_key = array_search( $patch, $failed_patches, true );
unset( $failed_patches[ $failed_key ] );
update_site_option( 'fusion_failed_patches', $failed_patches );
}
// Remove messages if they exist.
if ( isset( $this->patches[ $patch ] ) ) {
foreach ( $this->patches[ $patch ]['patch'] as $args ) {
$message_id = 'write-permissions-' . $patch;
if ( isset( $messages_option[ $message_id ] ) ) {
unset( $messages_option[ $message_id ] );
update_site_option( Fusion_Patcher_Admin_Notices::$option_name, $messages_option );
}
}
}
}
}
/**
* Footer content.
*
* @access protected
* @since 1.0.0
*/
protected function footer_content() {
}
/**
* Whitelist options.
*
* @access public
* @since 1.0.0
* @param array $options The whitelisted options.
* @return array
*/
public function whitelist_options( $options ) {
$added = array();
// Register settings for the patch contents.
foreach ( $this->patches as $key => $value ) {
$added[ 'fusion_patcher_' . $key ] = array(
'fusion_patch_contents_' . $key,
);
}
$options = add_option_whitelist( $added, $options );
return $options;
}
}