{"id":320996,"date":"2026-06-09T18:48:22","date_gmt":"2026-06-09T18:48:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sendsms-subscribers-2fa\/"},"modified":"2026-08-14T10:06:30","modified_gmt":"2026-08-14T10:06:30","slug":"sendsms-subscribers-2fa","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/sendsms-subscribers-2fa\/","author":23502224,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.6","stable_tag":"2.0.6","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"SendSMS Subscribers & 2FA","header_author":"sendSMS","header_description":"Manage SMS subscribers, send mass campaigns, and protect wp-admin with SMS-based 2FA through the sendsms.ro gateway.","assets_banners_color":"bddfec","last_updated":"2026-08-14 10:06:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.sendsms.ro\/en\/","header_author_uri":"https:\/\/www.sendsms.ro\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":286,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.0.3":{"tag":"2.0.3","author":"sendsms","date":"2026-06-09 18:57:41"},"2.0.5":{"tag":"2.0.5","author":"sendsms","date":"2026-08-14 09:56:33"},"2.0.6":{"tag":"2.0.6","author":"sendsms","date":"2026-08-14 10:06:30"}},"upgrade_notice":{"2.0.6":"<p>The subscribe and unsubscribe forms now show a specific message for each error instead of one generic &quot;Something went wrong&quot;.<\/p>","2.0.5":"<p>Fixes the block editor strings, which used an outdated text domain and were never loaded for translation.<\/p>","2.0.4":"<p>Compatibility release for WordPress 7.1. Fixes the subscribe\/unsubscribe block preview rendering unstyled in the block editor.<\/p>","2.0.3":"<p>Documentation-only corrections (supported versions, install instructions, example URL). No functional or data changes.<\/p>","2.0.2":"<p>Plugin renamed to &quot;SendSMS Subscribers &amp; 2FA&quot; for the WordPress.org directory. No functional or data changes.<\/p>","2.0.1":"<p>Internal names are now prefixed <code>rosendsms_dash_<\/code>. Settings, SMS history, and subscribers migrate automatically; shortcodes, blocks, widgets, and CSS classes are unchanged.<\/p>","2.0.0":"<p>Full rewrite under the SendSMS\\Dashboard namespace. Settings, SMS history, and subscriber data carry over automatically.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3566445,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3566445,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3566445,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3566445,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"sendsms-dashboard\/unsubscribe":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"sendsms-dashboard\/unsubscribe","version":"2.0.0","title":"SendSMS Unsubscribe","category":"widgets","icon":"smartphone","description":"Render the SendSMS unsubscribe form so visitors can remove their phone from your SMS list.","keywords":["sms","unsubscribe","sendsms"],"textdomain":"sendsms-subscribers-2fa","attributes":{"title":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"editorScript":"rosendsms-dash-block-unsubscribe","style":"rosendsms-dash-public"},"sendsms-dashboard\/subscribe":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"sendsms-dashboard\/subscribe","version":"2.0.0","title":"SendSMS Subscribe","category":"widgets","icon":"smartphone","description":"Render the SendSMS subscribe form so visitors can opt in to your SMS list.","keywords":["sms","subscribe","sendsms","newsletter"],"textdomain":"sendsms-subscribers-2fa","attributes":{"title":{"type":"string","default":""},"gdpr_link":{"type":"string","default":""}},"supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"editorScript":"rosendsms-dash-block-subscribe","style":"rosendsms-dash-public"}},"tagged_versions":["2.0.3","2.0.5","2.0.6"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3566445,"resolution":"1","location":"assets","locale":"","width":3458,"height":2354},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3566445,"resolution":"2","location":"assets","locale":"","width":3458,"height":2354},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3566445,"resolution":"3","location":"assets","locale":"","width":3458,"height":2354},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3566445,"resolution":"4","location":"assets","locale":"","width":3458,"height":2354},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3566445,"resolution":"5","location":"assets","locale":"","width":3458,"height":2354},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3566445,"resolution":"6","location":"assets","locale":"","width":3458,"height":2354}},"screenshots":{"1":"Settings, General tab: API credentials (username, password, sender label) and country code selector.","2":"Settings, User tab: enable 2FA, select which roles require it, and customise the verification message.","3":"Settings, Subscription tab: toggle phone verification on subscribe\/unsubscribe, set the IP rate limit, and manage blocked IPs.","4":"Subscribers admin page: searchable list table with add, edit, delete, and sendsms.ro contact-sync actions.","5":"History page: every SMS the plugin sent, with timestamp, recipient, message text, and delivery status.","6":"Send a test SMS page: send a one-off message to any number to verify your sender label and content."}},"plugin_section":[],"plugin_tags":[9211,456,192825,711,1016],"plugin_category":[41,55],"plugin_contributors":[132395,265134],"plugin_business_model":[],"class_list":["post-320996","plugin","type-plugin","status-publish","hentry","plugin_tags-2fa","plugin_tags-marketing","plugin_tags-sendsms","plugin_tags-sms","plugin_tags-subscribers","plugin_category-communication","plugin_category-seo-and-marketing","plugin_contributors-neamtua","plugin_contributors-sendsms","plugin_committers-sendsms"],"banners":{"banner":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/banner-772x250.png?rev=3566445","banner_2x":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/banner-1544x500.png?rev=3566445","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/icon-128x128.png?rev=3566445","icon_2x":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/icon-256x256.png?rev=3566445","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/screenshot-1.png?rev=3566445","caption":"Settings, General tab: API credentials (username, password, sender label) and country code selector."},{"src":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/screenshot-2.png?rev=3566445","caption":"Settings, User tab: enable 2FA, select which roles require it, and customise the verification message."},{"src":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/screenshot-3.png?rev=3566445","caption":"Settings, Subscription tab: toggle phone verification on subscribe\/unsubscribe, set the IP rate limit, and manage blocked IPs."},{"src":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/screenshot-4.png?rev=3566445","caption":"Subscribers admin page: searchable list table with add, edit, delete, and sendsms.ro contact-sync actions."},{"src":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/screenshot-5.png?rev=3566445","caption":"History page: every SMS the plugin sent, with timestamp, recipient, message text, and delivery status."},{"src":"https:\/\/ps.w.org\/sendsms-subscribers-2fa\/assets\/screenshot-6.png?rev=3566445","caption":"Send a test SMS page: send a one-off message to any number to verify your sender label and content."}],"raw_content":"<!--section=description-->\n<p><strong>SendSMS Subscribers &amp; 2FA<\/strong> connects your WordPress site to the <a href=\"https:\/\/www.sendsms.ro\/en\/\">sendsms.ro<\/a> SMS gateway and gives you two independent capabilities: a full subscriber management and SMS marketing system, and an SMS-based two-factor authentication layer on the wp-admin login form.<\/p>\n\n<p><strong>Subscriber management and campaigns:<\/strong><\/p>\n\n<ul>\n<li>Subscribe and unsubscribe widgets you can drop into any widgetised area on the frontend.<\/li>\n<li>Optional phone-verification step on subscribe\/unsubscribe (sends a one-time code; IP rate-limiting prevents abuse).<\/li>\n<li>Subscriber admin page with a searchable list table \u2014 add, edit, delete, or sync contacts to your sendsms.ro address book with one click.<\/li>\n<li>Mass-send SMS to all subscribers, or to WordPress users filtered by role.<\/li>\n<li>Complete SMS history log of every message the plugin sends.<\/li>\n<li>\"Send a test SMS\" page for verifying your sender label and message content against any phone number.<\/li>\n<\/ul>\n\n<p><strong>SMS two-factor authentication:<\/strong><\/p>\n\n<ul>\n<li>Enable 2FA per user role \u2014 only the roles you pick require a second factor.<\/li>\n<li>On first login, users who don't yet have a phone number stored are prompted to enrol.<\/li>\n<li>A one-time code is sent to the user's phone; the wp-admin session is not opened until the code is validated.<\/li>\n<li>Codes are time-limited and bound to a signed cookie so they cannot be replayed.<\/li>\n<\/ul>\n\n<p><strong>Compatibility:<\/strong> PHP 7.4 through 8.3, WordPress 6.0 through 7.1. Verified on PHP 7.4 and PHP 8.3 against WordPress 7.1.<\/p>\n\n<p>This plugin requires a <a href=\"https:\/\/www.sendsms.ro\/en\/\">sendsms.ro<\/a> account. Sign-up is free; SMS pricing is per message and depends on the destination country.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the <strong>sendsms.ro<\/strong> SMS gateway \u2014 a third-party service operated by SC sendSMS Solutions SRL \u2014 to deliver text messages and manage your contact list. Using the plugin requires an active sendsms.ro account.<\/p>\n\n<p>What the service is used for:<\/p>\n\n<ul>\n<li>Sending the subscribe\/unsubscribe confirmation and one-time verification-code SMS to the phone numbers visitors enter in the frontend forms.<\/li>\n<li>Sending the two-factor-authentication code SMS to wp-admin users when SMS 2FA is enabled for their role.<\/li>\n<li>Sending the test SMS triggered from the <strong>SendSMS Dashboard \u2192 Send a test SMS<\/strong> page.<\/li>\n<li>Sending bulk SMS triggered from the <strong>SendSMS Dashboard \u2192 SMS sending<\/strong> page (to all subscribers, or to WordPress users filtered by role).<\/li>\n<li>Reading your account balance to display it on the <strong>Settings<\/strong> page.<\/li>\n<li>Creating and updating contacts (and the contact group) in your sendsms.ro address book when you sync a subscriber from the <strong>Subscribers<\/strong> page.<\/li>\n<\/ul>\n\n<p>What data is sent, and when:<\/p>\n\n<ul>\n<li>On every outbound SMS: your sendsms.ro <strong>username<\/strong> and <strong>API key\/password<\/strong>, the configured <strong>sender label<\/strong>, the <strong>recipient phone number<\/strong> (a visitor\/subscriber number, an admin-supplied number for tests, or a user's stored number for 2FA), and the <strong>message body<\/strong>. Bulk sends POST the recipient list and message together as a batch.<\/li>\n<li>On a contact sync: your <strong>username<\/strong>, <strong>API key\/password<\/strong>, and the subscriber's <strong>phone number, first name, and last name<\/strong>.<\/li>\n<li>On a balance check: your <strong>username<\/strong> and <strong>API key\/password<\/strong>.<\/li>\n<li>No data is sent until you have entered credentials and either a visitor submits a form, a protected user logs in, or you press a send\/sync button \u2014 or you open the Settings page, which checks the balance once per page load and caches it for 5 minutes.<\/li>\n<\/ul>\n\n<p>Service endpoint used: <code>https:\/\/api.sendsms.ro\/json<\/code> (HTTPS).<\/p>\n\n<p>Third-party terms of service and privacy:<\/p>\n\n<ul>\n<li>Terms and conditions: https:\/\/www.sendsms.ro\/en\/terms-and-conditions\/<\/li>\n<li>GDPR \/ privacy: https:\/\/www.sendsms.ro\/en\/gdpr\/<\/li>\n<li>ISO 27001 certification: https:\/\/www.sendsms.ro\/en\/iso-27001-certified\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>sendsms-subscribers-2fa<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the plugin from the WordPress.org directory.<\/li>\n<li>Activate the plugin under <strong>Plugins \u2192 Installed Plugins<\/strong>.<\/li>\n<li>Go to <strong>SendSMS Dashboard \u2192 Settings<\/strong> and enter your sendsms.ro username, password, and sender label.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20sendsms.ro%20account%3F\"><h3>Do I need a sendsms.ro account?<\/h3><\/dt>\n<dd><p>Yes. Sign up for free at https:\/\/www.sendsms.ro\/en\/ and top up your balance. SMS are charged per message; pricing depends on the destination country.<\/p><\/dd>\n<dt id=\"does%20the%202fa%20work%20with%20custom%20login%20plugins%3F\"><h3>Does the 2FA work with custom login plugins?<\/h3><\/dt>\n<dd><p>No. The 2FA feature is designed for the default wp-admin login form \u2014 the one WordPress ships at <code>\/wp-login.php<\/code>. Custom login plugins or themes that replace the login form are not supported and may behave unpredictably. Always test in a development environment before enabling 2FA on a live site.<\/p><\/dd>\n<dt id=\"what%20php%20and%20wordpress%20versions%20are%20supported%3F\"><h3>What PHP and WordPress versions are supported?<\/h3><\/dt>\n<dd><p>PHP 7.4 through PHP 8.3, WordPress 6.0 through 7.1. The plugin is verified on PHP 7.4 and PHP 8.3 against WordPress 7.1.<\/p><\/dd>\n<dt id=\"a%20user%20is%20locked%20out%20because%20they%20lost%20their%20phone.%20how%20do%20i%20rescue%20them%3F\"><h3>A user is locked out because they lost their phone. How do I rescue them?<\/h3><\/dt>\n<dd><p>You have three options, depending on your situation:<\/p>\n\n<ol>\n<li><strong>Edit the user<\/strong> \u2014 go to <strong>Users \u2192 All Users<\/strong>, open the locked-out user's profile, and clear the phone field. The next login will skip 2FA and prompt for a new number.<\/li>\n<li><strong>Remove the role from 2FA<\/strong> \u2014 in <strong>SendSMS Dashboard \u2192 Settings \u2192 User<\/strong>, deselect the user's role from the <code>2fa_roles<\/code> list and save. 2FA will no longer apply to that role.<\/li>\n<li><strong>Sole-admin recovery<\/strong> \u2014 if the locked-out user is the only admin, use WP-CLI (<code>wp option get sendsms_dashboard_plugin_settings<\/code>) or direct database access to clear the phone number stored in the plugin settings option, or to remove the role from <code>2fa_roles<\/code>.<\/li>\n<\/ol><\/dd>\n<dt id=\"will%20my%20version%201.x%20settings%20and%20data%20carry%20over%3F\"><h3>Will my version 1.x settings and data carry over?<\/h3><\/dt>\n<dd><p>Yes. The subscriber table, the SMS history table, and the settings option all keep their v1.x names. No data migration is required; upgrading from 1.x to 2.0 is transparent.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20the%20subscribe%20%2F%20unsubscribe%20form%20to%20a%20page%3F\"><h3>How do I add the subscribe \/ unsubscribe form to a page?<\/h3><\/dt>\n<dd><p>Three ways, all produce the same HTML and behaviour:<\/p>\n\n<ul>\n<li><strong>Classic widget<\/strong> \u2014 Appearance \u2192 Widgets, drag <em>SendSMS Subscription<\/em> or <em>SendSMS Unsubscribe<\/em> into a sidebar. Requires a theme that registers widget areas (or the <em>Classic Widgets<\/em> plugin).<\/li>\n<li><strong>Shortcode<\/strong> \u2014 drop <code>[sendsms_subscribe]<\/code> or <code>[sendsms_unsubscribe]<\/code> into any post, page, or block. See attributes below.<\/li>\n<li><strong>Gutenberg block<\/strong> \u2014 search for <em>SendSMS Subscribe<\/em> \/ <em>SendSMS Unsubscribe<\/em> in the block inserter (Widgets category). Title and GDPR URL are in the right-hand inspector.<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20attributes%20do%20the%20shortcodes%20accept%3F\"><h3>What attributes do the shortcodes accept?<\/h3><\/dt>\n<dd><p><strong><code>[sendsms_subscribe]<\/code><\/strong> \u2014 the subscribe form.<\/p>\n\n<ul>\n<li><code>title<\/code> (string, optional) \u2014 heading rendered above the form.<\/li>\n<li><code>gdpr_link<\/code> (URL, optional) \u2014 privacy-policy URL. When set, the GDPR consent label includes a \"privacy policy\" link pointing to it.<\/li>\n<\/ul>\n\n<p>Example:\n    [sendsms_subscribe title=\"Get SMS updates\" gdpr_link=\"https:\/\/www.sendsms.ro\/en\/gdpr\/\"]<\/p>\n\n<p><strong><code>[sendsms_unsubscribe]<\/code><\/strong> \u2014 the unsubscribe form.<\/p>\n\n<ul>\n<li><code>title<\/code> (string, optional) \u2014 heading rendered above the form.<\/li>\n<\/ul>\n\n<p>Example:\n    [sendsms_unsubscribe title=\"Leave the SMS list\"]<\/p>\n\n<p>Both shortcodes are safe to use multiple times on the same page; each form is independent.<\/p><\/dd>\n<dt id=\"which%20css%20classes%20do%20the%20subscribe%20%2F%20unsubscribe%20forms%20use%3F\"><h3>Which CSS classes do the subscribe \/ unsubscribe forms use?<\/h3><\/dt>\n<dd><p>The same class names are emitted whether the form is rendered via the widget, the shortcode, or the Gutenberg block \u2014 so a single stylesheet covers all three. Use these to style the output from your theme or a custom CSS plugin.<\/p>\n\n<ul>\n<li><code>.sendsms-dashboard-shortcode<\/code> \u2014 outermost wrapper when rendered via shortcode or block. Adds <code>-subscribe<\/code> or <code>-unsubscribe<\/code> as a modifier (<code>.sendsms-dashboard-shortcode-subscribe<\/code>, <code>.sendsms-dashboard-shortcode-unsubscribe<\/code>). The classic widget uses the theme's <code>before_widget<\/code> instead.<\/li>\n<li><code>form.sendsms-dashboard-subscribe<\/code>, <code>form.sendsms-dashboard-unsubscribe<\/code> \u2014 the form element itself.<\/li>\n<li><code>.sendsms-dashboard-field<\/code> \u2014 wraps every input row (<code>&lt;p&gt;<\/code> element). Modifier <code>.sendsms-dashboard-gdpr<\/code> on the GDPR consent row of the subscribe form.<\/li>\n<li><code>.sendsms-dashboard-verify<\/code> \u2014 the hidden block containing the verification code input and \"Verify\" button. Revealed by JavaScript after the first AJAX response when phone verification is enabled. Use the <code>[hidden]<\/code> attribute selector if you want to override its initial state.<\/li>\n<li><code>.sendsms-dashboard-feedback<\/code> \u2014 the <code>[role=\"status\"]<\/code> paragraph used for status messages. Carries <code>data-state=\"ok\"<\/code> or <code>data-state=\"error\"<\/code> while a request is in flight.<\/li>\n<\/ul>\n\n<p>The bundled <code>assets\/css\/public.css<\/code> styles every one of these classes; override or replace it from your theme's stylesheet as needed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.6<\/h4>\n\n<ul>\n<li>The subscribe, unsubscribe, and verification forms now tell the visitor what actually went wrong. Every failure previously showed the same \"Something went wrong. Please try again.\" message, whether the phone number was malformed, the privacy-policy box was unticked, the number was already subscribed, or the verification code had expired.<\/li>\n<\/ul>\n\n<h4>2.0.5<\/h4>\n\n<ul>\n<li>The block editor strings now use the <code>sendsms-subscribers-2fa<\/code> text domain \u2014 they still carried the pre-2.0.2 <code>sendsms-dashboard<\/code> domain \u2014 and the edit scripts are registered with <code>wp_set_script_translations()<\/code>, so those strings can actually be translated.<\/li>\n<\/ul>\n\n<h4>2.0.4<\/h4>\n\n<p>Verified against WordPress 7.1 on PHP 7.4 and 8.3.<\/p>\n\n<ul>\n<li>The subscribe and unsubscribe blocks now declare the plugin stylesheet as their block style, so the form is styled inside the editor canvas as well as on the front end. Previously the CSS was only enqueued for the front end, and the editor preview rendered as unstyled browser defaults.<\/li>\n<li>No other changes: the plugin registers no image handling and does not use jQuery UI, so the WordPress 7.1 media and jQuery UI updates do not affect it.<\/li>\n<\/ul>\n\n<h4>2.0.3<\/h4>\n\n<p>Documentation corrections for WordPress.org. The supported-versions statement in the description now reads WordPress 6.0 through 7.0 consistently with the header and FAQ, the installation step references the correct <code>sendsms-subscribers-2fa<\/code> folder, and the example URL in the shortcode documentation was replaced with a valid one. No functional or data changes.<\/p>\n\n<h4>2.0.2<\/h4>\n\n<p>Renamed the plugin to <strong>SendSMS Subscribers &amp; 2FA<\/strong> (text domain <code>sendsms-subscribers-2fa<\/code>) so it can be published in the WordPress.org directory. No functional or data changes \u2014 your settings, subscribers, SMS history, shortcodes, blocks, widgets, and CSS classes are all unchanged.<\/p>\n\n<h4>2.0.1<\/h4>\n\n<p>Naming\/compliance pass for WordPress.org. All internal identifiers now carry a distinct, collision-safe <code>rosendsms_dash_<\/code> prefix so the plugin coexists cleanly with other plugins (including <em>SendSMS for WooCommerce<\/em>). Your settings, SMS history, and subscriber list are migrated automatically on update.<\/p>\n\n<ul>\n<li>Prefixed every plugin-defined name: constants (<code>ROSENDSMS_DASH_*<\/code>), the PSR-4 namespace (<code>Rosendsms\\Dashboard\\\u2026<\/code>), option\/transient keys, custom table names, AJAX actions, script handles, the localized JS objects, and nonces.<\/li>\n<li>Added a one-shot, idempotent migration that renames the pre-2.0.1 <code>sendsms_dashboard_*<\/code> options and custom tables to the new <code>rosendsms_dash_*<\/code> names on activation\/upgrade \u2014 no data loss.<\/li>\n<li>Front-end shortcodes (<code>[sendsms_subscribe]<\/code>, <code>[sendsms_unsubscribe]<\/code>), block names, widget IDs, and the documented CSS class names are unchanged, so existing pages, widgets, and custom styling keep working.<\/li>\n<li>Added an <strong>External services<\/strong> section to the readme disclosing the sendsms.ro gateway, the data sent, and links to its terms \/ privacy \/ ISO 27001 certification.<\/li>\n<li>Replaced the admin-menu dashicon with the sendSMS brand icon.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<p>Full architectural rewrite. The plugin now follows modern WordPress conventions while preserving every existing setting, the SMS history database table, and the subscriber list \u2014 upgrading from 1.x is transparent.<\/p>\n\n<ul>\n<li>Code reorganised into a PSR-4 namespace tree (<code>SendSMS\\Dashboard\\\u2026<\/code>) with one class per responsibility (API client, settings reader, subscribe \/ unsubscribe \/ 2FA flows, admin pages, AJAX handlers).<\/li>\n<li>2FA rebuilt on the <code>authenticate<\/code> filter \u2014 no fake login + session destruction, no fork of <code>wp-login.php<\/code>. Cleaner, fewer surprises with other plugins.<\/li>\n<li>Settings page redesigned with three tabs: <strong>General<\/strong>, <strong>User<\/strong>, <strong>Subscription<\/strong>. Each tab merges into the existing option instead of overwriting it (fixes a v1.x bug where saving one tab wiped the others).<\/li>\n<li>Admin scripts moved to <code>assets\/js\/<\/code>. jBox dropped; native WordPress admin patterns used instead.<\/li>\n<li>Mass-send campaigns now build the CSV in memory (no <code>batches\/<\/code> filesystem write, matching the security baseline of the WooCommerce sibling plugin).<\/li>\n<li>Minimum PHP raised to 7.4; verified on PHP 7.4 and PHP 8.3 against WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>WordPress 7.0 compatibility.<\/li>\n<li>PHP 8.3 compatibility: removed deprecated FILTER_SANITIZE_STRING usage in the 2FA login handlers.<\/li>\n<li>Synced version numbers across the plugin header, version constant, and stable tag.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Manage SMS subscribers, run campaigns, and protect wp-admin with SMS 2FA \u2014 all through the sendsms.ro gateway.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/320996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=320996"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sendsms"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=320996"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=320996"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=320996"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=320996"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=320996"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=320996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}