Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/clone/wp-conte.../plugins/advanced.../modules/ad-block.../admin
File: admin.php
<?php // phpcs:ignoreFile
[0] Fix | Delete
/**
[1] Fix | Delete
* Ad blocker admin functionality.
[2] Fix | Delete
*/
[3] Fix | Delete
class Advanced_Ads_Ad_Blocker_Admin {
[4] Fix | Delete
/**
[5] Fix | Delete
* Singleton instance of the plugin
[6] Fix | Delete
*
[7] Fix | Delete
* @var Advanced_Ads_Ad_Blocker_Admin
[8] Fix | Delete
*/
[9] Fix | Delete
protected static $instance;
[10] Fix | Delete
[11] Fix | Delete
/**
[12] Fix | Delete
* Module options
[13] Fix | Delete
*
[14] Fix | Delete
* @var array (if loaded)
[15] Fix | Delete
*/
[16] Fix | Delete
protected $options;
[17] Fix | Delete
[18] Fix | Delete
/**
[19] Fix | Delete
* Pattern to search assets using preg_match. The string ends with .css/.js/.png/.gif
[20] Fix | Delete
*
[21] Fix | Delete
* @var string
[22] Fix | Delete
*/
[23] Fix | Delete
protected $search_file_pattern = '/(css|js|png|gif)$/';
[24] Fix | Delete
[25] Fix | Delete
/**
[26] Fix | Delete
* Pattern to exclide directories from search. The string does not contain '/vendor/' or '/lib/' or '/admin/' or /node_modules/
[27] Fix | Delete
*
[28] Fix | Delete
* @var string
[29] Fix | Delete
*/
[30] Fix | Delete
protected $exclude_dir_pattern = '/(\/vendor\/|\/lib\/|\/admin\/|\/node_modules\/)/';
[31] Fix | Delete
[32] Fix | Delete
/**
[33] Fix | Delete
* Array, containing path information on the currently configured uploads directory
[34] Fix | Delete
*
[35] Fix | Delete
* @var array
[36] Fix | Delete
*/
[37] Fix | Delete
protected $upload_dir;
[38] Fix | Delete
[39] Fix | Delete
/**
[40] Fix | Delete
* Error messages for user
[41] Fix | Delete
*
[42] Fix | Delete
* @var WP_Error
[43] Fix | Delete
*/
[44] Fix | Delete
protected $error_messages;
[45] Fix | Delete
[46] Fix | Delete
/**
[47] Fix | Delete
* Initialize the module
[48] Fix | Delete
*
[49] Fix | Delete
*/
[50] Fix | Delete
private function __construct() {
[51] Fix | Delete
// add module settings to Advanced Ads settings page
[52] Fix | Delete
add_action( 'advanced-ads-settings-init', [ $this, 'settings_init' ], 9, 1 );
[53] Fix | Delete
[54] Fix | Delete
$is_main_site = is_main_site( get_current_blog_id() );
[55] Fix | Delete
if ( ! $is_main_site ) {
[56] Fix | Delete
return;
[57] Fix | Delete
}
[58] Fix | Delete
[59] Fix | Delete
// Get the most recent options values
[60] Fix | Delete
$this->options = Advanced_Ads_Ad_Blocker::get_instance()->options();
[61] Fix | Delete
$this->upload_dir = $this->options['upload_dir'];
[62] Fix | Delete
[63] Fix | Delete
add_action( 'admin_init', [ $this, 'process_auto_update' ] );
[64] Fix | Delete
[65] Fix | Delete
$this->error_messages = new WP_Error();
[66] Fix | Delete
}
[67] Fix | Delete
[68] Fix | Delete
/**
[69] Fix | Delete
* Return an instance of Advanced_Ads_Ad_Blocker
[70] Fix | Delete
*
[71] Fix | Delete
* @return Advanced_Ads_Ad_Blocker_Admin
[72] Fix | Delete
*/
[73] Fix | Delete
public static function get_instance() {
[74] Fix | Delete
// If the single instance hasn't been set, set it now.
[75] Fix | Delete
if (null === self::$instance)
[76] Fix | Delete
{
[77] Fix | Delete
self::$instance = new self;
[78] Fix | Delete
}
[79] Fix | Delete
[80] Fix | Delete
return self::$instance;
[81] Fix | Delete
}
[82] Fix | Delete
[83] Fix | Delete
/**
[84] Fix | Delete
* Add settings to settings page.
[85] Fix | Delete
*
[86] Fix | Delete
* @param string $hook settings page hook
[87] Fix | Delete
*/
[88] Fix | Delete
public function settings_init( $hook ) {
[89] Fix | Delete
add_settings_field(
[90] Fix | Delete
'use-adblocker',
[91] Fix | Delete
__( 'Ad blocker fix', 'advanced-ads' ),
[92] Fix | Delete
[ $this, 'render_settings_use_adblocker' ],
[93] Fix | Delete
$hook,
[94] Fix | Delete
'advanced_ads_adblocker_setting_section'
[95] Fix | Delete
);
[96] Fix | Delete
}
[97] Fix | Delete
[98] Fix | Delete
/**
[99] Fix | Delete
* Render setting to enable/disable adblocker.
[100] Fix | Delete
*/
[101] Fix | Delete
public function render_settings_use_adblocker() {
[102] Fix | Delete
$is_main_site = is_main_site( get_current_blog_id() );
[103] Fix | Delete
$checked = ! empty( Advanced_Ads::get_instance()->options()['use-adblocker'] );
[104] Fix | Delete
[105] Fix | Delete
include ADVADS_AB_BASE_PATH . 'admin/views/setting-use-adblocker.php';
[106] Fix | Delete
[107] Fix | Delete
// if this is a sub site in a network, don't run the rebuild form code.
[108] Fix | Delete
if ( ! $is_main_site ) {
[109] Fix | Delete
return;
[110] Fix | Delete
}
[111] Fix | Delete
[112] Fix | Delete
// add the rebuild form directly after the settings
[113] Fix | Delete
?>
[114] Fix | Delete
<div id="advads-adblocker-wrapper" <?php echo( $checked ? '' : 'style="display: none;"' ); ?>>
[115] Fix | Delete
<?php
[116] Fix | Delete
$button_disabled = true;
[117] Fix | Delete
$upload_dir = $this->upload_dir;
[118] Fix | Delete
$options = $this->options;
[119] Fix | Delete
[120] Fix | Delete
include ADVADS_AB_BASE_PATH . 'admin/views/rebuild_form.php';
[121] Fix | Delete
?>
[122] Fix | Delete
</div>
[123] Fix | Delete
<?php
[124] Fix | Delete
}
[125] Fix | Delete
[126] Fix | Delete
/**
[127] Fix | Delete
* Render the ad-blocker rebuild assets form
[128] Fix | Delete
*
[129] Fix | Delete
*/
[130] Fix | Delete
public function add_asset_rebuild_form() {
[131] Fix | Delete
global $wp_filesystem;
[132] Fix | Delete
$success = false;
[133] Fix | Delete
$message = '';
[134] Fix | Delete
[135] Fix | Delete
$fs_connect = Advanced_Ads_Filesystem::get_instance()->fs_connect( $this->upload_dir['basedir'] );
[136] Fix | Delete
[137] Fix | Delete
if ( $fs_connect === false || is_wp_error( $fs_connect ) ) {
[138] Fix | Delete
$message = __( 'Unable to connect to the filesystem. Please confirm your credentials.', 'advanced-ads' );
[139] Fix | Delete
[140] Fix | Delete
if ( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
[141] Fix | Delete
$message = esc_html( $wp_filesystem->errors->get_error_message() );
[142] Fix | Delete
}
[143] Fix | Delete
if ( is_wp_error( $fs_connect ) && $fs_connect->get_error_code() ) {
[144] Fix | Delete
$message = esc_html( $fs_connect->get_error_message() );
[145] Fix | Delete
}
[146] Fix | Delete
} else {
[147] Fix | Delete
$output = $this->process_form();
[148] Fix | Delete
if ( is_wp_error( $output ) ) {
[149] Fix | Delete
$message = $output->get_error_message();
[150] Fix | Delete
} else {
[151] Fix | Delete
$success = true;
[152] Fix | Delete
$message = __( 'The asset folder was rebuilt successfully', 'advanced-ads' );
[153] Fix | Delete
}
[154] Fix | Delete
}
[155] Fix | Delete
[156] Fix | Delete
$upload_dir = $this->upload_dir;
[157] Fix | Delete
$button_disabled = false;
[158] Fix | Delete
$options = Advanced_Ads_Ad_Blocker::get_instance()->options( true );
[159] Fix | Delete
[160] Fix | Delete
include ADVADS_AB_BASE_PATH . 'admin/views/rebuild_form.php';
[161] Fix | Delete
}
[162] Fix | Delete
[163] Fix | Delete
/**
[164] Fix | Delete
* Perform processing of the rebuild_form, sent by user
[165] Fix | Delete
*
[166] Fix | Delete
* @return true|WP_Error true on success, WP_Error in case of error
[167] Fix | Delete
**/
[168] Fix | Delete
private function process_form() {
[169] Fix | Delete
// at this point we do not need ftp/ssh credentials anymore
[170] Fix | Delete
$form_post_fields = array_intersect_key( $_POST, [ 'advads_ab_assign_new_folder' => false ] );
[171] Fix | Delete
[172] Fix | Delete
$this->create_dummy_plugin( $form_post_fields );
[173] Fix | Delete
[174] Fix | Delete
if ( $error_messages = $this->error_messages->get_error_messages() ) {
[175] Fix | Delete
foreach ( $error_messages as $error_message ) {
[176] Fix | Delete
Advanced_Ads::log( __METHOD__ . ': ' . $error_message );
[177] Fix | Delete
}
[178] Fix | Delete
[179] Fix | Delete
return $this->error_messages;
[180] Fix | Delete
}
[181] Fix | Delete
[182] Fix | Delete
return true;
[183] Fix | Delete
}
[184] Fix | Delete
[185] Fix | Delete
/**
[186] Fix | Delete
* Creates dummy plugin and return new options, that need to be stored in database.
[187] Fix | Delete
*
[188] Fix | Delete
* @param array $form_post_fields options, POST data sent by user.
[189] Fix | Delete
* @return array $new_options - options, that need to be stored in database.
[190] Fix | Delete
*/
[191] Fix | Delete
public function create_dummy_plugin( $form_post_fields = [] ) {
[192] Fix | Delete
global $wp_filesystem;
[193] Fix | Delete
[194] Fix | Delete
$need_assign_new_name = isset( $form_post_fields['advads_ab_assign_new_folder'] );
[195] Fix | Delete
[196] Fix | Delete
if ( ! $this->upload_dir ) {
[197] Fix | Delete
$message = __( 'There is no writable upload folder', 'advanced-ads' );
[198] Fix | Delete
$this->error_messages->add( 'create_dummy_1', $message);
[199] Fix | Delete
return false;
[200] Fix | Delete
}
[201] Fix | Delete
[202] Fix | Delete
$new_options = [
[203] Fix | Delete
'lookup_table' => isset( $this->options['lookup_table'] ) ? $this->options['lookup_table'] : [],
[204] Fix | Delete
];
[205] Fix | Delete
$new_options_error = $new_options;
[206] Fix | Delete
// $new_options_error does not have the 'module_can_work' key - ad-blocker script will be inactive and the asset folder will be rebuilt next time
[207] Fix | Delete
$new_options['module_can_work'] = true;
[208] Fix | Delete
[209] Fix | Delete
$existing_files = @scandir( $this->upload_dir['basedir'] );
[210] Fix | Delete
if ( $existing_files ) {
[211] Fix | Delete
$existing_files = array_diff( $existing_files, [ '..', '.' ] );
[212] Fix | Delete
} else {
[213] Fix | Delete
$existing_files = [];
[214] Fix | Delete
}
[215] Fix | Delete
[216] Fix | Delete
if ( ! empty( $this->options['folder_name'] ) ) {
[217] Fix | Delete
$new_options['folder_name'] = $new_options_error['folder_name'] = $this->options['folder_name'];
[218] Fix | Delete
[219] Fix | Delete
$old_folder_normalized = Advanced_Ads_Filesystem::get_instance()->normalize_path( trailingslashit( $this->upload_dir['basedir'] ) ) . $this->options['folder_name'];
[220] Fix | Delete
[221] Fix | Delete
if ( $wp_filesystem->exists( $old_folder_normalized ) ) {
[222] Fix | Delete
[223] Fix | Delete
if ( $need_assign_new_name ) {
[224] Fix | Delete
$existing_files[] = (string) $new_options['folder_name'];
[225] Fix | Delete
$new_folder_name = $this->generate_unique_name( $existing_files );
[226] Fix | Delete
$new_folder_normalized = Advanced_Ads_Filesystem::get_instance()->normalize_path( trailingslashit( $this->upload_dir['basedir'] ) ) . $new_folder_name;
[227] Fix | Delete
[228] Fix | Delete
if ( ! $wp_filesystem->move( $old_folder_normalized, $new_folder_normalized ) ) {
[229] Fix | Delete
/* translators: %s old folder name */
[230] Fix | Delete
$message = sprintf( __( 'Unable to rename "%s" directory', 'advanced-ads' ), $old_folder_normalized );
[231] Fix | Delete
$this->error_messages->add( 'create_dummy_2', $message);
[232] Fix | Delete
return false;
[233] Fix | Delete
}
[234] Fix | Delete
$new_options['folder_name'] = $new_options_error['folder_name'] = $new_folder_name;
[235] Fix | Delete
[236] Fix | Delete
}
[237] Fix | Delete
[238] Fix | Delete
$is_rebuild_needed = count( $this->get_assets() );
[239] Fix | Delete
[240] Fix | Delete
// we have an error while the method is being executed
[241] Fix | Delete
Advanced_Ads_Ad_Blocker::get_instance()->update_options( $new_options_error );
[242] Fix | Delete
[243] Fix | Delete
if ( $is_rebuild_needed ) {
[244] Fix | Delete
$lookup_table = $this->copy_assets( $new_options['folder_name'], $need_assign_new_name );
[245] Fix | Delete
if ( ! $lookup_table ) {
[246] Fix | Delete
/* translators: %s folder name */
[247] Fix | Delete
$message = sprintf( __( 'Unable to copy assets to the "%s" directory', 'advanced-ads' ), $new_options['folder_name'] );
[248] Fix | Delete
$this->error_messages->add( 'create_dummy_3', $message);
[249] Fix | Delete
return false;
[250] Fix | Delete
}
[251] Fix | Delete
$new_options['lookup_table'] = $lookup_table;
[252] Fix | Delete
}
[253] Fix | Delete
[254] Fix | Delete
} else {
[255] Fix | Delete
// we have an error while the method is being executed
[256] Fix | Delete
Advanced_Ads_Ad_Blocker::get_instance()->update_options( $new_options_error );
[257] Fix | Delete
// old folder does not exist, let's create it
[258] Fix | Delete
$lookup_table = $this->copy_assets( $new_options['folder_name'] );
[259] Fix | Delete
if ( ! $lookup_table ) {
[260] Fix | Delete
/* translators: %s folder name */
[261] Fix | Delete
$message = sprintf( __( 'Unable to copy assets to the "%s" directory', 'advanced-ads' ), $new_options['folder_name'] );
[262] Fix | Delete
$this->error_messages->add( 'create_dummy_4', $message);
[263] Fix | Delete
return false;
[264] Fix | Delete
}
[265] Fix | Delete
$new_options['lookup_table'] = $lookup_table;
[266] Fix | Delete
}
[267] Fix | Delete
} else {
[268] Fix | Delete
// It seems this is the first time this plugin was ran, let's create everything we need in order to
[269] Fix | Delete
// have this plugin function normally.
[270] Fix | Delete
$new_folder_name = $this->generate_unique_name( $existing_files );
[271] Fix | Delete
// Create a unique folder name
[272] Fix | Delete
$new_options['folder_name'] = $new_options_error['folder_name'] = $new_folder_name;
[273] Fix | Delete
// we have an error while the method is being executed
[274] Fix | Delete
Advanced_Ads_Ad_Blocker::get_instance()->update_options( $new_options_error );
[275] Fix | Delete
// Copy the assets
[276] Fix | Delete
$lookup_table = $this->copy_assets( $new_options['folder_name'] );
[277] Fix | Delete
if ( ! $lookup_table ) {
[278] Fix | Delete
$message = sprintf( __( 'Unable to copy assets to the "%s" directory', 'advanced-ads' ), $new_options['folder_name'] );
[279] Fix | Delete
$this->error_messages->add( 'create_dummy_5', $message);
[280] Fix | Delete
return false;
[281] Fix | Delete
}
[282] Fix | Delete
$new_options['lookup_table'] = $lookup_table;
[283] Fix | Delete
}
[284] Fix | Delete
// successful result, save options and rewrite previous error options
[285] Fix | Delete
Advanced_Ads_Ad_Blocker::get_instance()->update_options( $new_options );
[286] Fix | Delete
Advanced_Ads_Ad_Health_Notices::get_instance()->remove( 'assets_expired' );
[287] Fix | Delete
}
[288] Fix | Delete
[289] Fix | Delete
/**
[290] Fix | Delete
* Copy all assets (JS/CSS) to the magic directory.
[291] Fix | Delete
*
[292] Fix | Delete
* @param string $folder_name Destination folder.
[293] Fix | Delete
* @param bool $need_assign_new_name True if we need to assign new random names to assets.
[294] Fix | Delete
* @return bool/array Bool false on failure, array lookup table on success.
[295] Fix | Delete
*/
[296] Fix | Delete
public function copy_assets( $folder_name, $need_assign_new_name = false ) {
[297] Fix | Delete
global $wp_filesystem;
[298] Fix | Delete
[299] Fix | Delete
// Are we completely rebuilding the assets folder?
[300] Fix | Delete
$asset_path = trailingslashit( $this->upload_dir['basedir'] ) . $folder_name ;
[301] Fix | Delete
$asset_path_normalized = Advanced_Ads_Filesystem::get_instance()->normalize_path( trailingslashit( $this->upload_dir['basedir'] ) ) . $folder_name;
[302] Fix | Delete
[303] Fix | Delete
// already saved associations (original name => replaced name)
[304] Fix | Delete
$rand_asset_names = [];
[305] Fix | Delete
[306] Fix | Delete
if ( $need_assign_new_name ) {
[307] Fix | Delete
// Check if there is a previous asset folder
[308] Fix | Delete
if ( $wp_filesystem->exists( $asset_path_normalized ) ) {
[309] Fix | Delete
// Remove the old directory and its contents
[310] Fix | Delete
if ( ! $wp_filesystem->rmdir( trailingslashit( $asset_path_normalized ), true ) ) {
[311] Fix | Delete
/* translators: %s directory path */
[312] Fix | Delete
$message = sprintf( __( 'We do not have direct write access to the "%s" directory', 'advanced-ads' ), $asset_path_normalized );
[313] Fix | Delete
$this->error_messages->add( 'copy_assets_1', $message);
[314] Fix | Delete
return false;
[315] Fix | Delete
}
[316] Fix | Delete
}
[317] Fix | Delete
} elseif ( isset( $this->options['lookup_table'] ) ) {
[318] Fix | Delete
foreach ( $this->options['lookup_table'] as $orig_path => $replaced_info ) {
[319] Fix | Delete
$replaced_path = is_array( $replaced_info ) ? $replaced_info['path'] : $replaced_info;
[320] Fix | Delete
[321] Fix | Delete
$orig_path_components = preg_split('/\//', $orig_path, -1, PREG_SPLIT_NO_EMPTY);
[322] Fix | Delete
$replaced_path_components = preg_split('/\//', $replaced_path, -1, PREG_SPLIT_NO_EMPTY);
[323] Fix | Delete
[324] Fix | Delete
// (css, style.css) => (1, 2.css)
[325] Fix | Delete
foreach ( $orig_path_components as $k=> $orig_path_part ) {
[326] Fix | Delete
$rand_asset_names[ $orig_path_part] = (string) $replaced_path_components[$k];
[327] Fix | Delete
}
[328] Fix | Delete
}
[329] Fix | Delete
}
[330] Fix | Delete
[331] Fix | Delete
[332] Fix | Delete
// Lookup_table contains associations between the original path of the asset and it path within our magic folder.
[333] Fix | Delete
// I.e: [advanced-ads-layer/admin/assets/css/admin.css] => array( path => /12/34/56/78/1347107783.css, mtime => 99 ).
[334] Fix | Delete
$assets = $this->get_assets();
[335] Fix | Delete
if ( $need_assign_new_name ) {
[336] Fix | Delete
$lookup_table = [];
[337] Fix | Delete
} else {
[338] Fix | Delete
$lookup_table = isset( $this->options['lookup_table'] ) ? $this->options['lookup_table'] : [];
[339] Fix | Delete
}
[340] Fix | Delete
[341] Fix | Delete
/* Do not rename assets and folders. If, for example, some library uses in file.css something like this:
[342] Fix | Delete
'background: url(/img/image.png)', you should add 'img') to this array */
[343] Fix | Delete
$not_rename_assets = [ 'public', 'assets', 'js', 'css', 'fancybox', 'advanced.js', 'jquery.fancybox-1.3.4.css' ];
[344] Fix | Delete
[345] Fix | Delete
// Loop through all the found assets
[346] Fix | Delete
foreach ( $assets as $file => $filemtime ) {
[347] Fix | Delete
if ( ! file_exists( $file ) ) {
[348] Fix | Delete
continue;
[349] Fix | Delete
}
[350] Fix | Delete
[351] Fix | Delete
$first_cleanup = str_replace( WP_PLUGIN_DIR , '', $file );
[352] Fix | Delete
$first_cleanup_dir = dirname( $first_cleanup );
[353] Fix | Delete
$first_cleanup_filename = basename( $first_cleanup );
[354] Fix | Delete
$first_cleanup_file_extension = pathinfo( $first_cleanup, PATHINFO_EXTENSION );
[355] Fix | Delete
$path_components = preg_split('/\//', $first_cleanup_dir, -1, PREG_SPLIT_NO_EMPTY);
[356] Fix | Delete
$path_components_new = [];
[357] Fix | Delete
[358] Fix | Delete
// Interate over directories.
[359] Fix | Delete
foreach ( $path_components as $k => $dir ) {
[360] Fix | Delete
if ( in_array( $dir, $not_rename_assets ) ) {
[361] Fix | Delete
$path_components_new[ $k ] = $dir;
[362] Fix | Delete
} elseif ( array_key_exists( $dir, $rand_asset_names ) ) {
[363] Fix | Delete
$path_components_new[ $k ] = $rand_asset_names[ $dir ];
[364] Fix | Delete
} else {
[365] Fix | Delete
$new_rand_folder_name = $this->generate_unique_name( array_values( $rand_asset_names ) );
[366] Fix | Delete
$path_components_new[ $k ] = $new_rand_folder_name;
[367] Fix | Delete
$rand_asset_names[ $dir ] = (string) $new_rand_folder_name;
[368] Fix | Delete
}
[369] Fix | Delete
}
[370] Fix | Delete
[371] Fix | Delete
$new_dir_full = trailingslashit( $asset_path ) . trailingslashit( implode( '/', $path_components_new ) );
[372] Fix | Delete
$new_dir_full_normalized = trailingslashit( $asset_path_normalized ) . trailingslashit( implode( '/', $path_components_new ) );
[373] Fix | Delete
$new_dir = trailingslashit( implode( '/', $path_components_new ) );
[374] Fix | Delete
[375] Fix | Delete
[376] Fix | Delete
[377] Fix | Delete
[378] Fix | Delete
if ( ! in_array( $first_cleanup_filename, $not_rename_assets ) && ( $first_cleanup_file_extension == 'js' || $first_cleanup_file_extension == 'css' ) ) {
[379] Fix | Delete
if ( array_key_exists( $first_cleanup_filename, $rand_asset_names ) ) {
[380] Fix | Delete
$new_abs_file = $new_dir_full_normalized . $rand_asset_names[$first_cleanup_filename];
[381] Fix | Delete
$new_rel_file = $new_dir . $rand_asset_names[$first_cleanup_filename];
[382] Fix | Delete
} else {
[383] Fix | Delete
$new_filename = $this->generate_unique_name( array_values( $rand_asset_names ), $first_cleanup_file_extension );
[384] Fix | Delete
$rand_asset_names[$first_cleanup_filename] = (string) $new_filename;
[385] Fix | Delete
$new_abs_file = $new_dir_full_normalized . $new_filename;
[386] Fix | Delete
$new_rel_file = $new_dir . $new_filename;
[387] Fix | Delete
}
[388] Fix | Delete
} else {
[389] Fix | Delete
$new_abs_file = $new_dir_full_normalized . $first_cleanup_filename;
[390] Fix | Delete
$new_rel_file = $new_dir . $first_cleanup_filename;
[391] Fix | Delete
}
[392] Fix | Delete
[393] Fix | Delete
[394] Fix | Delete
if ( ! file_exists( $new_dir_full_normalized ) ) {
[395] Fix | Delete
// Create the path if it doesn't exist (prevents the copy() function from failing)
[396] Fix | Delete
if ( ! Advanced_Ads_Filesystem::get_instance()->mkdir_p( $new_dir_full_normalized ) ) {
[397] Fix | Delete
$message = sprintf( __( 'We do not have direct write access to the "%s" directory', 'advanced-ads' ), $this->upload_dir['basedir'] );
[398] Fix | Delete
$this->error_messages->add( 'copy_assets_4', $message);
[399] Fix | Delete
return false;
[400] Fix | Delete
}
[401] Fix | Delete
}
[402] Fix | Delete
[403] Fix | Delete
[404] Fix | Delete
$file_normalized = Advanced_Ads_Filesystem::get_instance()->normalize_path( trailingslashit( dirname( $file ) ) ) . basename( $file );
[405] Fix | Delete
[406] Fix | Delete
// Copy the file to our new magic directory,
[407] Fix | Delete
if ( ! $wp_filesystem->copy( $file_normalized, $new_abs_file, true, FS_CHMOD_FILE ) ) {
[408] Fix | Delete
/* translators: %s directory path */
[409] Fix | Delete
$message = sprintf( __( 'Unable to copy files to %s', 'advanced-ads' ), $asset_path_normalized );
[410] Fix | Delete
$this->error_messages->add( 'copy_assets_5', $message);
[411] Fix | Delete
return false;
[412] Fix | Delete
}
[413] Fix | Delete
[414] Fix | Delete
$lookup_table[ $first_cleanup ] = [
[415] Fix | Delete
'path' => $new_rel_file,
[416] Fix | Delete
'mtime' => $filemtime,
[417] Fix | Delete
];
[418] Fix | Delete
}
[419] Fix | Delete
[420] Fix | Delete
return $lookup_table;
[421] Fix | Delete
}
[422] Fix | Delete
[423] Fix | Delete
/**
[424] Fix | Delete
* This function recursively searches for assets
[425] Fix | Delete
*
[426] Fix | Delete
* @param string $dir The directory to search in.
[427] Fix | Delete
* @return Array with pairs: abs_filename => mtime.
[428] Fix | Delete
*/
[429] Fix | Delete
public function recursive_search_assets( $dir ) {
[430] Fix | Delete
$assets = [];
[431] Fix | Delete
[432] Fix | Delete
$tree = glob( rtrim( $dir, '/' ) . '/*' );
[433] Fix | Delete
if ( is_array( $tree ) ) {
[434] Fix | Delete
foreach ( $tree as $file ) {
[435] Fix | Delete
if ( is_dir( $file ) && ! preg_match( $this->exclude_dir_pattern, $file ) ) {
[436] Fix | Delete
$assets = array_merge( $assets, $this->recursive_search_assets( $file ) );
[437] Fix | Delete
} elseif ( is_file( $file ) && preg_match( $this->search_file_pattern, $file ) ) {
[438] Fix | Delete
$assets[ $file ] = @filemtime( $file );
[439] Fix | Delete
}
[440] Fix | Delete
}
[441] Fix | Delete
}
[442] Fix | Delete
[443] Fix | Delete
return $assets;
[444] Fix | Delete
}
[445] Fix | Delete
[446] Fix | Delete
/**
[447] Fix | Delete
* Returns new or modified assets and their mtimes.
[448] Fix | Delete
*
[449] Fix | Delete
* @return array
[450] Fix | Delete
*/
[451] Fix | Delete
public function get_assets() {
[452] Fix | Delete
$new_files_info = $this->recursive_search_assets( trailingslashit( WP_PLUGIN_DIR ) . 'advanced-ads*' );
[453] Fix | Delete
[454] Fix | Delete
if ( ! isset( $this->options['lookup_table'] ) || ! isset( $this->upload_dir['basedir'] ) || ! isset( $this->options['folder_name'] ) ) {
[455] Fix | Delete
return $new_files_info;
[456] Fix | Delete
}
[457] Fix | Delete
[458] Fix | Delete
$asset_path = trailingslashit( trailingslashit( $this->upload_dir['basedir'] ) . $this->options['folder_name'] ) ;
[459] Fix | Delete
$new_files = [];
[460] Fix | Delete
[461] Fix | Delete
foreach ( $new_files_info as $abs_file => $mtime ) {
[462] Fix | Delete
$rel_file = str_replace( WP_PLUGIN_DIR , '', $abs_file );
[463] Fix | Delete
[464] Fix | Delete
if ( ! isset( $this->options['lookup_table'][ $rel_file ]['mtime'] ) ||
[465] Fix | Delete
$this->options['lookup_table'][ $rel_file ]['mtime'] !== $mtime ||
[466] Fix | Delete
! file_exists( $asset_path . $this->options['lookup_table'][$rel_file]['path'] )
[467] Fix | Delete
) {
[468] Fix | Delete
$new_files[ $abs_file ] = $mtime;
[469] Fix | Delete
}
[470] Fix | Delete
}
[471] Fix | Delete
[472] Fix | Delete
return $new_files;
[473] Fix | Delete
}
[474] Fix | Delete
[475] Fix | Delete
/**
[476] Fix | Delete
* Automatically updates assets
[477] Fix | Delete
*
[478] Fix | Delete
*/
[479] Fix | Delete
public function process_auto_update() {
[480] Fix | Delete
$advads_options = Advanced_Ads::get_instance()->options();
[481] Fix | Delete
if ( ! isset( $advads_options['use-adblocker'] )
[482] Fix | Delete
|| ! $this->upload_dir
[483] Fix | Delete
) { return; }
[484] Fix | Delete
[485] Fix | Delete
//if module is working without errors and there are new assets
[486] Fix | Delete
if ( ! empty( $this->options['module_can_work'] ) && count( $this->get_assets() ) ) {
[487] Fix | Delete
$fs_connect = Advanced_Ads_Filesystem::get_instance()->fs_connect( $this->upload_dir['basedir'] );
[488] Fix | Delete
[489] Fix | Delete
if ( false === $fs_connect || is_wp_error( $fs_connect ) ) {
[490] Fix | Delete
// we can not update assets automatically. The user should visit the setting page and update assets manually
[491] Fix | Delete
// disable module and show notice
[492] Fix | Delete
unset( $this->options['module_can_work'] );
[493] Fix | Delete
Advanced_Ads_Ad_Blocker::get_instance()->update_options( $this->options );
[494] Fix | Delete
return;
[495] Fix | Delete
}
[496] Fix | Delete
[497] Fix | Delete
$this->create_dummy_plugin();
[498] Fix | Delete
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function