WordPress Best Practices fΓΌr Agenten
Code-Standards
- WordPress Coding Standards (WPCS) einhalten
- Hooks nutzen: add_action() / add_filter() β NIEMALS Core-Dateien Γ€ndern
- Scripts/Styles via wp_enqueue_script/style laden, NICHT hardcoded
- Alle Strings Translation-Ready: __() und _e()
- Prefixing: Alle Funktionen/Klassen mit Projektname prefixen (vv_, viaviva_)
- Nonces fΓΌr Formulare: wp_nonce_field() / wp_verify_nonce()
- Sanitize Input: sanitize_text_field(), absint(), esc_url(), sanitize_email()
- Escape Output: esc_html(), esc_attr(), esc_url(), wp_kses_post()
- Prepared Statements: $wpdb->prepare() β NIEMALS rohe SQL mit User-Input
Elementor
- Container statt Sections nutzen (Elementor 3.x+)
- Global Widgets fΓΌr wiederkehrende Elemente
- Custom CSS in Widget β Advanced β Custom CSS (nicht inline)
- Responsive: Elementor Breakpoints nutzen, nicht CSS Media Queries
- Performance: unnΓΆtige Widgets vermeiden, Loop Widget fΓΌr dynamische Listen
- Theme Builder fΓΌr Header/Footer/Archive β nicht hardcoded in Theme
- Template Conditions: gezielt einsetzen, nicht "alle Seiten"
Performance
- Bilder: WebP, max-width 1920px, lazy loading, srcset
- CSS: kritisches CSS inline, Rest deferred
- JS: defer oder async wo mΓΆglich
- Cache: Seiten-Cache + Browser-Cache Headers
- DB: Revisionen limitieren (define('WP_POST_REVISIONS', 5))
- Autoload: wp_options mit autoload='yes' minimal halten (<1MB)
- Heartbeat: auf Admin reduzieren
- Target Lighthouse Score: Performance > 85, alle anderen > 90
SEO Checkliste
- Meta-Title: max 60 Zeichen, Keyword vorn
- Meta-Description: max 160 Zeichen, Handlungsaufforderung
- H1: genau einmal pro Seite
- Alt-Text auf jedem Bild (beschreibend, nicht keyword-stuffend)
- Interne Verlinkung: 2-3 Links pro Seite
- Schema.org: Article, Product, Organization je nach Typ
- Canonical URL: immer setzen
- Sitemap: automatisch generieren, bei Search Console einreichen
- Robots.txt: nichts blockieren was indexiert werden soll
- IndexNow: nach Publish sofort auslΓΆsen
Sicherheit
- NIEMALS: eval(), base64_decode() mit User-Input
- NIEMALS: $wpdb->query() mit nicht-escaped Parametern
- IMMER: Prepared Statements: $wpdb->prepare()
- IMMER: Capability Checks: current_user_can()
- IMMER: File Upload Validierung: wp_check_filetype()
- IMMER: Nonce verification bei POST-Requests
- Updates: Core + Plugins + Themes aktuell halten
- API Tokens: nie in Code committen, nur via wp_options
Plugin-Entwicklung
- Eigenes Plugin pro Feature (nicht functions.php vollstopfen)
- Uninstall-Hook: register_uninstall_hook() fΓΌr sauberes AufrΓ€umen
- Activation/Deactivation Hooks fΓΌr Setup/Cleanup
- Custom Post Types + Taxonomien in eigenem Plugin
- Admin-Notices fΓΌr Feedback: add_action('admin_notices', ...)
- Settings API fΓΌr Plugin-Optionen
- Keine globalen Variablen β Klassen mit __construct und Hooks
Viaviva-spezifisch
- API Token: get_option('viaviva_api_token') β niemals loggen
- Viaviva Sync Plugin: alle WordPress-Operationen ΓΌber /wp-json/viaviva/v1/
- Media Server: ImageMagick/FFmpeg ΓΌber http://media-server:8766 (ai-net)
- Backups vor jedem Deploy: /viaviva/v1/backup β wp-content/viaviva-backups/
- Staging URL Pattern: [site].ultimo.hochfrequenz.tech