| 开发者 | georgestephanis |
|---|---|
| 更新时间 | 2026年6月18日 23:25 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
src/ for every compiled asset) lives on GitHub at github.com/georgestephanis/plugins.
Decoupling high-frequency data from standard WordPress posts storage, Ndizi records all time logs in a dedicated custom SQL table (wp_ndizi_time_entries). This architectural choice keeps your database queries fast and completely avoids wp_posts and wp_postmeta database inflation.
Key Features
?desc= URL parameter to pre-fill the description input (used by the Chrome extension). Requests browser notification permission and fires a push notification when the active timer exceeds 8 hours.[ndizi_client_portal] shortcode or the Ndizi Client Portal block in the block editor. Clients can review projects, verify tasks, download invoices, and submit new requests.approved and approved_by fields. Once approved, entries cannot be edited or deleted through normal write paths — only the approval status itself can be updated. Approval-only updates bypass lock-date enforcement./wp-json/ndizi/v1/calendar/ical.ndizi_time_off posts with start/end dates, type, and approval status.chrome-extension/) connects to the site's REST API to start/stop timers, browse projects and tasks, and open the standalone tracker — from any browser tab./wp-json/ndizi/v1 let desktop widgets or mobile timekeepers start, stop, log, list, edit, and delete timer entries remotely.wp ndizi time start, wp ndizi time stop, and wp ndizi time status. Accepts project/task names or IDs, user login or ID, description, and billable flag.ndizi-project-management folder to the /wp-content/plugins/ directory, or install it directly via the WordPress Admin Plugins dashboard.wp_ndizi_time_entries and custom roles will be initialized automatically.[ndizi_client_portal] shortcode.Yes. Use the Live Preview button on this page, or launch the demo directly in WordPress Playground. Either way you get a disposable, in-browser WordPress with Ndizi PM activated and seeded with sample clients, projects, tasks, invoices, and time entries (including a live running timer and a locked accounting period). It runs entirely in your browser and nothing is saved.
High-frequency time entries (timer starts, stops, descriptions, and durations) are logged in the dedicated wp_ndizi_time_entries table. Relational objects like Projects and Tasks utilize standard Custom Post Types to maintain editing workflows, list filters, and default REST support.
No. While standard WordPress accounts are fully supported, you can generate a private Client Auth Key for any Client CPT. Navigating to the client portal with ?ndizi_token=YOUR_KEY authorizes their session, setting a secure cookie that keeps them logged in.
Discussion boards on tasks and projects utilize WordPress's native comments database but filter comments to only show portal discussions. If files are uploaded through the intake forms or discussion boxes, they are saved as secure media attachments in the uploads directory and associated with the comment meta.
Inside any Invoice post, choose the parent Project. The dashboard will query the time logging database for all un-invoiced billable hours on that project. The billing rate for each time entry is resolved hierarchically: task-level override first, then the assigned user's default rate, then the project's default rate. Select the hours to include and the editor will aggregate the line items, calculate the total, and lock those time entries to the invoice.
The lock date (configured on the Settings page) prevents any time entry dated on or before that date from being created, edited, or deleted. Use it to protect finalized billing periods once invoices have been sent. The lock is enforced across the REST API, direct DB operations, and the admin UI.
When generating an invoice or report, Ndizi resolves the billing rate in this order: (1) the task's own hourly rate override, (2) the assigned user's billing rate from their profile, (3) the project's default hourly rate. An explicit rate of 0.00 at any level is honored rather than falling through to the next tier, making it possible to mark individual tasks or projects as pro-bono.
Yes. The Reports dashboard has an "Export QuickBooks CSV" button that downloads a CSV formatted for direct import into QuickBooks (Customer, Item, Date, Hours, Rate, Description columns). The active date range, project, and user filters carry through to the export. A standard CSV export is also available from the same dashboard. Individual invoice line items can be exported as CSV or JSON from the invoice editor screen.
Yes. Use wp ndizi time start --project="My Project" --description="Working on feature X" to start a timer, wp ndizi time stop to stop it, and wp ndizi time status to check what's running. All commands accept --user=<login|id> to target a specific team member. --project and --task accept either an exact post title or a post ID.
Yes. Fully authenticated REST routes are exposed under /wp-json/ndizi/v1/time for starting, stopping, logging, listing, editing, and deleting timer entries. This enables desktop timekeepers, browser extensions, or mobile apps to communicate with the plugin. All write routes enforce the lock date.
Yes. The Integrations module posts JSON webhook payloads to a configurable URL on timer CRUD operations, CPT status transitions, and task/invoice metadata changes. A separate Slack webhook URL field sends formatted messages to any Slack channel. The Notifications module sends email to assigned team members when a task is assigned or when its status changes.
Yes. The Settings page (Ndizi PM → Settings) lists all feature modules. Uncheck any module to disable it. Inactive modules are not loaded by the plugin, so their CPTs, hooks, and admin pages simply don't exist — useful for keeping things lean on sites that only need time tracking without the full feature set.
The uncompressed, human-readable source for every compiled asset in build/ ships alongside it in the src/ directory of the plugin (and is mirrored in the public Git repository at https://github.com/georgestephanis/plugins). The assets are built with @wordpress/scripts: run npm install followed by npm run build:all (which runs npm run build:vendor and npm run build) to regenerate the contents of build/ from src/.
src/ directory is included in the package, and the readme documents how to rebuild build/ from it.wp_enqueue_*, wp_localize_script(), wp_add_inline_script(), wp_add_inline_style(), wp_print_styles()/wp_print_scripts()) instead of hardcoded <link>/<script> tags or echoed <style> blocks.rest_url() (and add_query_arg()) instead of hardcoding the /wp-json/ path, so the iCal feed and Stripe webhook URLs work across custom REST prefixes._load_textdomain_just_in_time notice (WP 6.7+) caused by translations running before the init action; the module registry is now translation-free and labels load at display time.@wordpress/dataviews: sortable, filterable table of all time logs with merged Project/Task and Date columns.build/vendor-dataviews.js/.css) registered as the ndizi-dataviews script/style handles for reuse across admin screens.approved_by controlled server-side, dev seeder (?ndizi_seed) guarded against unauthorized use, REST error codes/statuses mapped correctly for time-log writes, and per_page/page clamped on time-log queries./wp-json/ndizi/v1/calendar/ical.ndizi_time_off CPT posts).approved / approved_by DB columns; approved entries block edits and deletion.?desc= pre-fill parameter.ndizi_db_version version check.GET /calendar/ical, POST /invoices/<id>/pay, POST /stripe/webhook REST routes added.rest_url for client-side REST calls.Ndizi_Abilities for agentic/MCP workflows.wp_ndizi_time_entries).wp ndizi time command group (start, stop, status).