We all know there are some shit plugins and themes and builders out there that doesnt add labels or its not user friendly to setup the labels on them so I decided to code this for those edge cases. Solving label issue without opening the ancient setups….
This script automatically adds accessible labels to all form fields (except buttons & checkboxes) if they don’t already have one. The label uses the placeholder, option text, or name as label text. It improves form accessibility for users and screen readers

// change with your #id or .class of your form var formSelector = "form"; document.querySelectorAll(formSelector).forEach(function(form) { var inputs = form.querySelectorAll('input, textarea, select'); inputs.forEach(function(input) { // Skip if already labeled if (input.previousElementSibling && input.previousElementSibling.tagName === 'LABEL') return; // Skip buttons and checkboxes if ( input.type === 'button' || input.type === 'submit' || input.type === 'reset' || input.type === 'checkbox' ) return; var labelText = ''; if (input.placeholder && input.placeholder.trim().length > 0) { labelText = input.placeholder.trim(); } else if (input.tagName === 'SELECT') { var firstOption = input.querySelector('option'); if (firstOption) labelText = firstOption.textContent.trim(); } else if (input.name) { labelText = input.name; } else { labelText = 'Input'; } // Create and style label var label = document.createElement('label'); label.textContent = labelText; label.className = 'accessible-label'; // Updated class // Generate unique id if missing, to associate label if (!input.id) { input.id = 'input-' + Math.random().toString(36).substr(2, 9); } label.setAttribute('for', input.id); input.parentNode.insertBefore(label, input); }); });
All form fields matched by input, textarea, select
except those explicitly skipped will get labels. In practice, that means labels are generated for:
- Input types:
text, password, email, url, tel, search, number, date/datetime-local/month/week/time, color, range, file, radio, hidden, etc. - Other elements:
<textarea>
and<select>
Skipped (no labels added):
<input type="button">
<input type="submit">
<input type="reset">
<input type="checkbox">