request->post( 'dir', null, 'rawurldecode' ) ); $multiselect = WRIO_Plugin::app()->request->post( 'multiSelect' ); $multiselect = $multiselect == 'true' ? true : false; $only_folders = WRIO_Plugin::app()->request->post( 'onlyFolders' ); $only_folders = $only_folders == 'true' ? true : false; $only_folders = $dir == '/' || $only_folders; $only_files = WRIO_Plugin::app()->request->post( 'onlyFiles' ); $only_files = $only_files == 'true' ? true : false; $selected_dir = trailingslashit( $root ) . ( $dir == '/' ? '' : $dir ); // set checkbox if multiSelect set to true $checkbox = $multiselect ? "" : null; $upload_dir = wp_upload_dir(); $upload_dir_path = trailingslashit( str_replace( ABSPATH, '', $upload_dir['basedir'] ) ); $wp_content_dir = trailingslashit( str_replace( ABSPATH, '', WP_CONTENT_DIR ) ); $ngg_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_ngg_galleries_path() ); $shortpixel_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_shortpixel_path() ); $ewww_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_ewww_tools_path() ); $wc_path = str_replace( wp_normalize_path( ABSPATH ), '', wrio_get_wc_logs_path() ); $exclude_dirs = [ $ngg_path, $shortpixel_path, $ewww_path, $wc_path, $wp_content_dir . 'backup', $wp_content_dir . 'backups', $wp_content_dir . 'cache', $wp_content_dir . 'lang', $wp_content_dir . 'langs', $wp_content_dir . 'languages', $upload_dir_path . 'wio_backup', $upload_dir_path . 'wrio', $upload_dir_path . 'wrio-webp-uploads', //'wp-admin', //'wp-includes' ]; // исключаем все директории /wp-content/uploads/2019 - они уже оптимизируются в медиабиблиотеке. // с основания WP в 2003 году до текущего года + 1 на всякий случай. $year = date( 'Y' ) + 1; for ( $i = 2003; $i <= $year; $i ++ ) { $exclude_dirs[] = $upload_dir_path . $i; } if ( file_exists( $selected_dir ) && is_dir( $selected_dir ) ) { $files = scandir( $selected_dir ); $return_dir = substr( $selected_dir, strlen( $root ) ); natcasesort( $files ); if ( count( $files ) > 2 ) { // The 2 accounts for . and .. echo ""; } } die(); } ); /** * AJAX обработчик добавления папки */ add_action( 'wp_ajax_wrio-add-custom-folder', function () { check_admin_referer( 'bulk_optimization' ); if ( ! current_user_can( 'manage_options' ) ) { wp_die( - 1 ); } $path = WRIO_Plugin::app()->request->request( 'path', null, true ); if ( empty( $path ) ) { wp_die( - 1 ); } $cf = WRIO_Custom_Folders::get_instance(); $folder = $cf->addFolder( $path ); if ( is_wp_error( $folder ) ) { wp_send_json_error( [ 'error_message' => $folder->get_error_message(), 'error_code' => $folder->get_error_code() ] ); } wp_send_json_success( $folder->toArray() ); } ); /** * AJAX индексация папки */ add_action( 'wp_ajax_wrio-scan-folder', function () { check_admin_referer( 'bulk_optimization' ); if ( ! current_user_can( 'manage_options' ) ) { wp_die( - 1 ); } $uid = WRIO_Plugin::app()->request->request( 'uid', null, true ); $offset = WRIO_Plugin::app()->request->request( 'offset', 0, true ); $total = WRIO_Plugin::app()->request->request( 'total', 0, true ); if ( empty( $uid ) ) { wp_die( - 1 ); } $max_process_elements = 100; // сколько элементов за итерацию индексирования $cf = WRIO_Custom_Folders::get_instance(); $folder = $cf->getFolder( $uid ); if ( ! $total ) { $total = $folder->reCountFiles(); $cf->saveFolders(); } $processed_count = $folder->indexing( $offset, $max_process_elements ); $offset = $offset + $processed_count; $results = [ 'offset' => $offset, 'total' => $total, 'complete' => false, 'percent' => 0, ]; if ( $total ) { $results['percent'] = 100 - ( ( $total - $offset ) * 100 / $total ); /** * Операция индексирования состоит из двух этапов. Проверка существующих файлов и поиск новых файлов. * Поэтому процент делим на 2 и добавляем 50% т.к. это вторая часть. */ $results['percent'] = $results['percent'] / 2 + 50; } if ( $offset >= $total ) { $results['percent'] = 100; $results['complete'] = true; } wp_send_json_success( $results ); } ); /** * AJAX обработчик удаления папки */ add_action( 'wp_ajax_wriop_remove_folder', function () { $uid = isset( $_POST['uid'] ) ? $_POST['uid'] : false; if ( ! $uid ) { die(); } $cf = WRIO_Custom_Folders::get_instance(); $cf->removeFolder( $uid ); $cf->saveFolders(); die(); } ); /** * AJAX проверка проиндексированных файлов */ add_action( 'wp_ajax_wriop_folder_sync_index', function () { $uid = isset( $_POST['uid'] ) ? $_POST['uid'] : false; $offset = isset( $_POST['offset'] ) ? intval( $_POST['offset'] ) : 0; $total = isset( $_POST['total'] ) ? intval( $_POST['total'] ) : 0; $max_process_elements = 20; // сколько элементов за итерацию индексирования $cf = WRIO_Custom_Folders::get_instance(); $folder = $cf->getFolder( $uid ); $total = $folder->countIndexedFiles(); $processed_count = $folder->syncIndex( $offset, $max_process_elements ); $offset = $offset + $processed_count; $results = [ 'offset' => $offset, 'total' => $total, 'complete' => false, 'percent' => 0, ]; if ( $total ) { $results['percent'] = 100 - ( ( $total - $offset ) * 100 / $total ); /** * Операция индексирования состоит из двух этапов. Проверка существующих файлов и поиск новых файлов. * Поэтому процент делим на 2. Это первая часть. */ $results['percent'] = $results['percent'] / 2; } if ( $offset >= $total ) { $results['percent'] = 100; $results['complete'] = true; } wp_send_json( $results ); } ); /** * AJAX массовая оптимизация */ /*add_action( 'wp_ajax_wriop_process_cf_images', function () { check_admin_referer( 'wio-iph' ); $reset_current_error = (bool) WRIO_Plugin::app()->request->request( 'reset_current_errors' ); // в ajax запросе мы не знаем, получен ли он из мультиадминки или из обычной. Поэтому проверяем параметр, полученный из frontend if ( isset( $_POST['multisite'] ) and $_POST['multisite'] ) { $multisite = new WIO_Multisite; $multisite->initHooks(); } $cf = WRIO_Custom_Folders::get_instance(); /*$folders = $cf->getFolders(); if ( ! empty( $folders ) ) { foreach ( (array) $folders as $folder ) { $folder = $cf->getFolder( $folder->get( 'uid' ) ); $count_files = $folder->countFiles(); $count_indexed_files = $folder->countIndexedFiles(); $test = 'fsdf'; } }*/ /*if ( $reset_current_error ) { // сбрасываем текущие ошибки оптимизации $cf->resetCurrentErrors(); } $max_process_per_request = 1; $optimized_data = $cf->processUnoptimizedImages( $max_process_per_request ); // если изображения закончились - посылаем команду завершения if ( $optimized_data['remain'] <= 0 ) { $optimized_data['end'] = true; } wp_send_json( $optimized_data ); } );*/ /** * AJAX массовая оптимизация выбранной папки */ /*add_action( 'wp_ajax_wriop_process_cf_folder_images', function () { check_admin_referer( 'wio-iph' ); // в ajax запросе мы не знаем, получен ли он из мультиадминки или из обычной. Поэтому проверяем параметр, полученный из frontend if ( isset( $_POST['multisite'] ) and $_POST['multisite'] ) { $multisite = new WIO_Multisite; $multisite->initHooks(); } $cf = WRIO_Custom_Folders::get_instance(); $max_process_per_request = 1; add_filter( 'wriop_cf_current_folder', function ( $folder_uid ) { $folder_uid = isset( $_POST['uid'] ) ? $_POST['uid'] : false; return $folder_uid; } ); $optimized_data = $cf->processUnoptimizedImages( $max_process_per_request ); // если изображения закончились - посылаем команду завершения if ( $optimized_data['remain'] <= 0 ) { $optimized_data['end'] = true; } wp_send_json( $optimized_data ); } );*/ /** * Переоптимизация cf_image. AJAX * */ add_action( 'wp_ajax_wio_cf_reoptimize_image', function () { $image_id = (int) $_POST['id']; $backup = WRIOP_Backup::get_instance(); $backup_origin_images = WRIO_Plugin::app()->getPopulateOption( 'backup_origin_images', false ); $cf = WRIO_Custom_Folders::get_instance(); if ( $backup_origin_images and ! $backup->isBackupWritable() ) { echo $cf->getMediaColumnContent( $image_id ); die(); } wp_suspend_cache_addition( true ); $default_level = WRIO_Plugin::app()->getPopulateOption( 'image_optimization_level', 'normal' ); $level = isset( $_POST['level'] ) ? sanitize_text_field( $_POST['level'] ) : $default_level; $optimized_data = $cf->optimizeImage( $image_id, $level ); if ( $optimized_data && isset( $optimized_data['processing'] ) ) { echo 'processing'; // эту строку не локализировать! die(); } echo $cf->getMediaColumnContent( $image_id ); die(); } ); /** * Восстановление * */ add_action( 'wp_ajax_wio_cf_restore_image', function () { wp_suspend_cache_addition( true ); $image_id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0; $cf = WRIO_Custom_Folders::get_instance(); $cf_image = $cf->getImage( $image_id ); $image_statistics = WRIO_Image_Statistic_Folders::get_instance(); if ( $cf_image->isOptimized() ) { $restored = $cf_image->restore(); if ( ! is_wp_error( $restored ) ) { $optimization_data = $cf_image->getOptimizationData(); $optimized_size = $optimization_data->get_final_size(); $original_size = $optimization_data->get_original_size(); $webp_optimized_size = $optimization_data->get_extra_data()->get_webp_main_size(); $image_statistics->deductFromField( 'webp_optimized_size', $webp_optimized_size ); $image_statistics->deductFromField( 'optimized_size', $optimized_size ); $image_statistics->deductFromField( 'original_size', $original_size ); $image_statistics->save(); $folder = $cf->getFolder( $cf_image->get( 'folder_uid' ) ); $folder->reCountOptimizedFiles(); $cf->saveFolders(); } } echo $cf->getMediaColumnContent( $image_id ); die(); } ); /** * AJAX обработчик восстановления из резервной копии */ /*add_action( 'wp_ajax_wio_cf_restore_backup', function () { check_admin_referer( 'wio-iph' ); $max_process_per_request = 10; // сколько картинок восстанавливаем за 1 запрос $total = sanitize_text_field( $_POST['total'] ); if ( isset( $_POST['blog_id'] ) && $_POST['blog_id'] ) { switch_to_blog( intval( $_POST['blog_id'] ) ); } $folder_uid = isset( $_POST['uid'] ) ? sanitize_text_field( $_POST['uid'] ) : false; $cf = WRIO_Custom_Folders::get_instance(); if ( $total == '?' ) { $total = RIO_Process_Queue::count_by_type_status( 'cf_image', 'success' ); } $restored_data = $cf->restoreFolderFromBackup( $folder_uid, $max_process_per_request ); if ( isset( $_POST['blog_id'] ) && $_POST['blog_id'] ) { restore_current_blog(); } $restored_data['total'] = $total; if ( $total ) { $restored_data['percent'] = 100 - ( $restored_data['remain'] * 100 / $total ); } else { $restored_data['percent'] = 0; } // если изображения закончились - посылаем команду завершения if ( $restored_data['remain'] <= 0 ) { $restored_data['end'] = true; } wp_send_json( $restored_data ); } );*/ /** * Загружает шаблон для всплывающий окон */ /*add_action( 'wp_ajax_wio_cf_get_template_part', function () { $template = sanitize_text_field( $_POST['template'] ); $templates = [ 'select_folder' => 'select-folder.php', 'restore_folder' => 'restore-folder.php', 'sync_folder' => 'sync-folder.php', 'optimize_folder' => 'optimize-folder.php', 'sync_all_folders' => 'sync-all-folders.php', 'folders_table_body' => 'folders-table-body.php', ]; if ( isset( $templates[ $template ] ) ) { $template_file = WRIOP_PLUGIN_DIR . '/admin/pages/parts/' . $templates[ $template ]; if ( file_exists( $template_file ) ) { include( $template_file ); } } die(); } );*/ /** * Загружает шаблон для всплывающий окон */ add_action( 'wp_ajax_wio_cf_reload_ui', function () { $template_file = WRIOP_PLUGIN_DIR . '/admin/pages/parts/folders-table-body.php'; $folders_table = ''; if ( is_file( $template_file ) ) { ob_start(); include( $template_file ); $folders_table = ob_get_contents(); ob_end_clean(); } $image_statistics = WRIO_Image_Statistic_Folders::get_instance(); $responce = [ 'folders_table' => $folders_table, 'statistic' => $image_statistics->load(), ]; wp_send_json( $responce ); } );