{"id":320847,"date":"2026-06-13T07:00:45","date_gmt":"2026-06-13T07:00:45","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tradeschool-manager\/"},"modified":"2026-09-19T17:30:08","modified_gmt":"2026-09-19T17:30:08","slug":"tradeschool-manager","status":"publish","type":"plugin","link":"https:\/\/frp.wordpress.org\/plugins\/tradeschool-manager\/","author":23302697,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.25","stable_tag":"1.1.25","tested":"7.1.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"TradeSchool Manager","header_author":"CJs Web Service","header_description":"Complete LMS for trade schools and vocational programs: students, classes, gradebook, attendance, school years, portals, reports, CSV import\/export and email (Brevo built-in). Extend with paid add-ons for Certificates, Reports & Transcripts, Workshops, Applications, Invoicing & Contracts, and Custom Fields. Learn more at tradeschoolmanager.com.","assets_banners_color":"66778c","last_updated":"2026-09-19 17:30:08","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/tradeschoolmanager.com\/","header_plugin_uri":"https:\/\/tradeschoolmanager.com\/","header_author_uri":"https:\/\/profiles.wordpress.org\/cburleigh\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":498,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.18":{"tag":"1.1.18","author":"cburleigh","date":"2026-06-13 16:51:52","revision":3571206},"1.1.19":{"tag":"1.1.19","author":"cburleigh","date":"2026-06-13 17:36:17","revision":3571222},"1.1.20":{"tag":"1.1.20","author":"cburleigh","date":"2026-06-26 23:55:01","revision":3587730},"1.1.21":{"tag":"1.1.21","author":"cburleigh","date":"2026-09-03 02:58:21","revision":3678887},"1.1.22":{"tag":"1.1.22","author":"cburleigh","date":"2026-09-18 03:36:15","revision":3701245},"1.1.23":{"tag":"1.1.23","author":"cburleigh","date":"2026-09-19 17:01:20","revision":3703502},"1.1.24":{"tag":"1.1.24","author":"cburleigh","date":"2026-09-19 17:12:06","revision":3703511},"1.1.25":{"tag":"1.1.25","author":"cburleigh","date":"2026-09-19 17:30:08","revision":3703517}},"upgrade_notice":{"1.1.25":"<p>Urgent packaging fix for incomplete 1.1.22 through 1.1.24 downloads. Includes all required PHP files. Replace the plugin in place; do not uninstall or delete stored data. If admin is unavailable, ask your host to restore the complete plugin files. No additional database migration beyond 1.1.22.<\/p>","1.1.23":"<p>Urgent update for sites affected by missing PHP files in the WordPress.org 1.1.22 package. Replace the plugin in place; do not uninstall or delete stored data. If admin is unavailable, ask your host to restore the complete plugin files. No additional database migration beyond 1.1.22.<\/p>","1.1.22":"<p>Back up before upgrading core and the affected add-ons together. Adds Student Numbers and safer CSV, deletion, attendance, and completion handling. Completion and permanent deletion require InnoDB. See the upgrade FAQ and included guides.<\/p>","1.1.21":"<p>Adds additive Class Enrollments CSV import\/export and confirms compatibility with WordPress 7.1.<\/p>","1.1.19":"<p>Fixes shared PDF logo handling and adds clear admin report-card and roster PDF downloads under Gradebook &gt; Class Reports.<\/p>","1.1.18":"<p>Improves the branded admin sidebar order, add-on visibility, and footer polish.<\/p>","1.1.17":"<p>Restores reliable student portal and teacher portal tab behavior after the enqueued inline asset changes.<\/p>","1.1.16":"<p>Addresses WordPress.org review concerns around scoped notices, enqueued assets, sanitized hook payloads, prefixed hooks\/uninstall cleanup, contributors, and bundled library versions.<\/p>","1.1.15":"<p>Addresses the main WordPress.org review concerns around admin notices, named inline assets, contributor metadata, and hook payload sanitization.<\/p>","1.1.14":"<p>Suppresses false positive Plugin Check prefix warnings on intentional public extension hooks.<\/p>","1.1.13":"<p>Corrects Plugin Check prefix warnings for custom hooks and uninstall cleanup.<\/p>","1.1.12":"<p>Uses long plugin-derived prefixes for the remaining Plugin Check naming warnings.<\/p>","1.1.11":"<p>Repository-check cleanup for core extension hooks and uninstall naming.<\/p>","1.1.10":"<p>Improves license management routing for Reports &amp; Transcripts and Workshops from the core Add-ons screen.<\/p>","1.1.9":"<p>Repository-check cleanup for hook names, uninstall helper naming, and main file line endings.<\/p>","1.1.8":"<p>Adds the shared invoice context fields used by workshop instance billing.<\/p>","1.1.7":"<p>The built-in class report now lives under Gradebook &gt; Class Reports, and the Reports menu is reserved for the Reports &amp; Transcripts add-on.<\/p>","1.1.6":"<p>Adds teacher portal hooks needed by the Workshops add-on teacher workflow.<\/p>","1.1.5":"<p>Shared PDF reports can now use landscape layout for wider report tables.<\/p>","1.1.4":"<p>Stripe setup is now managed from Invoicing &gt; Stripe instead of the core Settings tabs.<\/p>","1.1.3":"<p>Inactive registered add-ons now open the Freemius license popup from Settings &gt; Add-ons instead of sending administrators to a blocked account URL.<\/p>","1.1.2":"<p>Inactive Freemius add-ons now show the correct Add-ons dashboard state and route administrators to the license-key screen.<\/p>","1.1.1":"<p>Uses stable add-on license management pages from Settings &gt; Add-ons.<\/p>","1.1.0":"<p>Stable launch release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3571204,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3571204,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3571204,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3571204,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.18","1.1.19","1.1.20","1.1.21","1.1.22","1.1.23","1.1.24","1.1.25"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3570792,"resolution":"1","location":"assets","locale":"","width":1907,"height":866},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3570792,"resolution":"2","location":"assets","locale":"","width":1903,"height":923},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3570792,"resolution":"3","location":"assets","locale":"","width":1907,"height":865},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3570792,"resolution":"4","location":"assets","locale":"","width":1907,"height":924},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3570792,"resolution":"5","location":"assets","locale":"","width":1904,"height":897},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3570792,"resolution":"6","location":"assets","locale":"","width":1905,"height":845},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3570792,"resolution":"7","location":"assets","locale":"","width":1907,"height":841}},"screenshots":{"1":"Admin dashboard with class averages and active-school-year context.","2":"Student profile management with enrollment, class, and portal account details.","3":"Gradebook entry with weighted categories and extra credit.","4":"Program setup with schedule, passing percentage, and tuition defaults.","5":"Attendance session history with roster status details.","6":"Student portal payments and profile overview in the focused portal layout.","7":"Teacher portal class assignment view with workshop access and grading actions."}},"plugin_section":[262246],"plugin_tags":[5877,7151,2195,11707,17659],"plugin_category":[],"plugin_contributors":[266917],"plugin_business_model":[],"class_list":["post-320847","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-attendance","plugin_tags-gradebook","plugin_tags-lms","plugin_tags-school","plugin_tags-students","plugin_contributors-cburleigh","plugin_committers-cburleigh"],"banners":{"banner":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/banner-772x250.png?rev=3571204","banner_2x":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/banner-1544x500.png?rev=3571204","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/icon-128x128.png?rev=3571204","icon_2x":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/icon-256x256.png?rev=3571204","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/screenshot-1.png?rev=3570792","caption":"Admin dashboard with class averages and active-school-year context."},{"src":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/screenshot-2.png?rev=3570792","caption":"Student profile management with enrollment, class, and portal account details."},{"src":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/screenshot-3.png?rev=3570792","caption":"Gradebook entry with weighted categories and extra credit."},{"src":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/screenshot-4.png?rev=3570792","caption":"Program setup with schedule, passing percentage, and tuition defaults."},{"src":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/screenshot-5.png?rev=3570792","caption":"Attendance session history with roster status details."},{"src":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/screenshot-6.png?rev=3570792","caption":"Student portal payments and profile overview in the focused portal layout."},{"src":"https:\/\/ps.w.org\/tradeschool-manager\/assets\/screenshot-7.png?rev=3570792","caption":"Teacher portal class assignment view with workshop access and grading actions."}],"raw_content":"<!--section=description-->\n<p><strong>TradeSchool Manager<\/strong> is a purpose-built student-information and gradebook plugin for trade schools, vocational programs, certification academies, apprenticeships, and hands-on training providers. Everything runs inside your own WordPress install  -  no SaaS accounts, no per-student fees, no monthly subscriptions for the free core.<\/p>\n\n<p>Built and maintained by <strong>CJs Web Service<\/strong> (<a href=\"https:\/\/cjswebservice.com\/\">cjswebservice.com<\/a>). Product home, demos, and documentation live at <a href=\"https:\/\/tradeschoolmanager.com\/\">tradeschoolmanager.com<\/a>.<\/p>\n\n<h4>Why TradeSchool Manager?<\/h4>\n\n<p>Most school plugins are built for K-12 or higher-ed and bury trade-school workflows under features you'll never use. TradeSchool Manager starts from the trade-school workflow:<\/p>\n\n<ul>\n<li>Cohort-based <strong>programs<\/strong> that run across <strong>school years<\/strong>, with a one-click rollover that copies class definitions and assignments into the new year while preserving every prior year's grades, rosters, and attendance untouched.<\/li>\n<li>A <strong>gradebook<\/strong> that supports points, weighted categories, <strong>and pass\/fail<\/strong> (because hands-on competencies aren't a percentage).<\/li>\n<li>A global <strong>Active School Year<\/strong> switcher so dashboards, rosters, and gradebooks always reflect the year you're actually working in.<\/li>\n<li>Admin-side, branded, print-ready <strong>PDF report cards and class rosters<\/strong> out of the box.<\/li>\n<li><strong>Student and teacher portals<\/strong> as front-end shortcodes you drop onto any WordPress page  -  no separate app to host.<\/li>\n<\/ul>\n\n<h4>What's in the free core<\/h4>\n\n<ul>\n<li><strong>Students &amp; Teachers<\/strong>  -  Profiles with school-assigned Student Numbers, photos, emergency contacts, and portal credentials.<\/li>\n<li><strong>Sponsors &amp; Authorized Contacts<\/strong> - Optional accounts for family members, employers, sponsors, or other approved contacts linked to one or more students.<\/li>\n<li><strong>Programs &amp; School Years<\/strong>  -  Multi-year programs with enrollment, GPA computation, year rollover, and historical preservation.<\/li>\n<li><strong>Classes &amp; Gradebook<\/strong>  -  Points-based, weighted-category, or pass\/fail grading; assignment categories; extra credit; teacher-scoped views.<\/li>\n<li><strong>Attendance<\/strong>  -  Daily attendance tracking with per-class and per-student reports.<\/li>\n<li><strong>Announcements<\/strong>  -  Post school-wide or class-specific announcements visible in the portals.<\/li>\n<li><strong>Student, Teacher, and Sponsor Portals<\/strong> - Front-end shortcodes for grades, assignments, rosters, payments, and linked-student access.<\/li>\n<li><strong>CSV Import\/Export<\/strong>  -  Move students, classes, class enrollments, assignments, and grades without lock-in.<\/li>\n<li><strong>Admin PDF Reports<\/strong>  -  Unified PDF engine renders administrator report cards, class rosters, and statements on your school letterhead.<\/li>\n<li><strong>Active School Year context<\/strong>  -  One global switcher scopes every list, dashboard, and gradebook.<\/li>\n<li><strong>Email delivery via Brevo<\/strong>  -  Built-in, optional. 300 transactional emails\/day on Brevo's free plan; automatic fallback to native <code>wp_mail()<\/code> if the daily cap is reached. You can also skip Brevo entirely and use whatever SMTP plugin you already run.<\/li>\n<\/ul>\n\n<h4>Optional paid add-ons<\/h4>\n\n<p>The free core is fully functional on its own. These capabilities ship as separate add-on plugins from <a href=\"https:\/\/tradeschoolmanager.com\/\">tradeschoolmanager.com<\/a> and are detected at runtime  -  any UI tied to an add-on stays hidden when that add-on isn't installed.<\/p>\n\n<ul>\n<li><strong>Certificates<\/strong>  -  Auto-issued PDF certificates of completion with reminder emails.<\/li>\n<li><strong>Reports &amp; Transcripts<\/strong>  -  Multi-year transcripts, summary report cards, GPA, credits.<\/li>\n<li><strong>Workshops<\/strong>  -  Short-form, year-agnostic courses with their own gradebook and completion certificates.<\/li>\n<li><strong>Applications<\/strong>  -  Public application forms and an admissions pipeline.<\/li>\n<li><strong>Invoicing &amp; Contracts<\/strong>  -  Tuition invoicing, payment plans, e-sign contracts, and optional Stripe checkout.<\/li>\n<li><strong>Custom Fields &amp; Student Documents<\/strong>  -  Per-program metadata plus audit-logged document uploads for government compliance.<\/li>\n<\/ul>\n\n<h4>Who it's for<\/h4>\n\n<ul>\n<li>Trade schools (electrical, plumbing, HVAC, welding, automotive, construction)<\/li>\n<li>Cosmetology, esthetics, and barbering schools<\/li>\n<li>CDL, heavy-equipment, and aviation training<\/li>\n<li>Allied health, nursing assistant, and phlebotomy programs<\/li>\n<li>Coding bootcamps and short-form vocational programs<\/li>\n<li>Apprenticeship and union training programs<\/li>\n<li>Anyone running cohort-based, hands-on training out of WordPress<\/li>\n<\/ul>\n\n<h4>External services<\/h4>\n\n<p>The free plugin makes <strong>no calls to external services<\/strong> until you opt in to Brevo email delivery (which requires a free Brevo account and an API key). Optional add-ons may integrate with Stripe (payments); those add-ons are downloaded separately and have their own privacy disclosures.<\/p>\n\n<ul>\n<li>Brevo (optional, free core): Transactional email via the Brevo HTTP API. Only the message payload (to\/from\/subject\/body) is sent, and only when you supply an API key in <strong>TradeSchool &gt; Settings &gt; Email<\/strong>. Brevo terms: <a href=\"https:\/\/www.brevo.com\/legal\/termsofuse\/\">brevo.com\/legal\/termsofuse<\/a>. Privacy: <a href=\"https:\/\/www.brevo.com\/legal\/privacypolicy\/\">brevo.com\/legal\/privacypolicy<\/a>.<\/li>\n<\/ul>\n\n<h4>Support &amp; contributing<\/h4>\n\n<ul>\n<li>Product site, demos, docs: <a href=\"https:\/\/tradeschoolmanager.com\/\">tradeschoolmanager.com<\/a><\/li>\n<li>Author: CJs Web Service  -  <a href=\"https:\/\/cjswebservice.com\/\">cjswebservice.com<\/a><\/li>\n<li>Issues and feature requests: through the WordPress.org support forum for this plugin<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin via <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>, or extract to <code>\/wp-content\/plugins\/tradeschool-manager\/<\/code>.<\/li>\n<li>Activate <strong>TradeSchool Manager<\/strong> through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Visit <strong>TradeSchool &gt; Settings<\/strong> to set your school name, logo, currency, and email-from address.<\/li>\n<li>Create your first <strong>School Year<\/strong>, then your first <strong>Program<\/strong> and <strong>Classes<\/strong>.<\/li>\n<li>Create dedicated WordPress pages for the portals and add the shortcodes (see <strong>TradeSchool &gt; About<\/strong> for the full list):\n\n<ul>\n<li><code>[tsm_student_portal]<\/code><\/li>\n<li><code>[tsm_teacher_portal]<\/code><\/li>\n<li><code>[tsm_parent_portal]<\/code><\/li>\n<\/ul><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20upgrade%20to%201.1.25%20with%20the%20paid%20add-ons%3F\"><h3>How do I upgrade to 1.1.25 with the paid add-ons?<\/h3><\/dt>\n<dd><p>Back up the database and uploads, then test on a staging copy. Replace the core plugin in place; keep the folder <code>tradeschool-manager<\/code> and do not uninstall it. Update installed Certificates to 1.3.19, Workshops to 1.0.25, Custom Fields &amp; Student Documents to 1.2.18, and Invoicing &amp; Contracts to 1.1.10 as part of the same upgrade. Internal IDs and existing add-on relationships do not change.<\/p>\n\n<p>Permanent deletion now requires InnoDB storage for the affected tables and an updated, active cleanup provider when related add-on records exist. If a provider is unavailable, deletion stops instead of abandoning its records. Use Drop\/Archive when you want to keep history. Archived academic records must be unarchived before permanent deletion. Related private files are removed only after the database commit; failed removals are queued for retry.<\/p><\/dd>\n<dt id=\"how%20do%20i%20import%20students%20and%20enrollments%20without%20changing%20their%20identifiers%3F\"><h3>How do I import students and enrollments without changing their identifiers?<\/h3><\/dt>\n<dd><p>For new students, leave <code>id<\/code> blank, place your school's ID in <code>student_number<\/code>, and supply at least a first or last name, or an email. Student Number is optional and unique when nonblank. Keep identifier columns formatted as Text in spreadsheet software so it does not remove leading zeros.<\/p>\n\n<p>For an existing student, enable <strong>Update existing<\/strong> and identify the student by internal <code>id<\/code>, <code>student_number<\/code>, or email. A supplied internal <code>id<\/code> must already exist. Conflicting identifiers skip the row. To change only a phone number, for example, include only <code>student_number,phone<\/code>; omitted columns (including photos) are preserved. A supplied blank cell clears that field, except a blank password never clears the password.<\/p>\n\n<p>Class Enrollments links existing students to existing classes. Use one student identifier (<code>student_id<\/code>, <code>student_number<\/code>, or <code>student_email<\/code>), and either <code>class_id<\/code> or <code>class_name<\/code> plus the visible <code>school_year<\/code> name. If you supply extra identifiers, all must exist and agree. Clear unused columns and remove example rows. Invalid IDs do not fall back to names. Assignment imports follow the same class-matching rule in both import screens. Enrollment imports are additive; they do not unenroll students missing from the file.<\/p>\n\n<p>New exports include <code>_tsm_csv_encoding=tsm-v1<\/code> so spreadsheet-safe apostrophe escaping can be reversed when re-imported. Keep this column and the escape characters unchanged when editing an export. For IDs with intentional leading apostrophes, the export doubles that first apostrophe. Do not add the encoding column to files from another platform. Older\/unmarked files are read literally; check formula-prefixed IDs in old exports before importing. Spreadsheet software can still change text\/number formatting, so review the CSV before importing.<\/p><\/dd>\n<dt id=\"does%20the%20free%20plugin%20require%20a%20license%20key%20or%20external%20account%3F\"><h3>Does the free plugin require a license key or external account?<\/h3><\/dt>\n<dd><p>No. The free plugin runs entirely on your own WordPress install with no key validation and no calls home. Email via Brevo is opt-in and requires only a free Brevo account.<\/p><\/dd>\n<dt id=\"can%20i%20migrate%20to%20a%20new%20school%20year%20without%20losing%20history%3F\"><h3>Can I migrate to a new school year without losing history?<\/h3><\/dt>\n<dd><p>Yes. The Year Rollover tool copies class definitions and assignments into a new year while preserving the source year's roster, grades, and attendance exactly as they were. Prior-year report cards and reports continue to render correctly forever.<\/p><\/dd>\n<dt id=\"can%20students%20see%20only%20their%20own%20data%3F\"><h3>Can students see only their own data?<\/h3><\/dt>\n<dd><p>Yes. The student portal authenticates against the student record and scopes every query to that student. Teachers similarly only see their assigned classes. Sponsors and authorized contacts only see students they're linked to.<\/p><\/dd>\n<dt id=\"does%20it%20support%20pass%2Ffail%20grading%3F\"><h3>Does it support pass\/fail grading?<\/h3><\/dt>\n<dd><p>Yes. Each class can use points, weighted categories, or pass\/fail. Pass\/fail classes with no graded work display \" - \" rather than a misleading \"Fail\".<\/p><\/dd>\n<dt id=\"how%20do%20i%20take%20payments%20or%20issue%20tuition%20invoices%3F\"><h3>How do I take payments or issue tuition invoices?<\/h3><\/dt>\n<dd><p>Install the optional <strong>Invoicing &amp; Contracts<\/strong> add-on from <a href=\"https:\/\/tradeschoolmanager.com\/\">tradeschoolmanager.com<\/a>. The free plugin does not handle invoicing or payments.<\/p><\/dd>\n<dt id=\"where%20are%20student%20documents%20stored%3F\"><h3>Where are student documents stored?<\/h3><\/dt>\n<dd><p>Document uploads ship in the optional <strong>Custom Fields &amp; Student Documents<\/strong> add-on. When installed, files are stored in a private <code>tsm-private\/student-docs\/<\/code> directory inside <code>wp-content\/uploads<\/code>, protected by an <code>.htaccess<\/code> deny rule and SHA-prefixed filenames, with a full upload\/download\/delete audit log for government chain-of-custody.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20theme%3F\"><h3>Does it work with my theme?<\/h3><\/dt>\n<dd><p>Yes. The portals render inside your active theme via shortcodes and inherit your theme's colors and typography. Optional portal-theme polish is built in and can be disabled per page.<\/p><\/dd>\n<dt id=\"is%20it%20translation-ready%3F\"><h3>Is it translation-ready?<\/h3><\/dt>\n<dd><p>Yes. All user-facing strings use the <code>tradeschool-manager<\/code> text domain. WordPress 4.6+ auto-loads translations hosted on WordPress.org.<\/p><\/dd>\n<dt id=\"can%20the%20students%20csv%20importer%20assign%20existing%20students%20to%20classes%3F\"><h3>Can the Students CSV importer assign existing students to classes?<\/h3><\/dt>\n<dd><p>Class assignments use the separate <strong>Class Enrollments<\/strong> tab under <strong>TradeSchool &gt; Import \/ Export<\/strong>. Identify a student with <code>student_id<\/code> (TradeSchool Manager's internal ID), <code>student_number<\/code> (your school's ID), or <code>student_email<\/code>. Identify a class with <code>class_id<\/code>, or with both <code>class_name<\/code> and <code>school_year<\/code>. The <code>school_year<\/code> value is the visible school-year name. Imports are additive and never unenroll students whose rows are absent.<\/p><\/dd>\n<dt id=\"how%20do%20i%20migrate%20existing%20student%20numbers%20from%20another%20platform%3F\"><h3>How do I migrate existing student numbers from another platform?<\/h3><\/dt>\n<dd><p>Download the Students template under <strong>TradeSchool &gt; Import \/ Export &gt; Students<\/strong>. Leave the <code>id<\/code> column blank for new records and place the previous platform's identifier in <code>student_number<\/code>. Student Numbers are optional text values up to 100 characters, so values such as <code>STU-00087<\/code> are supported. Each nonblank Student Number must be unique. When working in Excel or another spreadsheet application, format the <code>student_number<\/code> column as Text before pasting numeric identifiers so the spreadsheet does not remove leading zeros.<\/p>\n\n<p>When <strong>Update existing students<\/strong> is selected, matching is performed by internal <code>id<\/code>, then <code>student_number<\/code>, then email. If supplied identifiers point to different students, the row is skipped rather than merging records. After importing students, the same <code>student_number<\/code> values can be used in the Class Enrollments CSV.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.25<\/h4>\n\n<ul>\n<li>Corrected the WordPress.org release packaging: added all five required PHP files and the program enrollment guide to version control so they are included in the distributed plugin.<\/li>\n<li>Aligned the plugin version, runtime version and Stable tag with the release tag. Fixes the missing-file startup fatal error in the incomplete 1.1.22 through 1.1.24 packages.<\/li>\n<li>No additional database migration or academic, billing, or add-on behavior changes from the complete 1.1.22 build.<\/li>\n<\/ul>\n\n<h4>1.1.23<\/h4>\n\n<ul>\n<li>Emergency packaging release: includes five required PHP files omitted from the WordPress.org 1.1.22 download, resolving the resulting missing-file fatal error during plugin startup.<\/li>\n<li>Restored the program enrollment documentation omitted from that download. No additional database migration or academic, billing, or add-on behavior changes from the complete 1.1.22 build.<\/li>\n<\/ul>\n\n<h4>1.1.22<\/h4>\n\n<ul>\n<li>Addressed Plugin Check findings: escaped exception messages, unslashed and strictly validated portal session cookies, clarified exact-input validation and dynamic prepared-query checks, corrected reset-form scanner annotations, and normalized shortcode line endings. Enrollment, billing, and add-on record identifiers are unchanged.<\/li>\n<li>Added Reactivate to completed, withdrawn, and archived program enrollments in the student editor, with or without the Invoicing add-on. Restores the existing enrollment without changing student status, class rosters, or billing; existing archived-year and duplicate-active-enrollment protections still apply.<\/li>\n<li>Fixed weighted-category field indexes after removing and adding rows, so valid totals save without one category overwriting another.<\/li>\n<li>Wrapped the admin header, notices, and school-year switcher on narrow screens to prevent phone-width horizontal page overflow.<\/li>\n<li>Hardened student password resets: save new token digests before returning email links, accept exact single-use credentials, and atomically update the password while consuming the token. Existing unexpired legacy links remain compatible.<\/li>\n<li>Invalidated pending reset links when passwords change through the portal or student editor; rejected stale reset submissions and stopped displaying success after failed saves.<\/li>\n<li>Built reset-email links from the configured student login page (site-home fallback), not the incoming Host header. Clarified generic email-delivery messaging and reset-save errors.<\/li>\n<li>Bound student and teacher portal sessions to their current password: password changes and student resets reject older sessions on their next request. Portal password changes sign out the current browser and return to the configured login page. Existing portal sessions require a fresh sign-in once after upgrading; IDs and add-on relationships are unchanged.<\/li>\n<li>Checked session persistence before accepting login, rotated browser session tokens on sign-in, and set HttpOnly\/SameSite cookies (Secure on HTTPS). Sponsor and WordPress user sessions are unchanged.<\/li>\n<li>Made student Drop\/Reinstate actions check reads and writes, reject invalid IDs\/dates, and report failure accurately. Conditional status updates prevent stale requests from overwriting a different current status.<\/li>\n<li>Made repeated Drop\/Reinstate requests no-ops: preserve the original drop date\/reason and avoid duplicate extension notifications. Existing public drop\/reinstate methods retain boolean results.<\/li>\n<li>Clarified that Drop\/Reinstate preserves records and does not cancel class\/program enrollments, billing, payment plans, or student portal access. Reinstatement clears the current drop date\/reason without changing enrollment or financial records.<\/li>\n<li>Hardened assignment saves with checked transactions, protected graded assignments from moving classes, and rejected missing\/archived parents and existing class\/year mismatches without migrating history.<\/li>\n<li>Preserved omitted assignment fields in partial model\/CSV updates, rejected ambiguous Class + Title CSV matches, and validated real dates, nonnegative finite points, and boolean flags. Teacher-portal input now reaches model validation without silently clearing malformed dates.<\/li>\n<li>Added assignment-save notices and class-move guidance; preserved the existing Required flag in the admin editor and retained Pass\/Fail normalization.<\/li>\n<li>Prevented class school-year changes from relocating academic\/financial history: assignments, enrollment, attendance, program links, invoices, and class certificates block the move. Completed\/archived classes remain in their original year; use Rollover for a new year.<\/li>\n<li>Kept year corrections available for unused classes, validated destination year IDs, and applied the same checks to class CSV updates. Added class-editor guidance; existing mismatched records are not automatically migrated.<\/li>\n<li>Made class fields and primary\/co-teacher selections save in one checked transaction. Failed link writes restore the original class and teacher links; class-saved hooks run only after a successful commit.<\/li>\n<li>Validated selected teacher IDs, protected archived-year co-teacher editing, and preserved unchanged co-teacher link IDs and omitted teacher selections in class CSV updates. Existing co-teacher dropdown selections now render without JavaScript.<\/li>\n<li>Added a visible Active\/Inactive teacher portal-access setting. Inactive teachers cannot log in, and existing sessions are rejected on their next request; teaching history and credentials are retained.<\/li>\n<li>Protected teachers linked to classes, co-teaching, or workshops from permanent deletion, including inactive Workshops installations. Unassigned teacher deletion now uses checked transactions and accurate admin notices.<\/li>\n<li>Made existing-enrollment billing replacement and signed-contract synchronization transactional; protected invoices with payment\/refund\/closed-history records from automatic regeneration and prevented duplicate charges.<\/li>\n<li>Validated signed-contract ownership, dates, and schedule totals; Full billing now charges total tuition rather than subtracting an unbilled deposit.<\/li>\n<li>Made program fields and class-link changes atomic, preserved omitted settings and other-year links, and checked enrollment status\/removal results. Programs with historical enrollment\/invoice\/certificate records must be archived instead of deleted.<\/li>\n<li>Protected class enrollments with grade\/attendance history and program enrollments linked to invoices\/contracts from removal; clear result notices replace false success.<\/li>\n<li>Hardened standalone invoice creation, edits, deletion, and voiding with checked transactions; protected payment history and reported email\/status-save failures accurately.<\/li>\n<li>Added keyboard-accessible horizontal scrolling to Students, Teachers, School Years, Classes, Programs, and Assignments tables.<\/li>\n<li>Added collapsible mobile navigation with accessible expanded-state and focus handling; navigation remains available without JavaScript.<\/li>\n<li>Added visible attendance-pill and navigation\/table keyboard focus, consolidated status-pill styles, and replaced the focus-mode text icon with WordPress Dashicons.<\/li>\n<li>Expanded deletion\/removal warnings, moved repeated layout styles into reusable classes, and made bundled documentation navigation responsive. Added Program Enrollments &amp; Billing to the documentation index.<\/li>\n<li>Cleaned up Students list\/add\/edit styling: grouped row actions, labeled action columns, consistent photo previews and Drop\/Reinstate cards, and wrapping profile details\/buttons on smaller screens. Associated built-in field labels and help text with their controls. Student fields, save actions, and add-on hooks are unchanged.<\/li>\n<li>Cleaned up student enrollment\/billing and document panels with keyboard-scrollable tables, grouped actions, consistent textual status pills, labeled billing\/upload controls, and reusable layout classes. Corrected the empty enrollment row's column span when billing is off. Existing billing defaults, upload\/download actions, and license restrictions are unchanged.<\/li>\n<li>Cleaned up Teachers add\/edit\/list screens with associated field labels and password guidance, consistent input widths, wrapping form actions, readable Active\/Inactive badges, grouped row actions, and scoped reusable styles. Teacher access rules, creation locks, and class\/workshop relationships are unchanged.<\/li>\n<li>Cleaned up Classes add\/edit\/list and roster layouts: labeled form fields and dynamic row controls, scrollable co-teacher\/category editors, responsive enrollment controls, and an explicit empty-roster message. Category totals now announce updates to assistive technology. Grading calculations, category visibility, teacher selections, school-year protections, and enrollment actions are unchanged.<\/li>\n<li>Cleaned up School Years, Year Rollover, and Archive with labeled fields\/class selections, consistent Current\/Archived badges, named scroll regions, reusable spacing, and empty-list messages. Source-year selection now stays on Year Rollover and provides a Load classes button without JavaScript; corrected the database variable scope used to display source assignment counts. Copy, archive, and deletion rules are unchanged.<\/li>\n<li>Made new program enrollments transactional across roster links and requested invoices; failed reads, writes, license checks, and commits no longer leave a partially created enrollment or fire success hooks.<\/li>\n<li>Requires the rebuilt Invoicing &amp; Contracts 1.1.10 for automatic new-enrollment billing; Manual billing remains available without the add-on. Invoice numbers are reserved before the transaction, so failed attempts may leave numbering gaps.<\/li>\n<li>Validated enrollment dates, monetary values, school-year\/class relationships, and signed-contract ownership; rejected duplicate active enrollment in the same program\/year and reuse of an already-linked contract.<\/li>\n<li>Preserved the Applications workflow for contracts signed before student creation by binding an unassigned signed contract only to a matching student email and program.<\/li>\n<li>Corrected installment cent allocation so the final installment cannot become negative from accumulated rounding; existing stored invoices are not changed.<\/li>\n<li>Added program-enrollment failure notices, including when the student was saved but their initial enrollment failed. Contract signing now distinguishes a saved signature from failed automatic enrollment\/billing.<\/li>\n<li>Made class\/program completion transactional: checks linked records and school years, rolls back failed cascades, and sends completion hooks only after commit. Requires InnoDB for completion-related tables.<\/li>\n<li>Preserved original completion dates on repeat requests and reported failed completion in the admin instead of showing success. Already-completed linked classes remain unchanged; unfinished archived-year classes block program completion.<\/li>\n<li>Preserved enrollment IDs and original enrollment dates when reactivating class enrollments, and added an admin enrollment result notice.<\/li>\n<li>Coordinated with Certificates 1.3.19 to connect automatic issuance to core's actual completion hooks while retaining legacy integration hooks.<\/li>\n<li>Validated attendance relationships, dates, and statuses; archived years are read-only in both the admin and teacher portal, and failed writes no longer display success.<\/li>\n<li>Fixed teacher attendance notes not being saved and preserved existing notes\/record IDs for status-only updates.<\/li>\n<li>Preserved omitted class settings during edits\/imports and expanded class CSV exports to include description, status, passing threshold, credits, and weighted-category configuration.<\/li>\n<li>Rejected invalid or ambiguous class-definition CSV identifiers instead of silently updating another class; checked class save results.<\/li>\n<li>Restricted school-year deletion to empty years so classes, assignments, and program enrollments cannot be orphaned; added date\/save validation and recovery from a deleted active-year selection.<\/li>\n<li>Preserved passing thresholds and credits during year rollover and reported incomplete copies with a warning instead of implying all records were copied.<\/li>\n<li>Validated teacher profile emails before saving, handled failed photo\/profile\/password saves, preserved omitted teacher fields, and rejected deleted-teacher sessions.<\/li>\n<li>Hardened deletion across core and updated add-ons: checks database operations and commit results, requires transactional tables, blocks missing cleanup providers, and defers file removal until commit using a durable retry queue.<\/li>\n<li>Protected archived academic history from permanent student\/class\/assignment deletion, including assignments cascaded from a class and student-linked audit records.<\/li>\n<li>Fixed class certificate cleanup so workshop certificates with the same numeric scope ID are preserved; shared certificate files and certificate template files are retained.<\/li>\n<li>Consolidated both assignment CSV import screens onto one strict class resolver; invalid or conflicting supplied IDs no longer fall back to another record.<\/li>\n<li>Preserved omitted student fields during partial imports, allowed Student Number-only updates, and added reversible formula-safe CSV export encoding.<\/li>\n<li>Checked assignment and grade persistence results, corrected import\/rollover counts, and suppressed successful grade notifications when a write fails.<\/li>\n<li>Revoked deleted-student sessions, validated profile emails before sanitizing, and retained failed profile form values privately for ten minutes.<\/li>\n<li>Added an optional, unique Student Number for school-assigned or legacy platform identifiers without changing TradeSchool Manager's internal student IDs.<\/li>\n<li>Added Student Number to student forms, profiles, admin tables, and Students CSV import\/export while preserving leading zeros and alphanumeric values.<\/li>\n<li>Added Student Number matching to Class Enrollments imports and exports.<\/li>\n<li>Added safe import conflict detection so mismatched internal IDs, Student Numbers, and email addresses cannot merge different students.<\/li>\n<li>Kept all core and add-on relationships on the existing internal student ID for backward compatibility.<\/li>\n<li>Fixed permanent student deletion so core enrollments, grades, attendance, billing records, notes, custom values, program enrollments, and parent links are removed before the student record.<\/li>\n<li>Added coordinated add-on deletion providers and post-commit lifecycle hooks for related records and files.<\/li>\n<li>Added clear success and failure notices for permanent deletion.<\/li>\n<li>Fixed permanent class deletion so enrollments, assignments, grades, attendance, program mappings, announcements, and active add-on records are cleaned up while financial history is preserved.<\/li>\n<li>Replaced the vague class deletion prompt with an explicit description of what is removed and retained.<\/li>\n<li>Fixed permanent assignment deletion so associated grades and audit history are removed before the assignment.<\/li>\n<li>Added post-commit assignment-deletion hooks (also used during class deletion), clear result notices, and an explicit irreversible-action warning.<\/li>\n<li>Fixed assignment CSV matching so class names must be paired with the visible school-year name when class_id is not supplied, preventing assignments from being imported into a same-named class from another year.<\/li>\n<li>Added school_year to assignment CSV templates and exports and rejects ambiguous duplicate class matches instead of guessing.<\/li>\n<li>Added central grade relationship validation so CSV and other grade writes reject missing assignments, missing students, and students who are not enrolled in the assignment class.<\/li>\n<li>Allows grades for inactive historical enrollment records while preventing unrelated student and class IDs from creating orphaned grade data.<\/li>\n<li>Fixed student portal profile updates so success appears only after the database update succeeds.<\/li>\n<li>Added clear portal errors for invalid or duplicate email addresses, failed photo uploads, and database failures, and removes a newly uploaded photo if its profile update cannot be saved.<\/li>\n<\/ul>\n\n<h4>1.1.21<\/h4>\n\n<ul>\n<li>Added Class Enrollments CSV import and export for linking existing students to existing classes.<\/li>\n<li>Added student and class IDs to the first column of their admin tables for CSV reference, and made Class Enrollments use the visible school-year name instead of requiring its internal ID.<\/li>\n<li>Added ID-first matching with email and class-name\/year fallbacks, archived-year protection, and safe handling of existing enrollments.<\/li>\n<li>Reworked the admin Setup Checklist with clean completion indicators and properly spaced action links.<\/li>\n<li>Fixed the Focus Mode \"Exit to WordPress\" button so its security nonce and dashboard redirect are handled correctly.<\/li>\n<li>Updated Class Enrollments queries to use WordPress-recognized fixed plugin table names for Plugin Check compliance.<\/li>\n<li>Updated tested compatibility for WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.1.19<\/h4>\n\n<ul>\n<li>Fixed PDF generation when the saved school logo URL cannot be read by TCPDF on the server.<\/li>\n<li>Shared PDF headers now resolve Media Library images to local upload paths and fall back to the school name when needed.<\/li>\n<li>Added admin download buttons for core report-card PDFs and class roster PDFs under Gradebook &gt; Class Reports.<\/li>\n<li>Kept student-facing report-card downloads reserved for the Reports &amp; Transcripts add-on.<\/li>\n<\/ul>\n\n<h4>1.1.18<\/h4>\n\n<ul>\n<li>Reordered the branded admin sidebar into Manage, Add-ons, and System sections.<\/li>\n<li>Added core fallback sidebar entries for installed add-ons so Certificates and Applications appear consistently.<\/li>\n<li>Hid the default WordPress admin footer on TradeSchool Manager screens.<\/li>\n<\/ul>\n\n<h4>1.1.17<\/h4>\n\n<ul>\n<li>Fixed student portal tab actions so links and panels initialize reliably in the focused portal layout.<\/li>\n<li>Fixed teacher portal subtab initialization timing for class and add-on views.<\/li>\n<\/ul>\n\n<h4>1.1.16<\/h4>\n\n<ul>\n<li>Converted remaining first-party inline portal, sponsor, email, add-on, and admin UI assets to WordPress enqueue APIs.<\/li>\n<li>Updated extension hook names and uninstall cleanup symbols to the long <code>tradeschool_manager_<\/code> prefix for Plugin Check.<\/li>\n<li>Updated bundled Chart.js to 4.5.1 and TCPDF to 6.11.3.<\/li>\n<li>Kept first-run and add-on notices limited to TradeSchool Manager admin screens.<\/li>\n<\/ul>\n\n<h4>1.1.15<\/h4>\n\n<ul>\n<li>Limited first-run and add-on data notices to TradeSchool Manager admin screens.<\/li>\n<li>Converted reviewer-named inline portal\/theme, feedback, attendance, page-title, and focus-mode assets to WordPress enqueue APIs.<\/li>\n<li>Sanitized grade, class, student, and program hook payloads before passing data to extension hooks.<\/li>\n<li>Sanitized preserved active-year request values before reuse.<\/li>\n<li>Added the requested WordPress.org contributor username to the readme.<\/li>\n<\/ul>\n\n<h4>1.1.14<\/h4>\n\n<ul>\n<li>Added narrow PHPCS suppressions for intentional public extension hooks that Plugin Check does not accept through its inferred prefix.<\/li>\n<\/ul>\n\n<h4>1.1.13<\/h4>\n\n<ul>\n<li>Updated custom extension hooks to start with the literal <code>tradeschool-manager<\/code> plugin slug used by Plugin Check.<\/li>\n<li>Scoped uninstall cleanup variables inside a local closure so the uninstall routine does not declare temporary globals.<\/li>\n<\/ul>\n\n<h4>1.1.12<\/h4>\n\n<ul>\n<li>Updated extension hook names and uninstall helper names to the long <code>tradeschoolmanager_<\/code> prefix used for Plugin Check inference.<\/li>\n<\/ul>\n\n<h4>1.1.11<\/h4>\n\n<ul>\n<li>Renamed core extension hooks to a registered plugin prefix for WordPress Plugin Check compliance.<\/li>\n<li>Cleaned uninstall-only variable and helper names so the uninstall routine passes prefix checks.<\/li>\n<\/ul>\n\n<h4>1.1.10<\/h4>\n\n<ul>\n<li>Updated the Add-ons settings screen to use stable Freemius license routes for Reports &amp; Transcripts and Workshops.<\/li>\n<\/ul>\n\n<h4>1.1.9<\/h4>\n\n<ul>\n<li>Resolved WordPress Plugin Check naming warnings for core teacher portal and grade-save hooks.<\/li>\n<li>Cleaned uninstall helper naming to use the full TradeSchool Manager prefix.<\/li>\n<li>Normalized the main plugin file line endings for repository checks.<\/li>\n<\/ul>\n\n<h4>1.1.8<\/h4>\n\n<ul>\n<li>Added invoice context fields so add-ons can link invoices to a specific workshop instance or other future record.<\/li>\n<\/ul>\n\n<h4>1.1.7<\/h4>\n\n<ul>\n<li>Moved the core class report into a Gradebook tab.<\/li>\n<li>The dedicated Reports navigation now appears only when the Reports &amp; Transcripts add-on is installed.<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li>Added teacher portal extension hooks for add-ons.<\/li>\n<li>Enables the Workshops add-on to show assigned workshop dashboards inside the teacher portal.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Improved the shared PDF engine so add-ons can render wide reports in landscape layout.<\/li>\n<li>Aligned the plugin header version and runtime version constant.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Moved Stripe setup out of core Settings navigation and pointed administrators to Invoicing &gt; Stripe.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Updated the Add-ons settings screen to use Freemius license popup triggers for inactive registered add-ons, matching the working Plugins screen activation flow.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Improved the Add-ons settings screen so inactive Freemius add-ons point to license-key activation and show the correct inactive state.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Updated the Add-ons dashboard to use stable add-on license management pages instead of direct Freemius account URLs.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Stable launch release of TradeSchool Manager.<\/li>\n<li>Students, teachers, classes, programs, school years, and year rollover.<\/li>\n<li>Status-driven gradebook with weighted categories, bonus, late penalty, and per-assignment entry screens (admin + teacher portal).<\/li>\n<li>Student, teacher, and sponsor portals with branded layouts, password management, and portal page setup.<\/li>\n<li>Attendance, assignments, announcements, and built-in PDF engine for report cards and transcripts.<\/li>\n<li>CSV import\/export for students, classes, class enrollments, assignments, and grades.<\/li>\n<li>Email notifications with native wp_mail() delivery settings, sender identity controls, template review, and activity logging.<\/li>\n<li>Setup Checklist, in-admin Documentation, and Shortcodes reference on the About page.<\/li>\n<li>Add-on framework for optional Certificates, Reports &amp; Transcripts, Workshops, Applications, Invoicing &amp; Contracts, and Custom Fields &amp; Student Documents.<\/li>\n<\/ul>","raw_excerpt":"A complete LMS built for trade schools and vocational programs: students, classes, gradebook, attendance, school years, portals, PDFs and CSV.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/320847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=320847"}],"author":[{"embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/cburleigh"}],"wp:attachment":[{"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=320847"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=320847"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=320847"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=320847"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=320847"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/frp.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=320847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}