{"id":314204,"date":"2026-06-07T11:11:43","date_gmt":"2026-06-07T11:11:43","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/masjid-donation-manager\/"},"modified":"2026-06-08T02:13:10","modified_gmt":"2026-06-08T02:13:10","slug":"masjid-donation","status":"publish","type":"plugin","link":"https:\/\/es-co.wordpress.org\/plugins\/masjid-donation\/","author":23110070,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.30","stable_tag":"1.1.30","tested":"7.0","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"Masjid Donation Manager","header_author":"E Skills Productions","header_description":"Sistem derma masjid yang lengkap dengan ChipIn Asia dan Bayarcash. Sokongan pelbagai kempen, papan pemuka frontend dan laporan lengkap.","assets_banners_color":"868754","last_updated":"2026-06-08 02:13:10","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/eskillsproductions.com\/masjid-donation","header_author_uri":"https:\/\/eskillsproductions.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":63,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.29":{"tag":"1.1.29","author":"eskillsproductions","date":"2026-06-08 02:11:01"},"1.1.30":{"tag":"1.1.30","author":"eskillsproductions","date":"2026-06-08 02:13:10"}},"upgrade_notice":{"1.1.30":"<p>Adds a &quot;Donate to author&quot; link on the Plugins screen. Safe to update \u2014 no database changes.<\/p>","1.1.29":"<p>Plugin Check cleanup: removed a prohibited <code>suppress_filters<\/code> argument and added justified ignores to the activation-time page lookup. Safe to update \u2014 no database changes.<\/p>","1.1.28":"<p>Plugin Check cleanup: activator migration now uses the WordPress meta APIs instead of direct database queries, and login-handler ignore annotations were re-anchored. Tested up to WordPress 7.0. Safe to update \u2014 no database changes.<\/p>","1.1.27":"<p>Prefix lengthened to <code>masjiddm<\/code> for WordPress.org compliance; a one-time migration copies existing settings, campaign data and permissions automatically. Auth-page CSS\/JS now enqueued. Safe to update \u2014 your data is preserved.<\/p>","1.1.26":"<p>After logout, users are now returned to the dashboard login page (<code>\/masjid-admin\/<\/code>) instead of the site homepage. Safe to update \u2014 no database changes.<\/p>","1.1.25":"<p>Fixes the logout button being covered by the mobile bottom navigation bar. The bottom nav now hides while the slide-out menu is open, so the &quot;Log Keluar&quot; button is fully visible. Safe to update \u2014 no database changes.<\/p>","1.1.24":"<p>Fixes the mobile logout button being hidden behind the phone&#039;s browser bar. The slide-out menu now sizes to the visible viewport so the &quot;Log Keluar&quot; button is always reachable. Safe to update \u2014 no database changes.<\/p>","1.1.23":"<p>Adds a clear full-width &quot;Log Keluar&quot; (logout) button to the dashboard sidebar and fixes a mobile layout issue where the sidebar footer could be hidden behind the browser\/navigation bars. Safe to update \u2014 no database changes.<\/p>","1.1.22":"<p>White-labels the &quot;forgot password&quot; and &quot;reset password&quot; screens to match the branded login page. WordPress&#039;s secure reset routines are unchanged. Safe to update \u2014 no database changes.<\/p>","1.1.21":"<p>Adds a branded login page for the frontend dashboard <code>\/masjid-admin\/<\/code> so logged-out users no longer hit the WordPress <code>wp-login.php<\/code> screen. Secure in-place login via <code>wp_signon()<\/code> with nonce protection. Safe to update \u2014 no database changes.<\/p>","1.1.20":"<p>Adds white-labeling for the Bendahari role: hides the WordPress admin bar on the frontend and blocks <code>\/wp-admin\/<\/code> access, so treasurers can&#039;t tell the site runs on WordPress. Administrators are unaffected. Safe to update \u2014 no database changes.<\/p>","1.1.19":"<p>PluginCheck follow-up: six <code>NonceVerification.Missing<\/code> warnings on <code>Dashboard_Ajax<\/code> export\/treasurer handlers cleared with inline <code>phpcs:ignore<\/code>; <code>uninstall.php<\/code> <code>phpcs:enable<\/code> scoped so it doesn&#039;t lift the variable-prefix suppression. Safe to update \u2014 no database changes.<\/p>","1.1.18":"<p>PluginCheck follow-up pass: table\/column identifiers in pending-poller and activator now use <code>%i<\/code> placeholders; file-level PHPCS suppressions consolidated and re-anchored; targeted ignores added for the <code>mdm_*<\/code> prefix sniff. Safe to update \u2014 no database changes.<\/p>","1.1.17":"<p>PluginCheck compliance pass: PHP namespace renamed <code>MDM\\<\/code> \u2192 <code>MasjidDM\\<\/code>, bootstrap function and one hook re-prefixed, sanitization made statically traceable, <code>wp_redirect()<\/code> \u2192 <code>wp_safe_redirect()<\/code>, <code>date()<\/code> \u2192 <code>gmdate()<\/code>. Safe to update \u2014 no database changes.<\/p>","1.1.16":"<p>Security fix: public REST endpoint <code>GET \/campaign\/{id}<\/code> no longer returns per-campaign gateway credentials. Recommended for all users; rotate any gateway API keys if your site is publicly accessible. Safe to update \u2014 no database changes.<\/p>","1.1.15":"<p>WordPress.org compliance pass \u2014 all inline CSS\/JS now properly enqueued, IP sanitization hardened, Chart.js updated to 4.5.1, third-party service URLs corrected. Recommended for all users. Safe to update \u2014 no database changes.<\/p>","1.1.14":"<p>Security hardening for reports endpoint (strict date validation + SQL identifier escaping). Recommended for all users. Safe to update \u2014 no database changes.<\/p>","1.1.13":"<p>Important fix for Elementor users: campaign visibility toggles now actually work. Also bundles Chart.js locally and makes Google Fonts opt-in for WordPress.org \/ GDPR compliance. Safe to update \u2014 no database changes.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3564043,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3564043,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3564043,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3564043,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"masjid-donation\/donation-button":{"name":"masjid-donation\/donation-button","title":"Masjid Donation"}},"tagged_versions":["1.1.29","1.1.30"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3564043,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3564043,"resolution":"2","location":"assets","locale":"","width":800,"height":1280},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3564043,"resolution":"3","location":"assets","locale":"","width":800,"height":1280},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3564043,"resolution":"4","location":"assets","locale":"","width":800,"height":1280},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3564043,"resolution":"5","location":"assets","locale":"","width":1280,"height":800},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3564043,"resolution":"6","location":"assets","locale":"","width":1280,"height":800},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3564043,"resolution":"7","location":"assets","locale":"","width":1280,"height":800},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3564043,"resolution":"8","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"Frontend donation button with live statistics and donor wall.","2":"Donation modal \u2014 amount selection step.","3":"Donation modal \u2014 donor details step.","4":"Frontend dashboard \u2014 overview page.","5":"Frontend dashboard \u2014 campaigns management.","6":"Frontend dashboard \u2014 settings page.","7":"Elementor widget with full configuration panel.","8":"Setup wizard on first activation."}},"plugin_section":[],"plugin_tags":[232767,8222,31427,617,10546],"plugin_category":[45],"plugin_contributors":[266078],"plugin_business_model":[],"class_list":["post-314204","plugin","type-plugin","status-publish","hentry","plugin_tags-bayarcash","plugin_tags-charity","plugin_tags-chipin","plugin_tags-donation","plugin_tags-masjid","plugin_category-ecommerce","plugin_contributors-eskillsproductions","plugin_committers-eskillsproductions"],"banners":{"banner":"https:\/\/ps.w.org\/masjid-donation\/assets\/banner-772x250.png?rev=3564043","banner_2x":"https:\/\/ps.w.org\/masjid-donation\/assets\/banner-1544x500.png?rev=3564043","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/masjid-donation\/assets\/icon-128x128.png?rev=3564043","icon_2x":"https:\/\/ps.w.org\/masjid-donation\/assets\/icon-256x256.png?rev=3564043","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-1.png?rev=3564043","caption":"Frontend donation button with live statistics and donor wall."},{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-2.png?rev=3564043","caption":"Donation modal \u2014 amount selection step."},{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-3.png?rev=3564043","caption":"Donation modal \u2014 donor details step."},{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-4.png?rev=3564043","caption":"Frontend dashboard \u2014 overview page."},{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-5.png?rev=3564043","caption":"Frontend dashboard \u2014 campaigns management."},{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-6.png?rev=3564043","caption":"Frontend dashboard \u2014 settings page."},{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-7.png?rev=3564043","caption":"Elementor widget with full configuration panel."},{"src":"https:\/\/ps.w.org\/masjid-donation\/assets\/screenshot-8.png?rev=3564043","caption":"Setup wizard on first activation."}],"raw_content":"<!--section=description-->\n<p><strong>Masjid Donation Manager<\/strong> is a complete donation management system built specifically for masjids, surau, and Islamic charitable organizations in Malaysia. It supports multiple campaigns, two popular Malaysian payment gateways (ChipIn Asia and Bayarcash), and ships with a frontend dashboard so the masjid committee can manage everything without ever touching wp-admin.<\/p>\n\n<p>The plugin is bilingual-friendly \u2014 the user-facing strings are in Bahasa Malaysia by default, and all strings pass through <code>__()<\/code> so they can be translated.<\/p>\n\n<h4>Key Features<\/h4>\n\n<ul>\n<li><strong>Multiple campaigns<\/strong> \u2014 create unlimited fundraising campaigns, each with its own image, description, target amount and schedule (ongoing, time-limited, or one-off).<\/li>\n<li><strong>Two Malaysian payment gateways out of the box<\/strong> \u2014 ChipIn Asia and Bayarcash, both with sandbox and live modes.<\/li>\n<li><strong>Frontend dashboard<\/strong> \u2014 a dedicated <code>\/masjid-admin\/<\/code> page lets the masjid committee (administrator and the included \"Bendahari Masjid\" role) view donations, manage campaigns, send receipts and pull reports without learning wp-admin.<\/li>\n<li><strong>Donor wall<\/strong> \u2014 automatic recognition wall showing recent donors (with option for anonymous donations).<\/li>\n<li><strong>Live statistics bar<\/strong> \u2014 total collected and donor count update in real time.<\/li>\n<li><strong>Elementor widget &amp; Gutenberg block<\/strong> \u2014 drop a donation button into any page with full visual configuration (toggle stats, toggle donor wall, customize colors and button text).<\/li>\n<li><strong>Shortcodes<\/strong> \u2014 <code>[masjid_donation id=\"1\"]<\/code>, <code>[masjid_donor_wall id=\"1\"]<\/code>, <code>[masjid_donation_stats id=\"1\"]<\/code>, <code>[masjid_campaigns_list]<\/code>.<\/li>\n<li><strong>Receipt emails<\/strong> \u2014 automatic, customizable HTML receipts on every successful payment.<\/li>\n<li><strong>Custom reports<\/strong> \u2014 daily\/weekly\/monthly breakdowns, gateway-by-gateway and campaign-by-campaign comparisons.<\/li>\n<li><strong>CSV export<\/strong> \u2014 export all donation data for accounting or audit.<\/li>\n<li><strong>Webhook hardening<\/strong> \u2014 signature verification, replay-window protection and optional IP allowlisting for incoming gateway callbacks.<\/li>\n<li><strong>PDPA \/ GDPR considerations<\/strong> \u2014 data-retention period configurable, donor anonymization tool, and external resources (Google Fonts) are opt-in only.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on third-party services to process donations. Connection to a gateway only happens when a donor actually clicks \"Pay\" on the donation form \u2014 no data is sent at any other time, and no data is ever sent to the plugin author. <strong>By using this plugin you (and your donors) are accepting the terms and privacy policies of whichever gateway you enable.<\/strong><\/p>\n\n<h4>ChipIn Asia (CHIP) \u2014 payment gateway<\/h4>\n\n<p>What it is: a Malaysian payment gateway by CHIP IN Sdn. Bhd. used to process FPX, e-wallet and card payments.<\/p>\n\n<p>What is sent and when: when a donor initiates a donation through a campaign that uses ChipIn Asia, the plugin sends the donor's name, email, phone number, donation amount, currency (MYR) and a unique reference (donation_id) to ChipIn's API to create a payment session. The donor's browser is then redirected to ChipIn to complete payment. After payment, ChipIn calls our webhook with the transaction status. No donor card \/ bank details ever touch your WordPress server.<\/p>\n\n<p>API endpoint contacted: <code>https:\/\/gate.chip-in.asia\/api\/v1\/<\/code> (the same hostname is used for both sandbox and live; mode is selected per-account on ChipIn's side).<\/p>\n\n<ul>\n<li>Service URL: https:\/\/www.chip-in.asia\/<\/li>\n<li>Terms of service: https:\/\/chip-in.asia\/terms-of-service<\/li>\n<li>Privacy policy: https:\/\/chip-in.asia\/privacy-policy<\/li>\n<\/ul>\n\n<h4>Bayarcash \u2014 payment gateway<\/h4>\n\n<p>What it is: a Malaysian Shariah-compliant payment gateway by Web Impian Sdn. Bhd. used to process FPX, DuitNow QR and DuitNow Online Banking payments.<\/p>\n\n<p>What is sent and when: when a donor initiates a donation through a campaign that uses Bayarcash, the plugin sends the donor's name, email, phone number, donation amount, currency (MYR), a unique reference (donation_id \/ order_number) and a selected payment channel to Bayarcash's API to create a payment intent. The donor's browser is then redirected to Bayarcash to complete payment. After payment, Bayarcash calls our webhook (and POSTs to the return URL) with the transaction status. No donor card \/ bank details ever touch your WordPress server.<\/p>\n\n<p>API endpoints contacted (depending on the \"Mod\" selected in <em>Tetapan \u2192 Bayarcash<\/em>):<\/p>\n\n<ul>\n<li>Live mode: <code>https:\/\/console.bayar.cash\/api\/v2\/<\/code> and <code>https:\/\/api.console.bayar.cash\/v3\/<\/code><\/li>\n<li>Sandbox mode: <code>https:\/\/console.bayarcash-sandbox.com\/api\/v2\/<\/code> and <code>https:\/\/api.console.bayarcash-sandbox.com\/v3\/<\/code><\/li>\n<\/ul>\n\n<p>The sandbox URLs are only contacted when the merchant explicitly selects sandbox mode for testing; live installations never reach the sandbox hosts.<\/p>\n\n<ul>\n<li>Service URL: https:\/\/bayarcash.com\/<\/li>\n<li>Terms of service: https:\/\/bayarcash.com\/terms-conditions\/<\/li>\n<li>Privacy policy: https:\/\/bayarcash.com\/privacy-policy\/<\/li>\n<\/ul>\n\n<h4>Google Fonts (optional, opt-in)<\/h4>\n\n<p>What it is: the Poppins font family hosted by Google Fonts, used for the donation button UI and the frontend dashboard.<\/p>\n\n<p>What is sent and when: this connection is <strong>disabled by default<\/strong>. If \u2014 and only if \u2014 the masjid administrator enables \"Muat Google Fonts\" in <em>Tetapan \u2192 Keselamatan \u2192 Privasi &amp; Sumber Luar<\/em>, the visitor's browser will fetch the Poppins font family from <code>fonts.googleapis.com<\/code> on any page that displays the donation button, dashboard, or thank-you template. When disabled (the default), the plugin falls back to system fonts and no requests are ever made to Google.<\/p>\n\n<ul>\n<li>Service URL: https:\/\/fonts.google.com\/<\/li>\n<li>Terms of service: https:\/\/policies.google.com\/terms<\/li>\n<li>Privacy policy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<p>All donation records remain in your own WordPress database. No data is ever transmitted to the plugin author.<\/p>\n\n<h3>Privacy Policy<\/h3>\n\n<p>This plugin processes the following personal data of donors:<\/p>\n\n<ul>\n<li>Full name<\/li>\n<li>Email address<\/li>\n<li>Phone number (optional)<\/li>\n<li>Donation amount and currency<\/li>\n<li>IP address (for webhook security only \u2014 not stored against the donor record)<\/li>\n<li>Anonymous flag (if the donor opts to donate anonymously)<\/li>\n<\/ul>\n\n<p>This data is:<\/p>\n\n<ul>\n<li><strong>Stored<\/strong> in your WordPress database (tables <code>wp_masjid_donations<\/code> and <code>wp_masjid_donation_logs<\/code>).<\/li>\n<li><strong>Transmitted<\/strong> to the payment gateway (ChipIn Asia or Bayarcash) only at the moment a donor proceeds to checkout, so the gateway can process the payment. See the <strong>External services<\/strong> section above for exactly what is sent to each gateway.<\/li>\n<li><strong>Retained<\/strong> for a period configurable in the plugin's data-retention setting. After this period, donor identifying fields are anonymized.<\/li>\n<\/ul>\n\n<p>Donors may request anonymization or deletion of their record at any time. The frontend dashboard includes a one-click anonymization tool for the masjid administrator.<\/p>\n\n<p>This plugin does <strong>not<\/strong> send any data to the plugin author or to any third party other than the payment gateway the donor actually transacts with.<\/p>\n\n<!--section=installation-->\n<h4>Automatic installation<\/h4>\n\n<ol>\n<li>From your WordPress dashboard, go to <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Search for <strong>\"Masjid Donation Manager\"<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Follow the setup wizard that appears on first activation.<\/li>\n<\/ol>\n\n<h4>Manual installation<\/h4>\n\n<ol>\n<li>Download the plugin <code>.zip<\/code> file.<\/li>\n<li>In your WordPress dashboard, go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Choose the <code>.zip<\/code> file and click <strong>Install Now<\/strong>.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Follow the setup wizard.<\/li>\n<\/ol>\n\n<h4>After activation<\/h4>\n\n<ol>\n<li>The setup wizard will walk you through entering your masjid name, logo, and payment gateway credentials.<\/li>\n<li>A frontend dashboard page is automatically created at <code>yoursite.com\/masjid-admin\/<\/code>.<\/li>\n<li>Create your first campaign from the dashboard (or via <strong>Kempen Derma<\/strong> in wp-admin).<\/li>\n<li>Place a donation button on any page using:\n\n<ul>\n<li><strong>Elementor<\/strong> \u2014 drag the <em>\"Masjid Donation\"<\/em> widget onto your page.<\/li>\n<li><strong>Gutenberg<\/strong> \u2014 search for <em>\"Masjid Donation\"<\/em> in the block inserter.<\/li>\n<li><strong>Shortcode<\/strong> \u2014 use <code>[masjid_donation id=\"X\"]<\/code> where X is your campaign ID.<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<h4>System requirements<\/h4>\n\n<ul>\n<li>WordPress 6.4 or higher.<\/li>\n<li>PHP 8.0 or higher.<\/li>\n<li>HTTPS recommended (required by both payment gateways in live mode).<\/li>\n<li>Active ChipIn Asia and\/or Bayarcash merchant account.<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20pay%20anything%20to%20use%20this%20plugin%3F\"><h3>Do I need to pay anything to use this plugin?<\/h3><\/dt>\n<dd><p>The plugin itself is free and GPL-licensed. However, the payment gateways (ChipIn Asia, Bayarcash) charge their own transaction fees according to their pricing \u2014 please see their respective websites for current rates.<\/p><\/dd>\n<dt id=\"which%20payment%20gateway%20should%20i%20choose%3F\"><h3>Which payment gateway should I choose?<\/h3><\/dt>\n<dd><p>Both work well. ChipIn Asia is generally easier to onboard for smaller organizations and supports FPX, e-wallets and cards. Bayarcash is widely used by Malaysian masjids and supports FPX and DuitNow QR. You can also enable both and pick per campaign.<\/p><\/dd>\n<dt id=\"can%20i%20run%20the%20plugin%20without%20a%20payment%20gateway%2C%20for%20cash%20donations%3F\"><h3>Can I run the plugin without a payment gateway, for cash donations?<\/h3><\/dt>\n<dd><p>The current version requires at least one payment gateway to be configured because donations flow through online checkout. A pure offline \/ cash-receipting mode is on the roadmap.<\/p><\/dd>\n<dt id=\"my%20elementor%20%22papar%20statistik%22%20%2F%20%22papar%20dinding%20penderma%22%20toggles%20don%27t%20seem%20to%20do%20anything.\"><h3>My Elementor \"Papar Statistik\" \/ \"Papar Dinding Penderma\" toggles don't seem to do anything.<\/h3><\/dt>\n<dd><p>This was a bug in versions prior to 1.1.13 \u2014 please update. Both toggles are now respected as widget-level overrides regardless of the campaign-level setting.<\/p><\/dd>\n<dt id=\"where%20is%20the%20donation%20data%20stored%3F\"><h3>Where is the donation data stored?<\/h3><\/dt>\n<dd><p>In two custom tables in your WordPress database \u2014 <code>wp_masjid_donations<\/code> (or your prefix) and <code>wp_masjid_donation_logs<\/code>. No data ever leaves your server except what is transmitted to your chosen payment gateway at the moment a donor checks out.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20gdpr%20%2F%20pdpa%20compliant%3F\"><h3>Is the plugin GDPR \/ PDPA compliant?<\/h3><\/dt>\n<dd><p>The plugin gives you the tools you need: donor anonymization, configurable data-retention period, and external resources (Google Fonts) are opt-in only. You are still responsible for your own privacy notice and for telling visitors what you collect and why.<\/p><\/dd>\n<dt id=\"how%20do%20i%20uninstall%20completely%3F\"><h3>How do I uninstall completely?<\/h3><\/dt>\n<dd><p>Deactivate the plugin, then click <strong>Delete<\/strong>. The uninstall routine will drop the custom tables, remove the dashboard page, delete plugin options, remove custom roles and capabilities, and remove all campaign posts. <strong>This is irreversible \u2014 back up your donation data first.<\/strong><\/p><\/dd>\n<dt id=\"can%20i%20translate%20the%20plugin%3F\"><h3>Can I translate the plugin?<\/h3><\/dt>\n<dd><p>Yes. All user-facing strings use the <code>masjid-donation<\/code> text domain. Drop a <code>.mo<\/code> file into <code>wp-content\/languages\/plugins\/<\/code> named <code>masjid-donation-{locale}.mo<\/code>.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20support%20recurring%20%2F%20subscription%20donations%3F\"><h3>Does this plugin support recurring \/ subscription donations?<\/h3><\/dt>\n<dd><p>Not yet. The current scope is one-off donations only. Recurring is on the roadmap pending gateway support.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.30<\/h4>\n\n<p><em>Released: 28 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>New:<\/strong> Added a \"Donate to author\" link to the plugin's row on the Plugins screen (<em>Plugins \u2192 Installed Plugins<\/em>), letting supporters contribute towards continued development. The link is informational only and does not send any data from your site.<\/li>\n<\/ul>\n\n<h4>1.1.29<\/h4>\n\n<p><em>Released: 23 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Code quality (Plugin Check):<\/strong> Removed the explicit <code>suppress_filters =&gt; true<\/code> argument from the campaign lookup in the prefix-rename migration (it is prohibited by the performance sniff and was redundant \u2014 <code>get_posts()<\/code> already defaults it internally).<\/li>\n<li><strong>Code quality (Plugin Check):<\/strong> Added targeted <code>phpcs:ignore<\/code> annotations with justifications to the dashboard-page meta lookup in <code>Page_Provisioner::find_existing_page()<\/code>. The <code>meta_key<\/code> \/ <code>meta_value<\/code> query runs only during activation \/ page-provisioning \/ self-heal (never on a front-end request) and returns a single row, so the SlowDBQuery warning does not apply.<\/li>\n<\/ul>\n\n<h4>1.1.28<\/h4>\n\n<p><em>Released: 23 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Code quality (Plugin Check):<\/strong> The prefix-rename migration in the activator no longer issues direct <code>$wpdb<\/code> queries. Per-campaign meta is now copied through <code>get_posts()<\/code> \/ <code>get_post_meta()<\/code> \/ <code>update_post_meta()<\/code> and donor phone numbers through <code>get_users()<\/code> \/ <code>get_user_meta()<\/code>, clearing the <code>WordPress.DB.DirectDatabaseQuery<\/code> (DirectQuery \/ NoCaching) warnings.<\/li>\n<li><strong>Code quality (Plugin Check):<\/strong> The branded login handler's <code>$_POST<\/code> reads now carry their <code>phpcs:ignore<\/code> annotations on the exact access lines, resolving the reported <code>ValidatedSanitizedInput.InputNotSanitized<\/code> (the password is intentionally passed raw to <code>wp_signon()<\/code>) and <code>NonceVerification.Missing<\/code> (the login POST is nonce-verified before the field is read) warnings.<\/li>\n<li><strong>Compatibility:<\/strong> <code>Tested up to<\/code> bumped to WordPress 7.0. Trimmed the 1.1.22 upgrade notice under the 300-character limit.<\/li>\n<\/ul>\n\n<h4>1.1.27<\/h4>\n\n<p><em>Released: 23 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Compatibility:<\/strong> The plugin prefix was lengthened from the 3-character <code>mdm<\/code> (constants <code>MDM_<\/code>, options\/meta\/hooks\/capabilities <code>mdm_<\/code>, the localized script objects <code>mdmData<\/code> \/ <code>mdmDash<\/code> \/ <code>mdmBlockData<\/code>) to the 8-character <code>masjiddm<\/code> prefix, satisfying the WordPress.org guideline requiring a distinct prefix of at least four characters. A one-time, non-destructive migration runs on upgrade and copies every existing setting, per-campaign meta, donor phone number and role capability from the old <code>mdm_<\/code> keys to the new <code>masjiddm_<\/code> keys, so existing installations keep all of their data and treasurer permissions. Legacy scheduled cron events are cleared and re-registered under the new names.<\/li>\n<li><strong>Code quality:<\/strong> The white-labeled login \/ reset-password pages no longer emit an inline <code>&lt;style&gt;<\/code> block, inline <code>&lt;script&gt;<\/code>, or a Google Fonts <code>&lt;link&gt;<\/code> tag. Their CSS now lives in <code>assets\/css\/auth.css<\/code> and the password show\/hide behaviour in <code>assets\/js\/auth.js<\/code>; both are registered and enqueued with <code>wp_register_style()<\/code> \/ <code>wp_enqueue_style()<\/code> \/ <code>wp_register_script()<\/code> \/ <code>wp_enqueue_script()<\/code> and flushed into the self-contained document with <code>wp_print_styles()<\/code> \/ <code>wp_print_scripts()<\/code>. The optional Poppins font is enqueued (still opt-in) instead of hard-coded as a <code>&lt;link&gt;<\/code>.<\/li>\n<\/ul>\n\n<h4>1.1.26<\/h4>\n\n<p><em>Released: 22 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Change:<\/strong> After clicking \"Log Keluar\", the user is now redirected back to the dashboard page (<code>\/masjid-admin\/<\/code>) instead of the site homepage. Since they're logged out at that point, they land on the branded login page \u2014 keeping the whole experience self-contained and white-labeled.<\/li>\n<\/ul>\n\n<h4>1.1.25<\/h4>\n\n<p><em>Released: 22 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Fix:<\/strong> The real cause of the hidden logout button \u2014 the fixed mobile bottom navigation bar (Utama\/Kempen\/Derma\/Laporan) shares the same stacking level as the sidebar and was painting on top of the sidebar footer, covering the \"Log Keluar\" button. The bottom nav is now hidden while the slide-out menu is open, and the sidebar's stacking order was raised above it. The logout button is now fully visible when the menu is open.<\/li>\n<\/ul>\n\n<h4>1.1.24<\/h4>\n\n<p><em>Released: 22 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Fix:<\/strong> The logout button in the mobile slide-out menu could still be hidden behind the phone's browser\/navigation bar. The sidebar drawer now sizes itself to the actual visible viewport (using fixed top\/bottom insets instead of <code>vh<\/code>\/<code>dvh<\/code> units, which include the area behind the browser toolbar), and the footer adds safe-area bottom padding. The \"Log Keluar\" button is now fully visible above the browser bar on phones. (Note: a website cannot hide the browser's own toolbar \u2014 this fix makes the menu respect it instead.)<\/li>\n<\/ul>\n\n<h4>1.1.23<\/h4>\n\n<p><em>Released: 22 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>New \u2014 clear logout button:<\/strong> The dashboard sidebar now has a prominent full-width \"Log Keluar\" button (with a logout icon) below the user pill, replacing the small text link that was easy to miss \u2014 especially in the mobile slide-out menu. The user's role (Pentadbir\/Bendahari) is also shown under their name.<\/li>\n<li><strong>Fix:<\/strong> On mobile, the sidebar footer (and therefore the logout button) could sit below the visible area behind the browser\/navigation bars. The sidebar now uses dynamic viewport height (<code>100dvh<\/code>) with safe-area insets and a non-shrinking footer, so the logout button is always reachable.<\/li>\n<\/ul>\n\n<h4>1.1.22<\/h4>\n\n<p><em>Released: 22 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>New \u2014 branded password recovery:<\/strong> The WordPress \"forgot password\" and \"reset password\" screens (<code>wp-login.php?action=lostpassword<\/code> \/ <code>rp<\/code>) are now intercepted and rendered with the same branded card as the login page, so the whole recovery flow stays white-labeled. WordPress's own secure routines (<code>retrieve_password()<\/code>, <code>check_password_reset_key()<\/code>, <code>reset_password()<\/code>) still run underneath \u2014 only the presentation is replaced. The forgot-password response is deliberately generic to avoid revealing whether an account exists.<\/li>\n<li><strong>New \u2014 Poppins on auth pages:<\/strong> The login and password-recovery pages now load the Poppins font (matching the dashboard) when the existing \"Muat Google Fonts (Poppins)\" setting is enabled. When the setting is off they fall back to the system font stack, keeping the WordPress.org \"no remote resources without consent\" compliance intact.<\/li>\n<li><strong>Refactor:<\/strong> Shared login\/recovery chrome and styling extracted into a single <code>Auth_Page_Renderer<\/code> so all three screens stay visually identical.<\/li>\n<\/ul>\n\n<h4>1.1.21<\/h4>\n\n<p><em>Released: 22 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>New \u2014 branded login page:<\/strong> Logged-out visitors to the frontend dashboard (<code>\/masjid-admin\/<\/code>) now see a custom \"Selamat kembali\" login card styled to match the dashboard, instead of being redirected to the WordPress <code>wp-login.php<\/code> screen. Includes an email\/username field, show-password toggle, \"keep me signed in for 30 days\" option, a \"forgot password\" link, and inline error messages. Authentication is handled securely in-place via <code>wp_signon()<\/code> with nonce protection. Combined with the 1.1.20 white-labeling, treasurers never see WordPress branding.<\/li>\n<\/ul>\n\n<h4>1.1.20<\/h4>\n\n<p><em>Released: 20 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>New \u2014 white-label for Bendahari:<\/strong> Users with the Bendahari (treasurer) role no longer see the WordPress admin bar on the frontend, and are redirected to the frontend dashboard if they try to open <code>\/wp-admin\/<\/code>. This keeps the donation system looking like a standalone app rather than a WordPress site. Administrators are unaffected and keep the normal admin bar and backend. AJAX requests are still allowed so the frontend dashboard keeps working.<\/li>\n<\/ul>\n\n<h4>1.1.19<\/h4>\n\n<p><em>Released: 20 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>PluginCheck pass:<\/strong> Six <code>WordPress.Security.NonceVerification.Missing<\/code> warnings in <code>Dashboard_Ajax::export_report()<\/code>, <code>assign_treasurer()<\/code> and <code>revoke_treasurer()<\/code> now carry inline <code>phpcs:ignore<\/code> comments. The file-level suppression added in 1.1.18 is honoured for most handlers, but the sniff doesn't trace nonce verification through <code>$this-&gt;check_nonce()<\/code> and re-flags the three handlers where <code>$_POST<\/code> reads happen on the line immediately after the helper call. Nonce IS verified on every public handler \u2014 see the file-header note.<\/li>\n<li><strong>PluginCheck pass:<\/strong> <code>uninstall.php<\/code> \u2014 the <code>\/\/ phpcs:enable<\/code> after the schema-change block was previously unscoped, which also re-enabled the file-wide <code>NonPrefixedVariableFound<\/code> suppression and re-flagged <code>$mdm_page_id<\/code>, <code>$mdm_admin_role<\/code>, <code>$mdm_cap<\/code>, <code>$mdm_campaigns<\/code>, <code>$mdm_campaign_id<\/code>. The enable directive is now scoped to only the <code>DirectDatabaseQuery.*<\/code> \/ <code>PreparedSQL.InterpolatedNotPrepared<\/code> sniffs.<\/li>\n<\/ul>\n\n<h4>1.1.18<\/h4>\n\n<p><em>Released: 20 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>PluginCheck pass:<\/strong> Pending poller and activator migration queries now pass the table name through the <code>%i<\/code> identifier placeholder in <code>$wpdb-&gt;prepare()<\/code> instead of being interpolated into the SQL string (<code>PluginCheck.Security.DirectDB.UnescapedDBParameter<\/code>). Same treatment applied to column identifiers in the legacy <code>migrate_to_utc_timestamps()<\/code> routine.<\/li>\n<li><strong>PluginCheck pass:<\/strong> File-level <code>phpcs:disable<\/code> annotations in <code>Dashboard_Ajax<\/code> moved out of the docblock into standalone comments so static analysers honour them, and extended to cover <code>WordPress.DB.DirectDatabaseQuery.DirectQuery<\/code> \/ <code>NoCaching<\/code> for the reports\/stats endpoints (custom-table queries with no WP API equivalent).<\/li>\n<li><strong>PluginCheck pass:<\/strong> Targeted <code>phpcs:ignore<\/code> comments added to <code>mdm_plugin()<\/code> (bootstrap function), <code>mdm_donation_rewrite_rules_flushed<\/code> (hook), and the <code>$mdm_*<\/code> globals in <code>uninstall.php<\/code>. The PluginCheck sniff cannot learn that <code>mdm<\/code> is the plugin's chosen prefix; each ignore is paired with an inline note explaining why.<\/li>\n<li><strong>PluginCheck pass:<\/strong> <code>fwrite()<\/code> call in CSV export streamer now carries the same <code>WordPress.WP.AlternativeFunctions.file_system_operations_fwrite<\/code> ignore as the surrounding <code>fopen()<\/code> \/ <code>fclose()<\/code>. (The stream is <code>php:\/\/output<\/code>, which <code>WP_Filesystem<\/code> cannot abstract.)<\/li>\n<li><strong>readme.txt:<\/strong> Upgrade notice for 1.1.17 shortened to satisfy the 300-character limit.<\/li>\n<\/ul>\n\n<h4>1.1.17<\/h4>\n\n<p><em>Released: 20 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>PluginCheck pass:<\/strong> Namespace renamed from <code>MDM\\<\/code> (3 chars) to <code>MasjidDM\\<\/code> (8 chars) across all 35 PHP files to satisfy the 4-character minimum prefix rule. Autoloader updated. No backwards-compatibility impact \u2014 nothing outside the plugin referenced the old namespace.<\/li>\n<li><strong>PluginCheck pass:<\/strong> Bootstrap function renamed from <code>mdm()<\/code> \u2192 <code>mdm_plugin()<\/code>. Hook name <code>mdm_rewrite_rules_flushed<\/code> \u2192 <code>mdm_donation_rewrite_rules_flushed<\/code>. Global variables in <code>uninstall.php<\/code> now carry the <code>$mdm_<\/code> prefix.<\/li>\n<li><strong>Date safety:<\/strong> <code>date()<\/code> calls replaced with <code>gmdate()<\/code> in <code>Donation_Manager::generate_id()<\/code> and <code>Dashboard_Ajax::dashboard_stats()<\/code> so donation IDs and date filters are not subject to the WP server's runtime timezone.<\/li>\n<li><strong>Redirect hardening:<\/strong> <code>wp_redirect()<\/code> \u2192 <code>wp_safe_redirect()<\/code> in <code>Admin::render_dashboard_redirect()<\/code> and <code>Frontend_Dashboard::maybe_render()<\/code>.<\/li>\n<li><strong>Sanitization visibility:<\/strong> <code>Campaign_CPT::save_meta()<\/code> now sanitizes each <code>$_POST<\/code> field through an explicit, statically-known function (sanitize_text_field \/ floatval \/ absint) instead of a dynamic <code>$sanitizer( ... )<\/code> dispatch, so static analysers can trace input sanitization at the call site.<\/li>\n<li><strong>Sanitization visibility:<\/strong> <code>Dashboard_Ajax::validate_ymd_date()<\/code> now accepts an already-sanitized string; every call site does <code>sanitize_text_field( wp_unslash( $_POST[...] ?? '' ) )<\/code> inline, making the input-handling chain visible.<\/li>\n<li><strong>Sanitization:<\/strong> Bayarcash return-URL params in <code>Thank_You_Page::extract_bayarcash_return_params()<\/code> now pass through <code>sanitize_text_field()<\/code> after <code>wp_unslash()<\/code> (previously unslashed but not sanitized).<\/li>\n<li><strong>readme.txt:<\/strong> Short description rewritten in English (was Bahasa Malaysia, which triggered the unofficial-language warning).<\/li>\n<li><strong>Maintenance:<\/strong> File-level PHPCS suppression notes added to <code>Dashboard_Ajax<\/code>, <code>Thank_You_Page<\/code>, <code>Donation_Manager<\/code>, <code>Activator<\/code>, and <code>Pending_Poller<\/code> explaining where each suppression applies and why (nonce verification via helper methods; custom-table queries with no WP API equivalent). Three targeted <code>phpcs:ignore<\/code> lines added to <code>Shortcodes::donation_button()<\/code> \/ <code>campaigns_list()<\/code> where the echoed return value is already escaped inside the method.<\/li>\n<\/ul>\n\n<h4>1.1.16<\/h4>\n\n<p><em>Released: 20 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Security:<\/strong> <code>GET \/wp-json\/masjid-donation\/v1\/campaign\/{id}<\/code> now whitelists the fields it returns, stripping per-campaign gateway credentials (ChipIn API key \/ secret, Bayarcash PAT \/ API secret \/ portal key) that would otherwise have been exposed by the public endpoint. The AJAX <code>mdm_get_campaign_data<\/code> handler already whitelisted its response; the REST equivalent now does the same.<\/li>\n<li><strong>Security:<\/strong> Audit-log payload for \"save campaign\" no longer copies raw <code>$_POST<\/code> values into <code>incoming_fields<\/code>; each captured field is unslashed and sanitized individually before storage.<\/li>\n<li><strong>Hardening:<\/strong> Gutenberg block render now calls the donation-button shortcode handler directly with sanitized attributes instead of building a <code>[masjid_donation ...]<\/code> string and routing it through <code>do_shortcode()<\/code>. Output escaping was already correct inside the shortcode, but the new path removes the string-interpolation surface entirely.<\/li>\n<li><strong>Documentation:<\/strong> <code>readme.txt<\/code> External services section expanded to list the specific API hostnames the plugin contacts for each gateway, including sandbox endpoints (<code>console.bayarcash-sandbox.com<\/code>, <code>api.console.bayarcash-sandbox.com<\/code>) so admins know exactly which hosts are reached in test mode.<\/li>\n<li><strong>Cleanup:<\/strong> Empty-state markup in the block render no longer uses inline <code>style=\"...\"<\/code>; styling moved to <code>assets\/css\/public.css<\/code> (<code>.mdm-block-empty<\/code>).<\/li>\n<\/ul>\n\n<h4>1.1.15<\/h4>\n\n<p><em>Released: 18 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Compliance (WordPress.org plugin review pass):<\/strong> All previously-inlined <code>&lt;style&gt;<\/code>, <code>&lt;script&gt;<\/code> and Google Fonts <code>&lt;link&gt;<\/code> tags are now registered through <code>wp_enqueue_style()<\/code> \/ <code>wp_enqueue_script()<\/code>. New asset files: <code>assets\/css\/thank-you.css<\/code>, <code>assets\/js\/thank-you.js<\/code>, <code>assets\/css\/setup-wizard.css<\/code>, <code>assets\/js\/setup-wizard.js<\/code>, <code>assets\/js\/campaign-admin.js<\/code>.<\/li>\n<li><strong>Compliance:<\/strong> Setup wizard inline <code>onclick<\/code> handlers replaced with <code>data-*<\/code> attributes and unobtrusive event listeners.<\/li>\n<li><strong>Security:<\/strong> Client-IP derivation from <code>$_SERVER<\/code> (HTTP_CF_CONNECTING_IP \/ HTTP_X_FORWARDED_FOR \/ REMOTE_ADDR) now sanitizes the raw header value before parsing, and the resolved value is validated through <code>FILTER_VALIDATE_IP<\/code> so spoofed or malformed proxy headers cannot land in the database.<\/li>\n<li><strong>Documentation:<\/strong> Every public REST endpoint (<code>\/campaign\/{id}<\/code>, <code>\/donor-wall\/{id}<\/code>, <code>\/return\/{gateway}<\/code>, <code>\/return<\/code>, <code>\/webhook\/{gateway}<\/code>) now carries an explicit code comment explaining why its <code>permission_callback<\/code> is <code>__return_true<\/code> and where the actual trust boundary lives (checksum verification, IP allow-list, etc).<\/li>\n<li><strong>Library update:<\/strong> Chart.js bundled locally bumped from <code>4.4.0<\/code> \u2192 <code>4.5.1<\/code> (current stable upstream).<\/li>\n<li><strong>Documentation:<\/strong> Updated readme.txt with corrected Terms \/ Privacy URLs for ChipIn Asia (<code>chip-in.asia\/terms-of-service<\/code>, <code>chip-in.asia\/privacy-policy<\/code>) and Bayarcash (<code>bayarcash.com\/terms-conditions\/<\/code>, <code>bayarcash.com\/privacy-policy\/<\/code>). Added a dedicated <code>== External services ==<\/code> section disclosing exactly what data is sent to each third party and when.<\/li>\n<\/ul>\n\n<h4>1.1.14<\/h4>\n\n<p><em>Released: 16 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Security hardening (PluginCheck pass):<\/strong> Date inputs for the reports endpoint are now strictly validated against <code>Y-m-d<\/code> calendar format before reaching the database layer, instead of relying on <code>sanitize_text_field()<\/code> alone.<\/li>\n<li><strong>SQL identifier escaping:<\/strong> The masjid_donations table name is now passed via the <code>%i<\/code> placeholder in <code>$wpdb-&gt;prepare()<\/code> instead of being interpolated into the SQL string, satisfying <code>PluginCheck.Security.DirectDB.UnescapedDBParameter<\/code>.<\/li>\n<li><strong>i18n:<\/strong> Created <code>languages\/<\/code> directory and shipped a <code>masjid-donation.pot<\/code> translation template so the <code>Domain Path<\/code> header points to a real folder.<\/li>\n<li><strong>Export format whitelist:<\/strong> The <code>format<\/code> parameter on the CSV export endpoint is now constrained to a known whitelist (<code>csv<\/code>) before use.<\/li>\n<\/ul>\n\n<h4>1.1.13<\/h4>\n\n<p><em>Released: 16 May 2026<\/em><\/p>\n\n<ul>\n<li><strong>Fix:<\/strong> Elementor widget \u2014 \"Papar Statistik\" and \"Papar Dinding Penderma\" toggles now correctly override the campaign-level setting. Previously the widget controls were ignored and the page always rendered both sections.<\/li>\n<li><strong>Fix:<\/strong> Gutenberg block \u2014 added the same \"Show Stats\" and \"Show Donor Wall\" toggles for parity with Elementor.<\/li>\n<li><strong>Compliance:<\/strong> Chart.js is now bundled locally (<code>assets\/vendor\/chart.umd.min.js<\/code>) instead of loaded from a CDN, per WordPress.org plugin guideline 7 (no remote-loaded scripts).<\/li>\n<li><strong>Privacy:<\/strong> Google Fonts (Poppins) loading is now opt-in via a new <em>Tetapan \u2192 Privasi<\/em> setting. By default the plugin uses system fonts, which avoids leaking visitor IPs to Google.<\/li>\n<li><strong>Cleanup:<\/strong> Uninstall routine now uses <code>$wpdb-&gt;prepare()<\/code> everywhere, cleans up transients, and force-deletes campaign meta.<\/li>\n<\/ul>\n\n<h4>1.1.12<\/h4>\n\n<ul>\n<li>Internal cleanup and migration safety on plugin upgrade.<\/li>\n<\/ul>\n\n<h4>1.1.x<\/h4>\n\n<ul>\n<li>Bayarcash and ChipIn Asia gateway integration improvements, frontend dashboard, donor wall, custom reports.<\/li>\n<\/ul>","raw_excerpt":"Complete masjid donation management with Malaysian ChipIn Asia and Bayarcash gateways, multiple campaigns, frontend dashboard and detailed reports.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/314204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=314204"}],"author":[{"embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/eskillsproductions"}],"wp:attachment":[{"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=314204"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=314204"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=314204"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=314204"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=314204"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-co.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=314204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}