scanner = $scanner; $this->updater = $updater; $this->exporter = $exporter; $this->woocommerce = $woocommerce; } public function hooks() { add_action( 'admin_menu', array( $this, 'register_menu' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); add_action( 'wp_ajax_adbear_alt_text_generator_scan', array( $this, 'ajax_scan' ) ); add_action( 'admin_post_adbear_alt_text_generator_update_single', array( $this, 'handle_single_update' ) ); add_action( 'admin_post_adbear_alt_text_generator_export', array( $this, 'handle_export' ) ); add_action( 'admin_post_adbear_alt_text_generator_optimize_woo', array( $this, 'handle_optimize_woo' ) ); add_filter( 'manage_upload_columns', array( $this, 'add_media_column' ) ); add_action( 'manage_media_custom_column', array( $this, 'render_media_column' ), 10, 2 ); } public function register_menu() { add_menu_page( __( 'Adbear Alt Text Generator', 'adbear-alt-text-generator' ), __( 'Alt Text Generator', 'adbear-alt-text-generator' ), 'upload_files', 'adbear-alt-text-generator', array( $this, 'render_page' ), 'dashicons-format-image', 65 ); } public function enqueue_assets( $hook ) { if ( 'toplevel_page_adbear-alt-text-generator' !== $hook ) { return; } wp_enqueue_style( 'adbear-alt-text-generator-admin', ADBEAR_ALT_TEXT_GENERATOR_URL . 'assets/admin.css', array(), ADBEAR_ALT_TEXT_GENERATOR_VERSION ); wp_enqueue_script( 'adbear-alt-text-generator-admin', ADBEAR_ALT_TEXT_GENERATOR_URL . 'assets/admin.js', array( 'jquery' ), ADBEAR_ALT_TEXT_GENERATOR_VERSION, true ); wp_localize_script( 'adbear-alt-text-generator-admin', 'AdbearAltTextGenerator', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'scanNonce' => wp_create_nonce( 'adbear_alt_text_generator_scan' ), 'batchSize' => 50, 'i18nRunning' => __( 'Scanning media library...', 'adbear-alt-text-generator' ), 'i18nDone' => __( 'Scan completed. Reloading page...', 'adbear-alt-text-generator' ), 'i18nError' => __( 'Scan request failed.', 'adbear-alt-text-generator' ), ) ); } public function render_page() { if ( ! Adbear_Alt_Text_Generator_Helpers::user_can_manage() ) { wp_die( esc_html__( 'You are not allowed to access this page.', 'adbear-alt-text-generator' ) ); } $results = $this->scanner->get_results(); $meta = (array) get_option( Adbear_Alt_Text_Generator_Helpers::get_scan_meta_option_key(), array() ); $updated = isset( $_GET['woo_updated'] ) ? absint( wp_unslash( $_GET['woo_updated'] ) ) : 0; ?>

woocommerce->is_available() ) : ?>
__( 'Permission denied.', 'adbear-alt-text-generator' ) ), 403 ); } $offset = isset( $_POST['offset'] ) ? absint( wp_unslash( $_POST['offset'] ) ) : 0; $limit = isset( $_POST['limit'] ) ? absint( wp_unslash( $_POST['limit'] ) ) : 50; $reset = ! empty( $_POST['reset'] ); wp_send_json_success( $this->scanner->scan_batch( $offset, $limit, $reset ) ); } public function handle_single_update() { check_admin_referer( 'adbear_alt_text_generator_update_single' ); if ( ! Adbear_Alt_Text_Generator_Helpers::user_can_manage() ) { wp_die( esc_html__( 'Permission denied.', 'adbear-alt-text-generator' ) ); } $attachment_id = isset( $_POST['attachment_id'] ) ? absint( wp_unslash( $_POST['attachment_id'] ) ) : 0; $alt_text = isset( $_POST['alt_text'] ) ? sanitize_text_field( wp_unslash( $_POST['alt_text'] ) ) : ''; $title_text = isset( $_POST['title_text'] ) ? sanitize_text_field( wp_unslash( $_POST['title_text'] ) ) : ''; $this->updater->update_single( $attachment_id, $alt_text, $title_text ); wp_safe_redirect( add_query_arg( 'updated', '1', admin_url( 'admin.php?page=adbear-alt-text-generator' ) ) ); exit; } public function handle_export() { check_admin_referer( 'adbear_alt_text_generator_export' ); if ( ! Adbear_Alt_Text_Generator_Helpers::user_can_manage() ) { wp_die( esc_html__( 'Permission denied.', 'adbear-alt-text-generator' ) ); } $this->exporter->export_csv(); } public function handle_optimize_woo() { check_admin_referer( 'adbear_alt_text_generator_optimize_woo' ); if ( ! Adbear_Alt_Text_Generator_Helpers::user_can_manage() ) { wp_die( esc_html__( 'Permission denied.', 'adbear-alt-text-generator' ) ); } $updated = $this->woocommerce->optimize_product_images(); wp_safe_redirect( add_query_arg( array( 'optimized_woo' => '1', 'woo_updated' => absint( $updated ) ), admin_url( 'admin.php?page=adbear-alt-text-generator' ) ) ); exit; } public function add_media_column( $columns ) { $columns['adbear_alt_text_generator'] = __( 'Alt Text Status', 'adbear-alt-text-generator' ); return $columns; } public function render_media_column( $column_name, $post_id ) { if ( 'adbear_alt_text_generator' !== $column_name ) { return; } $current_alt = (string) get_post_meta( $post_id, '_wp_attachment_image_alt', true ); $current_title = (string) get_the_title( $post_id ); if ( '' === trim( $current_alt ) || '' === trim( $current_title ) ) { echo '' . esc_html__( 'Needs SEO metadata', 'adbear-alt-text-generator' ) . ''; return; } echo '' . esc_html__( 'Optimized', 'adbear-alt-text-generator' ) . ''; } }