| 开发者 | shawnmcburnie |
|---|---|
| 更新时间 | 2026年5月22日 02:44 |
| PHP版本: | 8.2 及以上 |
| WordPress版本: | 6.9 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
%%nettertech_events_event_date%%, %%nettertech_events_event_venue%%, %%nettertech_events_event_organizer%%) let you build dynamic titles per-occurrence. Breadcrumb trail follows the full event hierarchy. Works without either SEO plugin using built-in Schema.org and Open Graph output.
Accessibility throughout: Designed to WCAG 2.2 AA standards with ARIA labels, full keyboard navigation, focus management, and reduced motion support across every public-facing view.
Your data stays yours: All attendee, ticket, and event data is stored in your WordPress database. No data is sent to external services. GDPR tools let site administrators export or erase attendee records on request.
For Developers:
nettertech-events/templates/ - copy to your theme to customizenettertech-events folder to /wp-content/plugins/No. WooCommerce is optional and only needed for paid ticketing. The plugin works without it for event display, calendars, and free RSVP registration.
The free version includes unlimited events, recurring event support, RSVP forms, manual attendee check-in by name or email search, all three display views (calendar, grid, carousel), SEO integration, and full GDPR tools. QR code check-in, volunteer check-in mode, and QR code generation for promotion are available in NetterTech Events Pro.
Yes. The companion plugin NetterTech Events Migrator supports bidirectional migration with The Events Calendar. Import and export cover all 13 entity types including recurring events, venues, organizers, categories, tickets, and attendees with lossless round-trip fidelity.
NetterTech Events pre-computes occurrences using RFC 5545 recurrence rules (the same standard used by Google Calendar and iCal). Rules support patterns like "every second Tuesday" and "last Friday of the month." When you change a rule, occurrences regenerate automatically.
Yes. Series passes grant access to all occurrences of a recurring event with a single purchase. They're configured as a ticket type in the event editor.
Event data is stored in dedicated database tables with indexes built for calendar queries. Calendar views query by date range against pre-computed occurrences rather than scanning post meta. The query load does not scale with total event count the way post-meta-based plugins do.
Copy templates from nettertech-events/templates/ to your-theme/nettertech-events/ and modify as needed. Templates exist for single event pages, occurrence lists, event cards, the calendar view, grid view, and carousel. Your customizations are preserved across plugin updates.
Yes. NetterTech Events is designed for WCAG 2.2 AA compliance with ARIA labels, keyboard navigation, focus management, and reduced motion support across all public-facing views.
Categories are managed through a built-in editor at Events - Categories in the admin menu. They use dedicated database tables rather than WordPress taxonomies, support parent/child hierarchy, and are available as frontend filters in event lists and calendars.
PHP 8.2 or higher. The plugin uses strict types, enums, and constructor property promotion throughout.
NetterTech Events uses its own custom tables and a dedicated URL namespace (/events/ by default). If you have The Events Calendar or another plugin registered to the same URL prefix, there will be a conflict. The plugin detects this on activation and displays a notice with instructions for resolving it.
wp_kses allowlist helper (ShortcodeOutput::get_allowlist()) preserves SVG, ARIA, and data-* attributes that wp_kses_post would strip.RecurrenceRuleBuilder, TicketTypeSaver, CheckInEmailSaver, AttendeeFieldsSaveHandler) no longer fall back on $_POST — callers must pass verified data after nonce/capability checks. Bulk-action handlers extract input only after nonce verification.SecurityHeaders re-anchored to current_screen + WP_Screen API (was reading $_GET on admin_init priority 1).?month= / ?date= to registered query vars nettertech_events_calendar_month / ..._date; legacy URLs 301-redirect to the prefixed format.$_POST['nettertech_events_settings'] at the boundary via map_deep( ..., 'sanitize_textarea_field' ); type-specific tightening continues in SettingsSanitizer.TicketCartAjax sanitizes the JSON ticket payload at the boundary; the prior suppression is removed.EventTemplateResolver::can_preview_event() refactored to close a bypass gap where a malformed ?preview= value could skip nonce verification.Hooks::SETTINGS_TAB_PREFIX . $tab, {filter_prefix}_get_template_part_{slug}) replaced with fixed Hooks::* constants; listeners receive what was previously encoded in the suffix as an action argument. Backward-compat bridges fire the deprecated names alongside the canonical ones (will be removed in 2.0).AdminMenu exposes explicit SUBMENU_NEW, SUBMENU_EDIT, SUBMENU_ATTENDEES, SUBMENU_QR_GENERATOR, SUBMENU_CSV_IMPORT, SUBMENU_ACTIVITY_LOG, SUBMENU_SETTINGS constants. Eight callsites refactored.MigrationManager (legacy ve_* → canonical) state-option keys renamed from nte_rebrand_migration_* to nettertech_events_legacy_rebrand_*. A v1.0.2 upgrade-path transition forwards legacy keys onto the new names for sites that ran the migration under v1.0.0/1.0.1. Only the canonical nettertech_events_legacy_rebrand_complete action fires on completion; the legacy bridge hook was removed for the initial WP.org submission.PrefixMigrationManager loads its old/new prefix maps from config/legacy-prefix-map.json instead of carrying nte_* literals in PHP source. The remaining nte_* mentions in production source are confined to the MigrationManager legacy-rename code path: state-transition source-key strings (nte_rebrand_migration_complete, nte_rebrand_migration_log) read on upgrade from v1.0.0/1.0.1, the intermediate post-type and taxonomy slugs targeted by the ve_* → canonical rename, and docblock examples documenting them. No nte_* literal is emitted at steady-state runtime.TemplateContext (or EmailContext for email templates) as a single $context parameter instead of injecting locals via extract(). Thirty-two templates refactored to property-style access ($context->event). The NonPrefixedVariableFound suppressions across templates/ are gone (was 38).LICENSE, NOTICE, CHANGELOG.md, README.md, tests, examples) excluded from the distribution zip. The "Bundled Third-Party Libraries" section of this readme.txt is the authoritative attribution surface (a standalone CREDITS.md was previously used and has been inlined here). License selected for the dual-licensed chillerlan/php-qrcode dependency: MIT (GPL-2.0 compatible)..eslintignore removed from the distribution (Plugin Check's "hidden files are not permitted" rule).nte_* prefix identifiers to nettertech_events_* to satisfy WP.org plugin review's 4-character minimum prefix requirement (hooks, options, post/user/order-item meta keys, transients, AJAX action strings, nonces, $POST keys, JS-localized variables, table prefixes, cron hook names)nte_event to nettertech_event (16 chars; the originally-planned 23-char name exceeded WP core's 20-char register_post_type() limit and would have silently failed registration)nettertech_event_category and nettertech_event_tag for safer headroom under WP's 32-char taxonomy slug limitnte-public-ticket to nettertech-events-public-ticketwp_unslash() and sanitize_text_field() to 13 superglobal access points flagged by WordPress.Security.ValidatedSanitizedInput sniff (Rentals: 11 sites; Seating: 2 sites)PrefixMigrationManager class (Step 2 migration, separate from the existing legacy ve_* → nte_* MigrationManager) automatically renames all DB-persisted artifacts on plugin upgrade — custom tables (RENAME TABLE), wp_posts.post_type, wp_term_taxonomy.taxonomy, options (exact-match per key, no broad REPLACE), wp_postmeta/wp_usermeta/wp_woocommerce_order_itemmeta keys, transients (cache vs stateful classification), cron hook reschedule with cadence preserved, and shortcode rewrites in wp_posts.post_contentplugins_loaded priority 20 fallback check, so addons activated after base migrate independently. Each addon has its own completion flag and log option.update_option( 'nettertech_events_prefix_migration_complete', '' ) before upgrade only if they want the migration to re-run; otherwise the migration runs automatically on plugin update.wpseo_register_var_replacement() were renamed from %%nte_event_date%%, %%nte_event_venue%%, %%nte_event_organizer%% to %%nettertech_events_event_date%%, %%nettertech_events_event_venue%%, %%nettertech_events_event_organizer%%. Sites with the legacy variable names in their Yoast title templates will need to update those templates after the upgrade — the old names no longer resolve and will render as the literal string. Rank Math equivalents were already migrated and are unaffected.nte_* references out of comments, PHPDocs, local PHP variable names, test fixtures, block render templates, Beaver Builder module render templates, and the uninstall handler. The only remaining nte_* strings in the codebase are inside MigrationManager.php (Step-1 ve_* → nte_* migrator, never executes on a fresh install) and PrefixMigrationManager.php (Step-2 input keys for the rename map). Both are documented carve-outs.uninstall.php was deleting transients matching _transient_nte_% (the pre-1.0.1 prefix) which would have left nettertech_events_* transients orphaned on uninstall after the migration ran. Pattern updated to match the post-migration prefix.uninstall.php was filtering shadow posts by the post-type slug 'nettertech_events_event' (23 chars; exceeded WP's 20-char limit and was never the live slug). Replaced with the canonical ShadowPostType::POST_TYPE constant so it stays in sync with the registered slug.