Files
roi-theme/wp-content/plugins/advanced-ads/includes/admin/class-version-control.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

223 lines
5.3 KiB
PHP
Executable File

<?php
/**
* Admin Version Control.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.50.0
*/
namespace AdvancedAds\Admin;
use AdvancedAds\Framework\Utilities\Params;
use AdvancedAds\Framework\Interfaces\Integration_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Admin Version Control.
*/
class Version_Control implements Integration_Interface {
/**
* Includes up to this amount of latest minor version into the usable version, including all the in between patches.
*
* @var int
*/
private const MINOR_VERSION_COUNT = 3;
/**
* The version list transient name
*
* @var string
*/
public const VERSIONS_TRANSIENT = 'advads-versions-list';
/**
* Hook into WordPress.
*
* @return void
*/
public function hooks(): void {
add_action( 'wp_ajax_advads_get_usable_versions', [ $this, 'get_usable_versions' ] );
add_action( 'wp_ajax_advads_install_alternate_version', [ $this, 'install_plugin' ] );
}
/**
* Download and install the desired version
*
* @return void
*/
public function install_plugin(): void {
$this->check_user_capabilities();
wp_parse_str( Params::post( 'vars', '' ), $args );
$nonce = sanitize_key( $args['nonce'] ) ?? '';
if ( ! wp_verify_nonce( $nonce, 'advads-version-control' ) ) {
wp_send_json_error( 'Not authorized', 401 );
}
$exploded = explode( '|', $args['version'] );
$version = sanitize_text_field( $exploded[0] );
$package = sanitize_url( $exploded[1] );
$installer = new Plugin_Installer( $version, $package );
$result = $installer->install();
if ( is_wp_error( $result ) ) {
wp_send_json_error(
[
'error_code' => $result->get_error_code(),
'error_message' => $result->get_error_message(),
],
400
);
}
if ( version_compare( $version, '2.0.0', '<' ) ) {
$placements = get_option( 'advads-ads-placements_backup', true );
update_option( 'advads-ads-placements', $placements );
delete_option( 'advads-ads-placements_backup' );
update_option( 'advanced_ads_db_version', '1.52.1' );
}
activate_plugin( plugin_basename( ADVADS_ABSPATH . basename( ADVADS_FILE ) ) );
wp_send_json_success(
[
'result' => $result,
'redirect' => admin_url( 'plugins.php?rollback=1' ),
],
200
);
}
/**
* Get usable version, fetch from the info API if needed
*
* @return mixed|void
*/
public function get_usable_versions() {
$this->check_user_capabilities();
if ( ! wp_verify_nonce( Params::post( 'nonce', '', FILTER_SANITIZE_FULL_SPECIAL_CHARS ), 'advads-version-control' ) ) {
wp_send_json_error( 'Not authorized', 401 );
}
$stored_versions = get_transient( self::VERSIONS_TRANSIENT );
if ( $stored_versions ) {
if ( wp_doing_ajax() ) {
wp_send_json_success( $stored_versions, 200 );
}
return $stored_versions;
}
$versions = $this->get_version_from_api();
if ( is_wp_error( $versions ) ) {
wp_send_json_error( $versions->get_error_message() . '>>' . $versions->get_error_message(), $versions->get_error_code() );
}
$versions = $this->filter_version_number( $versions );
set_transient( self::VERSIONS_TRANSIENT, $versions, 3 * HOUR_IN_SECONDS );
wp_send_json_success( $versions, 200 );
}
/**
* Perform capabilities check
*
* @return void
*/
private function check_user_capabilities() {
if ( ! current_user_can( 'install_plugins' ) ) {
wp_send_json_error( 'Not enough permissions', 401 );
}
}
/**
* Filter the versions list from the info API
*
* - all updates until the last three minor updates
* - the last version before the last major update
*
* @param array $versions all version the info API.
*
* @return array
*/
public function filter_version_number( $versions ) {
$results = [];
// Remove the "dev" version.
unset( $versions['trunk'] );
$version_numbers = array_keys( $versions );
usort( $version_numbers, 'version_compare' );
$version_numbers = array_reverse( $version_numbers );
array_shift( $version_numbers );
$major = '';
$minor = '';
$minor_version_changes = 0;
$major_version_changes = 0;
foreach ( $version_numbers as $number ) {
// Skip pre-release versions.
if ( preg_match( '/(rc|alpha|beta)/i', $number ) ) {
continue;
}
$parts = explode( '.', $number );
$major_part = $parts[1];
$minor_part = $parts[2];
if ( $major !== $major_part ) {
$major = $major_part;
++$major_version_changes;
$minor_version_changes = 0;
}
if ( $minor !== $minor_part ) {
$minor = $minor_part;
++$minor_version_changes;
}
if ( $minor_version_changes <= self::MINOR_VERSION_COUNT ) {
$results[ $number ] = $versions[ $number ];
}
if ( $major_version_changes >= self::MINOR_VERSION_COUNT ) {
break;
}
}
return [
'versions' => $results,
'order' => array_keys( $results ),
];
}
/**
* Get all version from the info API
*
* @return array|\WP_Error
*/
private function get_version_from_api() {
$aa_info = wp_remote_get( 'https://api.wordpress.org/plugins/info/1.0/advanced-ads.json' );
if ( is_wp_error( $aa_info ) ) {
return $aa_info;
}
$info = json_decode( wp_remote_retrieve_body( $aa_info ), true );
if ( $info['versions'] ) {
return $info['versions'];
}
// Likely a change in the WP info API.
return new \WP_Error( 404, __( 'Plugin info not found', 'advanced-ads' ) );
}
}