get_upload_directory(); if ( ! file_exists( $upload_dir ) ) { if ( ! wp_mkdir_p( $upload_dir ) ) { accessibility_audio_tts_debug_log( 'Failed to create upload directory: ' . $upload_dir ); return false; } // Create .htaccess file to protect directory. $htaccess_content = "# Disable directory browsing\n"; $htaccess_content .= "Options -Indexes\n\n"; $htaccess_content .= "# Protect audio files\n"; $htaccess_content .= "\n"; $htaccess_content .= " \n"; $htaccess_content .= " RewriteEngine On\n"; $server = is_array( $_SERVER ) ? array_map( 'sanitize_text_field', wp_unslash( $_SERVER ) ) : array(); $host = $server['HTTP_HOST'] ?? ''; $htaccess_content .= ' RewriteCond %{HTTP_REFERER} !^https?://(www\\.)?' . $host . " [NC]\n"; $htaccess_content .= " RewriteRule .* - [F]\n"; $htaccess_content .= " \n"; $htaccess_content .= "\n"; global $wp_filesystem; if ( ! $wp_filesystem ) { require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); } if ( $wp_filesystem ) { $wp_filesystem->put_contents( $upload_dir . '/.htaccess', $htaccess_content ); } else { // Fallback when WP_Filesystem is unavailable (local filesystem only). file_put_contents( $upload_dir . '/.htaccess', $htaccess_content ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents } } return true; } /** * Generate filename for post. * * @param int $post_id Post ID. * @param string $extension File extension. * @return string Generated filename. */ protected function generate_filename_for_post( int $post_id, string $extension = 'mp3' ): string { return 'post_' . $post_id . '_' . md5( 'accessibility_audio_tts_' . $post_id . '_' . time() ) . '.' . $extension; } /** * Check and fix file permissions. * * @return bool True if permissions were checked and fixed. */ public function check_and_fix_permissions(): bool { $upload_dir = $this->get_upload_directory(); if ( ! file_exists( $upload_dir ) ) { return $this->ensure_upload_directory(); } // Fix directory permissions. global $wp_filesystem; if ( ! $wp_filesystem ) { require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); } if ( $wp_filesystem && method_exists( $wp_filesystem, 'chmod' ) ) { $wp_filesystem->chmod( $upload_dir, 0755 ); } else { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_chmod chmod( $upload_dir, 0755 ); } // Fix file permissions. $files = glob( $upload_dir . '/*' ); foreach ( $files as $file ) { if ( is_file( $file ) ) { if ( $wp_filesystem && method_exists( $wp_filesystem, 'chmod' ) ) { $wp_filesystem->chmod( $file, 0644 ); } else { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_chmod chmod( $file, 0644 ); } } } return true; } }