docs(03-03): complete admin notification plan

- Summary documents email notification system implementation
- Admin receives German email on new job submission
- Email includes job details and direct edit link
- Smart triggering prevents spam on updates
- All tasks completed, no deviations

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-14 19:45:34 +09:00
parent 491c4fb535
commit 71d65eee63

View File

@@ -0,0 +1,143 @@
---
phase: 03-job-management-core
plan: 03
subsystem: notifications
tags: [email, admin-notification, wp-mail, post-transitions]
# Dependency graph
requires:
- phase: 03-job-management-core
provides: [job submission form creating pending posts]
provides:
- admin-job-notification
- transition-post-status-pattern
affects: [03-05]
# Tech tracking
tech-stack:
added: []
patterns: [transition-post-status-hook, wp-mail-notifications]
key-files:
created: [includes/class-notifications.php]
modified: [includes/class-ddhh-job-manager.php, ddhh-job-manager.php]
key-decisions:
- "Used transition_post_status to detect only initial pending submissions, avoiding spam on updates"
- "Email sent to admin_email option (WordPress site admin)"
- "Email includes direct edit link for quick access to moderation"
- "Error logging for wp_mail failures (common in Local WP dev)"
patterns-established:
- "Notification pattern: Hook transition_post_status with status guards to trigger on state changes only"
- "Email content: German text with job details and admin action links"
issues-created: []
# Metrics
duration: 8min
completed: 2026-01-14
---
# Phase 3 Plan 3: Admin Notifications Summary
**German email notification to admin on new job submission with title, provider, location, type, and edit link**
## Performance
- **Duration:** 8 min
- **Started:** 2026-01-14T11:00:00Z
- **Completed:** 2026-01-14T11:08:00Z
- **Tasks:** 2
- **Files modified:** 3
## Accomplishments
- Created automated email notification system for new job submissions
- Email sent to site admin immediately when provider submits job for moderation
- Email includes complete job context: title, author, organization, location, type, submission date
- Direct edit link enables one-click access to moderation interface
- Smart triggering prevents spam on post updates (only new → pending transitions)
- Error logging for debugging email issues in Local WP environment
## Task Commits
Each task was committed atomically:
1. **Task 1: Create notification class with admin alert on job submission** - `7aeecae` (feat)
2. **Task 2: Integrate notifications into plugin initialization** - `943544e` (feat)
## Files Created/Modified
- `includes/class-notifications.php` - DDHH_JM_Notifications class with setup_hooks() and send_admin_new_job_notification() method; hooks transition_post_status with guards for job_offer + new pending status; sends German email via wp_mail() with job details and edit link; logs errors if wp_mail fails
- `includes/class-ddhh-job-manager.php` - Added init action hook for DDHH_JM_Notifications::setup_hooks() following existing pattern (matches Access_Control, Dashboard, etc.)
- `ddhh-job-manager.php` - Added require_once for class-notifications.php
## Email Template
The email sent to admin includes:
**Subject:** Neues Stellenangebot zur Prüfung: {job_title}
**Body:**
```
Ein neues Stellenangebot wurde eingereicht und wartet auf Ihre Prüfung.
Titel: {job_title}
Anbieter: {author_name} ({author_organization})
Standort: {job_location}
Art: {job_type}
Eingereicht am: {submission_date}
Prüfen Sie das Stellenangebot hier:
{edit_link}
---
Diese E-Mail wurde automatisch gesendet.
```
## Technical Details
**Hook Implementation:**
- Hook: `transition_post_status` with priority 10, accepts 3 params ($new_status, $old_status, $post)
- Guards: Only trigger when post_type === 'job_offer' AND new_status === 'pending' AND old_status !== 'pending'
- This prevents email spam when admins save/update pending posts
**Data Extraction:**
- Admin email: `get_option('admin_email')`
- Author org: `get_user_meta($post->post_author, 'ddhh_org_name', true)`
- ACF fields: `get_field('job_location')`, `get_field('job_type')`
- Date: `get_the_date('d.m.Y H:i', $post_id)`
- Edit link: `get_edit_post_link($post_id, '')`
**Email Sending:**
- Function: `wp_mail()`
- Headers: 'Content-Type: text/html; charset=UTF-8'
- Body: Plain text converted to HTML with `nl2br(esc_html())`
- Error handling: Logs to error_log if wp_mail() returns false
## Decisions Made
**transition_post_status vs save_post:** Used transition_post_status because it provides old and new status, enabling precise detection of initial pending submission vs subsequent updates. This prevents duplicate notifications when admins edit pending posts.
**Error logging strategy:** wp_mail() can fail silently in Local WP environments where email is disabled. Added error_log() calls for both missing admin_email and wp_mail() failures so developers can see what's happening during testing.
**Email format:** Used plain text with nl2br() conversion rather than HTML templates. Simpler, more reliable across email clients, and sufficient for admin notification use case.
**Edit link priority:** Made edit link prominent in email (separate line with clear call-to-action text) because quick access to moderation is the primary admin need when notified.
## Deviations from Plan
None - plan executed exactly as written.
## Issues Encountered
None - implementation proceeded smoothly. wp_mail() and transition_post_status are well-documented WordPress core functions with established patterns.
## Next Phase Readiness
Ready for 03-04 (admin UI enhancements) and 03-05 (job deactivation). Admin notification system is functional and will trigger whenever providers submit new jobs. The notification provides all context needed for efficient moderation workflow.
---
*Phase: 03-job-management-core*
*Completed: 2026-01-14*