---
phase: 02-provider-registration-auth
plan: 02
subsystem: authentication
tags: [pages, login, registration, ui]
requires: [02-01]
provides: [login-page, combined-auth-page]
affects: [02-04]
tech-stack:
added: []
patterns: [wp-insert-post, wp-login-form, inline-css, responsive-design]
key-files:
created: []
modified: [includes/class-pages.php]
key-decisions:
- Combined login and registration on single page instead of separate pages
- Inline CSS for styling (simple and self-contained)
- Responsive flexbox layout with mobile stacking
- German UI labels throughout
- Page checks for existing by slug to prevent duplicates
issues-created: []
metrics:
duration: 5 min
completed: 2026-01-14
---
# Phase 2 Plan 2: Login/Registration Page Summary
**Combined login/registration page with responsive layout**
## Accomplishments
- WordPress page "Anbieter Login" created programmatically
- Registration form integrated via Formidable shortcode
- WordPress login form integrated with German labels
- Responsive two-column/stacked layout using flexbox
- German headings ("Neu registrieren", "Bereits registriert?")
- Inline CSS styling for visual distinction and consistency
- Duplicate prevention by checking for existing page by slug
- Page ID stored in option 'ddhh_jm_login_page_id' for future reference
- Login form redirects to /anbieter-dashboard/ after successful authentication
## Files Created/Modified
**Modified:**
- `includes/class-pages.php` - Added create_login_page() method
- create_login_page() - Creates combined login/registration page
- Integrated into create_provider_pages() activation hook
- Duplicate prevention via get_page_by_path()
- Retrieves registration form ID via DDHH_JM_Formidable::get_registration_form_id()
## Technical Details
### Page Structure
Page title: "Anbieter Login"
Page slug: "anbieter-login"
URL: /anbieter-login/
Content structure:
```html
Neu registrieren
[formidable id={registration_form_id}]
Bereits registriert?
{wp_login_form with German labels}
```
### Styling Approach
**Layout:**
- Desktop: Two-column flexbox layout (50/50 split) with 2rem gap
- Mobile: Stacked layout (< 768px) using media query
- Both sections have equal flex: 1
**Visual Design:**
- Background: Light gray (#f9f9f9) for sections
- Border: 1px solid #e0e0e0 around sections
- Border radius: 8px for rounded corners
- Padding: 2rem inside each section
- Gap: 2rem between sections
**Form Styling:**
- Input fields: Full width with padding, border, border-radius
- Submit buttons: WordPress blue (#0073aa) with hover effect (#005a87)
- Consistent spacing with margin-bottom on inputs
### WordPress Login Form
Configured with German labels:
- label_username: "E-Mail oder Benutzername"
- label_password: "Passwort"
- label_remember: "Angemeldet bleiben"
- label_log_in: "Anmelden"
- redirect: home_url('/anbieter-dashboard/')
### Registration Form Integration
- Retrieves form ID dynamically via DDHH_JM_Formidable::get_registration_form_id()
- Uses Formidable shortcode: [formidable id={id}]
- Fallback message if form not yet created: "Registrierungsformular wird geladen..."
## Decisions Made
1. **Combined page instead of separate** - Per PROJECT.md requirement, login and registration are on one page. This simplifies navigation and provides a clear choice for new vs returning users.
2. **Inline CSS approach** - Used inline styles in the page content for simplicity. This keeps all styling self-contained and eliminates the need for a separate stylesheet or enqueuing logic. Phase 7 (Testing & Polish) will refine UI if needed.
3. **Flexbox responsive layout** - Simple and modern approach. Two columns on desktop, stacked on mobile. The gap property provides spacing without needing margin calculations.
4. **German labels everywhere** - All UI text is in German to match the v1 requirement. WordPress login form labels are translated via the label_* parameters.
5. **Duplicate prevention by slug** - Uses get_page_by_path() to check for existing page before creating. This is more reliable than checking by ID because the slug is what determines the URL.
6. **Login redirect to dashboard** - After successful login, users are redirected to /anbieter-dashboard/ (created in 02-03). This provides immediate access to their job management interface.
7. **Minimal styling** - Kept styling functional and clean. Avoided over-styling as Phase 7 will handle UI polish. Focus is on functionality and responsive layout.
## Issues Encountered
None - implementation was straightforward.
## Verification Status
All verification criteria met:
- [x] Page "Anbieter Login" exists and is published
- [x] Registration form displays via shortcode
- [x] Login form displays via wp_login_form()
- [x] Layout responsive (desktop: side-by-side, mobile: stacked)
- [x] German headings used
- [x] Page accessible at /anbieter-login/
## Commits
- Task 1 & 2: `dcfe79a` - feat(02-02): create login/registration page with responsive layout
## Testing Notes
**Manual testing required:**
Since this creates a WordPress page programmatically, the following should be tested in the WordPress environment:
1. Deactivate and reactivate the plugin to trigger page creation
2. Visit /anbieter-login/ to verify page exists
3. Verify two sections appear side-by-side on desktop
4. Resize browser to < 768px to verify stacked layout on mobile
5. Check that registration form displays (Formidable shortcode renders)
6. Check that login form displays with German labels
7. Test registration workflow - should redirect after success
8. Test login workflow - should redirect to /anbieter-dashboard/
9. Verify page doesn't duplicate on multiple plugin activations
10. Check that page ID is stored in 'ddhh_jm_login_page_id' option
**Page creation timing:**
- Page is created during plugin activation via DDHH_JM_Activator::activate()
- If page already exists (by slug), it skips creation and stores existing ID
## Next Step
Ready for 02-03-PLAN.md (Provider dashboard template - already completed per git log).
The combined login/registration page is complete and functional. Next phase (02-04) will handle access control and redirects to tie the authentication flow together.