{"id":338684,"date":"2026-07-18T11:04:18","date_gmt":"2026-07-18T11:04:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pcio-vis-member-event\/"},"modified":"2026-10-02T19:43:05","modified_gmt":"2026-10-02T19:43:05","slug":"pcio-vis-member-event","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/pcio-vis-member-event\/","author":20981457,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"7.1.2","requires":"6.2","requires_php":"8.1","requires_plugins":null,"header_name":"PCIO VIS Member Event","header_author":"PCIO","header_description":"Manages members and events for a voluntary organization.","assets_banners_color":"000000","last_updated":"2026-10-02 19:43:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.pcio.dk\/","header_author_uri":"https:\/\/www.pcio.dk","rating":0,"author_block_rating":0,"active_installs":0,"downloads":448,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"pcio","date":"2026-07-18 11:04:07","revision":3612536},"1.1.0":{"tag":"1.1.0","author":"pcio","date":"2026-08-15 14:38:59","revision":3648718},"1.2.0":{"tag":"1.2.0","author":"pcio","date":"2026-08-18 13:16:05","revision":3652942},"1.3.0":{"tag":"1.3.0","author":"pcio","date":"2026-09-07 17:23:01","revision":3685324},"1.4.0":{"tag":"1.4.0","author":"pcio","date":"2026-09-11 11:53:41","revision":3691329},"1.5.0":{"tag":"1.5.0","author":"pcio","date":"2026-10-02 19:43:05","revision":3725396}},"upgrade_notice":{"1.5.0":"<p><strong>Back up your database before updating.<\/strong> 1.5.0 replaces the separate &quot;Membership #&quot; column with a shared integer membership number. Update the Products, Tickets and Boat extensions to their matching 1.5.0 releases.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3614379,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3614379,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3612529,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3612529,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0","1.3.0","1.4.0","1.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3612529,"resolution":"1","location":"assets","locale":"","width":1344,"height":835},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3612529,"resolution":"2","location":"assets","locale":"","width":1344,"height":993},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3612529,"resolution":"3","location":"assets","locale":"","width":1343,"height":874},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3612529,"resolution":"4","location":"assets","locale":"","width":1361,"height":1029}},"screenshots":{"1":"Landing page with tiles for each section in the application","2":"The calendar page","3":"Member list page.","4":"Vis admin menues in WordPress admin section."}},"plugin_section":[],"plugin_tags":[9054,1486,1919,455,1554],"plugin_category":[40,42,58],"plugin_contributors":[265152],"plugin_business_model":[],"class_list":["post-338684","plugin","type-plugin","status-publish","hentry","plugin_tags-documents","plugin_tags-events","plugin_tags-members","plugin_tags-newsletter","plugin_tags-signup","plugin_category-calendar-and-events","plugin_category-contact-forms","plugin_category-user-management","plugin_contributors-pcio","plugin_committers-pcio"],"banners":{"banner":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/banner-772x250.png?rev=3612529","banner_2x":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/banner-1544x500.png?rev=3612529","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/icon-128x128.png?rev=3614379","icon_2x":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/icon-256x256.png?rev=3614379","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/screenshot-1.jpg?rev=3612529","caption":"Landing page with tiles for each section in the application"},{"src":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/screenshot-2.jpg?rev=3612529","caption":"The calendar page"},{"src":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/screenshot-3.jpg?rev=3612529","caption":"Member list page."},{"src":"https:\/\/ps.w.org\/pcio-vis-member-event\/assets\/screenshot-4.jpg?rev=3612529","caption":"Vis admin menues in WordPress admin section."}],"raw_content":"<!--section=description-->\n<p>PCIO VIS Member Event turns your WordPress site into a complete back office for a voluntary organization or association.<\/p>\n\n<p>It provides a members register, an event calendar with public sign-ups, e-mail and newsletter tools, a document library and a simple finance journal \u2014 all built on native WordPress capabilities so access control works with the roles you already use.<\/p>\n\n<p>Public pages are served automatically under <code>\/vis\/<\/code>; no WordPress pages or shortcodes are required to get started:<\/p>\n\n<ul>\n<li><strong>Home<\/strong> (<code>\/vis\/<\/code>) \u2014 landing page for members.<\/li>\n<li><strong>Members<\/strong> (<code>\/vis\/members<\/code>) \u2014 searchable members directory.<\/li>\n<li><strong>Calendar<\/strong> (<code>\/vis\/calendar<\/code>) \u2014 upcoming events with sign-up.<\/li>\n<li><strong>Event<\/strong> (<code>\/vis\/events\/{id}<\/code>) \u2014 event detail page with banner, description and sign-up box.<\/li>\n<li><strong>Mails<\/strong> (<code>\/vis\/mails<\/code>) \u2014 member mailings.<\/li>\n<li><strong>Newsletters<\/strong> (<code>\/vis\/newsletters<\/code>) \u2014 public newsletter archive.<\/li>\n<li><strong>Documents<\/strong> (<code>\/vis\/documents<\/code>) \u2014 document library grouped by type.<\/li>\n<li><strong>Finance<\/strong> (<code>\/vis\/finance<\/code>) \u2014 finance overview for authorized users.<\/li>\n<li><strong>Statistics<\/strong> (<code>\/vis\/statistics<\/code>) \u2014 member growth chart, page-view and login counters, and sponsor link click tracking.<\/li>\n<\/ul>\n\n<p><strong>Roles and capabilities.<\/strong> The plugin defines a cumulative set of logical roles \u2014 Member, Volunteer, Event Manager, Publisher and System Admin \u2014 that map to standard WordPress capabilities. Assign them per WordPress role from <strong>Vis \u2192 Roles<\/strong>:<\/p>\n\n<ul>\n<li>Register for events<\/li>\n<li>Create own events<\/li>\n<li>Edit own events<\/li>\n<li>Edit all events<\/li>\n<li>Publish \/ manage documents<\/li>\n<li>Manage members<\/li>\n<li>Manage settings &amp; mails<\/li>\n<li>Manage finance<\/li>\n<\/ul>\n\n<p><strong>Shortcodes.<\/strong> For themes that prefer to embed content in ordinary pages, the plugin also ships shortcodes: <code>[pcio_me_members]<\/code>, <code>[pcio_me_documents]<\/code>, <code>[pcio_me_edit_profile]<\/code>, <code>[pcio_me_event]<\/code>, <code>[pcio_me_events]<\/code>, <code>[pcio_me_event_roller]<\/code>, <code>[pcio_me_newsletters]<\/code>, <code>[pcio_me_member_count]<\/code>, <code>[pcio_me_member_signup]<\/code> and <code>[pcio_me_rolling_text]<\/code>. The <code>[pcio_me_edit_profile]<\/code> shortcode renders a pre-filled profile form (membership number, name, email, phone, address) for the logged-in member, validates in the browser and saves over REST; the membership number is shown read-only. The <code>[pcio_me_members]<\/code> shortcode renders a searchable member table \u2014 it requires a logged-in account holding the <code>vis_member<\/code> capability, and the table includes each member's email address and phone number. The search box filters rows live and shows a message when nothing matches, and <code>?member_number=\u2026<\/code> in the page URL pre-fills the membership-number filter. The <code>[pcio_me_member_count]<\/code> shortcode displays an animated total member count and can be used in any page builder (e.g. a Divi Text Module); each render increments the front-page-view counter visible on the Statistics dashboard. The <code>[pcio_me_member_signup]<\/code> shortcode renders a public member registration form that creates the member, provisions a WordPress account and sends an automated welcome email. The <code>[pcio_me_rolling_text]<\/code> shortcode outputs a scheduled scrolling banner. A <strong>Shortcode reference<\/strong> page in the Vis admin documents every shortcode with its attributes and examples, and a <strong>Sponsor Links<\/strong> page documents the <code>pcio-sponsor-link<\/code> class used for click tracking.<\/p>\n\n<p><strong>Extensions.<\/strong> PCIO VIS Member Event is the core plugin for a family of optional add-ons (gallery, products, tickets, project management, home-owner association tools and Conventus sync). The bundled Dompdf and php-qrcode libraries are shared with those extensions for PDF and QR generation.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>pcio-vis-member-event<\/code> directory to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin in <strong>Plugins<\/strong> in the WordPress admin.<\/li>\n<li>Assign capabilities to your WordPress roles under <strong>Vis \u2192 Roles<\/strong>.<\/li>\n<li>Configure plugin options under the <strong>Vis<\/strong> admin menu.<\/li>\n<\/ol>\n\n<p>After activation, if <code>\/vis\/<\/code> or an event page returns a 404, go to <strong>Settings \u2192 Permalinks<\/strong> and click <strong>Save Changes<\/strong> to flush the rewrite rules.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20are%20the%20public%20pages%3F\"><h3>Where are the public pages?<\/h3><\/dt>\n<dd><p>The plugin registers pages automatically under <code>\/vis\/<\/code> \u2014 for example <code>https:\/\/yoursite.com\/vis\/members<\/code> and <code>https:\/\/yoursite.com\/vis\/calendar<\/code>. Individual events are available at <code>https:\/\/yoursite.com\/vis\/events\/{id}<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20control%20who%20can%20do%20what%3F\"><h3>How do I control who can do what?<\/h3><\/dt>\n<dd><p>Access is based on native WordPress capabilities. Open <strong>Vis \u2192 Roles<\/strong> and grant the plugin's capabilities to your existing WordPress roles. The logical roles (Member, Volunteer, Event Manager, Publisher, System Admin) are cumulative \u2014 each level includes the capabilities of the level below.<\/p><\/dd>\n<dt id=\"a%20public%20page%20returns%20a%20404.\"><h3>A public page returns a 404.<\/h3><\/dt>\n<dd><p>Go to <strong>Settings \u2192 Permalinks<\/strong> and click <strong>Save Changes<\/strong> to flush the rewrite rules. This registers the <code>\/vis\/<\/code> routes.<\/p><\/dd>\n<dt id=\"does%20this%20require%20any%20third-party%20services%3F\"><h3>Does this require any third-party services?<\/h3><\/dt>\n<dd><p>No. The core plugin runs entirely on your WordPress site. Optional extensions (such as ticket sales) may integrate with external services.<\/p><\/dd>\n<dt id=\"how%20do%20i%20uninstall%3F\"><h3>How do I uninstall?<\/h3><\/dt>\n<dd><p>Deactivate and delete the plugin from the WordPress admin \u2014 the plugin drops its own tables and options on delete, so this is only needed if you remove the plugin files by hand. To also remove the data, open your database admin tool and drop these tables (replace <code>wp_<\/code> with your actual table prefix):<\/p>\n\n<ul>\n<li><code>wp_me_members<\/code><\/li>\n<li><code>wp_me_member_meta<\/code><\/li>\n<li><code>wp_me_member_roles<\/code><\/li>\n<li><code>wp_me_vis_roles<\/code><\/li>\n<li><code>wp_me_events<\/code><\/li>\n<li><code>wp_me_event_signups<\/code><\/li>\n<li><code>wp_me_event_recurrence<\/code><\/li>\n<li><code>wp_me_event_types<\/code><\/li>\n<li><code>wp_me_resources<\/code><\/li>\n<li><code>wp_me_event_resources<\/code><\/li>\n<li><code>wp_me_event_type_resources<\/code><\/li>\n<li><code>wp_me_workgroups<\/code><\/li>\n<li><code>wp_me_workgroup_members<\/code><\/li>\n<li><code>wp_me_mails<\/code><\/li>\n<li><code>wp_me_newsletters<\/code><\/li>\n<li><code>wp_me_documents<\/code><\/li>\n<li><code>wp_me_document_types<\/code><\/li>\n<li><code>wp_me_rolling_texts<\/code><\/li>\n<li><code>wp_me_finance_journal<\/code><\/li>\n<li><code>wp_me_sync<\/code><\/li>\n<li><code>wp_me_statistics<\/code><\/li>\n<li><code>wp_me_sponsor_clicks<\/code><\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added: <strong>Rewritten member profile page<\/strong> \u2014 <code>[pcio_me_edit_profile]<\/code> is now a server-rendered form (new <code>templates\/member-profile.php<\/code> plus its own stylesheet) with browser-side validation, an inline error box and a success message. The membership number is shown read-only so members cannot change it. Extensions can add their own fieldsets with the new <code>pcio_me_profile_extra_sections<\/code> filter.<\/li>\n<li>Added: <strong>Member save validation hook<\/strong> \u2014 the new <code>pcio_me_member_update_validate<\/code> filter lets extensions reject a save (from the member dialog or the profile form) before anything is written; the request is answered with a 422 and the extension's message.<\/li>\n<li>Added: <strong>Vis \u2192 Sponsor Links<\/strong> \u2014 a dedicated admin page documenting the <code>pcio-sponsor-link<\/code> class, moved off the Shortcode reference page, with step-by-step instructions for the block editor, the classic editor and Divi (plain text links and Image modules).<\/li>\n<li>Added: <strong>Exact membership-number deep link<\/strong> \u2014 <code>\/vis\/members?member_number=42<\/code> pre-fills the membership-number filter and matches that number exactly, so a short number can no longer match a longer one. Used by the Boat register's crew links.<\/li>\n<li>Added: <strong>\"No members match your search\"<\/strong> message on the <code>[pcio_me_members]<\/code> list when a search filters every row out.<\/li>\n<li>Added: <strong>Signup fulfilment context<\/strong> \u2014 new public methods <code>PCIO_VIS_Member_Signup_Fulfillment::stash_order_context()<\/code>, <code>get_order_context()<\/code>, <code>take_order_provision()<\/code>, <code>claim_order_welcome()<\/code> and <code>is_order_welcome_claimed()<\/code> let extensions running on <code>pcio_mep_order_confirmed<\/code> share the created member, read the provisioned WordPress account, and take over (or hand back) the welcome mail.<\/li>\n<li>Changed: <strong>One membership number instead of two.<\/strong> The separate \"Membership #\" field is retired; the <code>#<\/code> column is now the membership number itself, stored as an integer, and any number of members can share it (that is how a boat or household is grouped).<\/li>\n<li>Changed: <strong>The numbering upgrade migrates your data automatically<\/strong> on the next admin page load. Members with a \"Membership #\" keep that number; members without one get the leading digits of their old \"#\"; a \"#\" that was not a plain number is preserved as a <code>legacy_member_number<\/code> row in <code>wp_me_member_meta<\/code>. The finance journal and the Products extension's subscription table are converted the same way. The routine is safe to re-run and resumes by itself if a step fails.<\/li>\n<li>Upgrade procedure:\n\n<ol>\n<li>Export <code>wp_me_members<\/code> (and <code>wp_me_p_subscriptions<\/code> if you use the Products extension) from your database admin tool, so you can restore the old numbers if anything looks wrong.<\/li>\n<li>Update the plugin, then open any wp-admin page to run the upgrade.<\/li>\n<li>Check <strong>Vis \u2192 Members<\/strong>: several members may now share one number, and a number that used to carry a letter suffix has lost it. Correct anything that looks wrong by hand.<\/li>\n<li>Update the Products, Tickets and Boat extensions to their matching 1.5.0 release. Older extension versions read the retired column, so membership status would look out of date until they are updated.<\/li>\n<li>If the upgrade did not run (for example because a host blocks <code>ALTER TABLE<\/code>), a <code>member_number_legacy_140<\/code> column is left behind on <code>wp_me_members<\/code> holding the original numbers \u2014 leave it in place and open any wp-admin page again; the next attempt resumes from there.<\/li>\n<\/ol><\/li>\n<li>Fixed: the members and finance-journal tables are now actually brought up to date on an existing site. Their <code>CREATE TABLE<\/code> statements no longer use <code>IF NOT EXISTS<\/code>, which made <code>dbDelta()<\/code> treat \"IF\" as the table name and skip the table completely.<\/li>\n<li>Changed: <strong>Collision-free number allocation<\/strong> \u2014 new sign-ups get the next free membership number through the new <code>PCIO_VIS_DB::create_with_next_number()<\/code>, which re-checks for a concurrent claim. Two simultaneous sign-ups can no longer be handed the same number.<\/li>\n<li>Changed: <strong>Member meta writes are hardened<\/strong> \u2014 <code>PCIO_VIS_Meta_DB::set()<\/code> now accepts a member id <em>or<\/em> a member row (or a single-row list) and silently ignores a non-numeric id instead of raising a type error that killed the request.<\/li>\n<li>Changed: <strong>Welcome mail can be rendered without being sent<\/strong> \u2014 <code>render_welcome()<\/code> returns the resolved subject and body (and an empty result when the template, member or address is unusable); <code>send_welcome()<\/code> keeps its old behaviour and now falls back to nothing instead of sending an empty mail.<\/li>\n<li>Changed: <strong>No inline script in the members shortcode<\/strong> \u2014 the live search and the boat detail popup were previously emitted as an inline <code>&lt;script&gt;<\/code> block; the search now lives in <code>assets\/members-public.js<\/code> and the boat popup is gone (boat details are on the profile page).<\/li>\n<li>Changed: <code>PCIO_VIS_DB<\/code> member-number helpers were renamed and aligned: <code>get_next_member_number()<\/code>, <code>get_next_free_member_number()<\/code>, <code>member_number_is_taken()<\/code>, <code>create_with_next_number()<\/code>, <code>get_member_number_by_id()<\/code>, <code>set_member_number()<\/code>, <code>get_member_ids_by_member_number()<\/code> and <code>get_members_by_member_number()<\/code>. The <code>next_member_number()<\/code> \/ <code>next_subscription_number()<\/code> \/ <code>*_subscription_number()<\/code> methods are <strong>removed<\/strong> \u2014 extensions that called them must be updated.<\/li>\n<li>Changed: the finance journal stores the membership number as an integer, and the journal REST payload no longer returns it as a string.<\/li>\n<li>Changed: refreshed the Danish (da_DK) translation and regenerated the translation template (.pot) \u2014 the recurring-events strings, the new Sponsor Links page, the sign-up modes and the rewritten profile form were all untranslated before.<\/li>\n<li>Fixed: member search in the <code>[pcio_me_members]<\/code> list lowercases with <code>mb_strtolower()<\/code>, so Danish letters (\u00d8, \u00c6, \u00c5) now match a search typed with a Danish keyboard.<\/li>\n<li>Fixed: the sponsor-link help section is no longer listed twice (the scroll-spy index and the page no longer disagree).<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added: <strong>Recurring events<\/strong> \u2014 a new <strong>Recurrence<\/strong> tab on the event editor. Define a repeat rule on the first event in a series (daily, weekly, monthly by weekday, monthly by date, or yearly) and generate linked copies; the series can be navigated, extended or resolved into standalone events. A new database table stores the series rules.<\/li>\n<li>Added: <strong>Upcoming events shortcode<\/strong> \u2014 <code>[pcio_me_upcoming_events]<\/code> renders a compact, month-grouped agenda list of the next events. Accepts <code>months<\/code> (how far ahead to look) and <code>limit<\/code> (maximum events) attributes.<\/li>\n<li>Added: <strong>Membership number<\/strong> \u2014 a new \"Membership #\" field on member records, sortable in the member list and editable from the member dialog. It lets shop subscriptions reference a specific member.<\/li>\n<li>Added: <strong>Event sign-up modes<\/strong> \u2014 each event can now choose how people respond: <em>No sign-up<\/em> (information only), <em>Simple<\/em> (join \/ interested \/ not joining), or <em>Ticket sales<\/em> when the Tickets extension is active. Choosing <em>No sign-up<\/em> hides the invitation box entirely on the public event page.<\/li>\n<li>Added: <strong>Rich description editor<\/strong> \u2014 the event description editor now supports text and background colour and an <strong>Edit HTML<\/strong> toggle for editing the raw source.<\/li>\n<li>Added: <strong>Week numbers<\/strong> \u2014 the calendar week view title now shows the ISO-8601 week number (e.g. \"Uge 37\").<\/li>\n<li>Changed: <strong>Member deep links<\/strong> \u2014 <code>\/vis\/members?q=\u2026<\/code> pre-filters the member list, so links (for example from shop subscriptions) can jump straight to a member.<\/li>\n<li>Changed: public event pages now inherit the active theme's text colour, so titles and body text stay readable on any page-builder background (e.g. Divi).<\/li>\n<li>Changed: refreshed the Danish (da_DK) translation and updated the translation template (.pot).<\/li>\n<li>Fixed: event creation could fail on sites upgraded from older versions whose events table was missing newer columns; the schema now self-repairs on upgrade.<\/li>\n<li>Fixed: the calendar month title could appear blank or untranslated under Danish; the localised title now renders correctly and is capitalised.<\/li>\n<li>Fixed: the <strong>Edit<\/strong> button on the Calendar \u2192 Event Types and Resources tabs showed the wrong label in non-English languages.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added: <strong>Member sign-up<\/strong> \u2014 new <code>[pcio_me_member_signup]<\/code> shortcode renders a public registration form (name, email, phone, address). It creates the member record, provisions a WordPress account and, with no payment extension active, registers the member immediately. Extensions can inject extra fields and add a payment (checkout) step on submission.<\/li>\n<li>Added: <strong>Welcome email &amp; notifications<\/strong> \u2014 a \"member_welcome\" system mail template is seeded under Vis \u2192 Mails and sent automatically to new members, with tag chips for <code>{name}<\/code>, <code>{member_number}<\/code>, <code>{site_name}<\/code> and a one-time set-password <code>{login_url}<\/code>. Extensions can add their own tags via filters.<\/li>\n<li>Added: <strong>Rolling texts<\/strong> \u2014 new <code>[pcio_me_rolling_text]<\/code> shortcode shows a scrolling banner built from time-scheduled entries. Manage them under Calendar \u2192 Rolling Texts, where each entry has a Roller ID and a start\/stop window; multiple pages can show independent banners.<\/li>\n<li>Added: <strong>Shortcode reference<\/strong> \u2014 new admin page documenting every shortcode with its attributes, defaults, examples and welcome-email tags, including scroll-spy navigation.<\/li>\n<li>Added: <strong>Volunteers mail group<\/strong> and a <strong>Copy emails<\/strong> button on the member and workgroup lists for quick recipient selection.<\/li>\n<li>Fixed: text overlap and layout issues in the admin UI.<\/li>\n<li>Changed: refreshed the Danish (da_DK) translation and updated the translation template (.pot).<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added: <strong>Event Types<\/strong> \u2014 color-coded categories for calendar events with configurable access level (Public, Members only, Volunteers only). Managed from the Calendar \u2192 Event Types tab.<\/li>\n<li>Added: <strong>Resources<\/strong> \u2014 bookable resources (rooms, equipment, etc.) that can be assigned to events. Conflict detection warns when a resource is already booked for an overlapping event. Managed from the Calendar \u2192 Resources tab.<\/li>\n<li>Added: <strong>Default resources per event type<\/strong> \u2014 define which resources are pre-selected when a new event of that type is created; defaults are applied automatically on event creation.<\/li>\n<li>Added: <strong>Workgroups<\/strong> \u2014 new page at <code>\/vis\/workgroups\/<\/code> for organizing volunteers into named working groups. Each workgroup can have one or more members flagged as chairman.<\/li>\n<li>Added: <strong>Volunteer role<\/strong> \u2014 members can be designated as volunteers (<code>vis_volunteer<\/code> capability), enabling volunteer-only event access and workgroup membership.<\/li>\n<li>Fixed: \"Publish &amp; share\" heading was double-escaped and displayed as raw HTML entity in the event editor.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added: <strong>Statistics dashboard<\/strong> at <code>\/vis\/statistics\/<\/code> \u2014 grouped bar chart of members joining and leaving by year, front-page-view counter, login counter, and a sponsor link click table.<\/li>\n<li>Added: <code>join_date<\/code> and <code>leave_date<\/code> date fields on member records, editable from the member edit dialog and charted on the Statistics dashboard.<\/li>\n<li>Added: <code>[pcio_me_member_count]<\/code> shortcode \u2014 animated count-up number showing the current total membership. Each page render increments the front-page-view counter. Paste it into any page builder text or code module (e.g. Divi Text Module).<\/li>\n<li>Added: Sponsor link click tracking \u2014 add <code>class=\"pcio-sponsor-link\"<\/code> to any anchor tag in your content. Click events are captured in the browser and stored; totals appear on the Statistics dashboard.<\/li>\n<li>Fixed: end date\/time entered in the calendar create-event dialog was not saved to the event.<\/li>\n<li>Fixed: clicking a single all-day cell now correctly pre-fills the end date with the same date as the start date.<\/li>\n<li>Fixed: end-time field was not hidden when the \"All day\" checkbox was ticked.<\/li>\n<li>Fixed: member list was not refreshed in the browser after a member was successfully deleted.<\/li>\n<li>Fixed: document list shortcode displayed a bullet point before each document link.<\/li>\n<li>Changed: WP Role column removed from the member list; the WordPress account status is now shown only as a \"Create WordPress login\" button in the edit dialog when no account exists yet.<\/li>\n<li>Changed: the edit-member icon in the member list is now shown only to users with the <code>vis_manage_users<\/code> capability; plain members use the new profile shortcode instead.<\/li>\n<li>Added: <code>[pcio_me_edit_profile]<\/code> shortcode \u2014 lets a logged-in member edit their own name, email, phone, address and custom fields from any WordPress page.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Members register with custom member fields and roles.<\/li>\n<li>Event calendar with public sign-ups and per-event banner\/thumbnail images.<\/li>\n<li>Member mailings and public newsletter archive.<\/li>\n<li>Document library grouped by type, backed by the WordPress media library.<\/li>\n<li>Finance journal.<\/li>\n<li>Capability-based access control with cumulative logical roles (Vis \u2192 Roles).<\/li>\n<li>Automatic public pages under <code>\/vis\/<\/code> plus shortcodes for embedding in themes.<\/li>\n<\/ul>","raw_excerpt":"Member and event management for voluntary organizations: members register, event calendar with signups, mailings, newsletters, documents and finance.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/338684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=338684"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pcio"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=338684"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=338684"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=338684"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=338684"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=338684"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=338684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}