From e3bfd7b6f2158397c19e03c8bb0ff3a0ad86bd3e Mon Sep 17 00:00:00 2001 From: Javier Casares Date: Mon, 17 Aug 2026 16:05:38 +0000 Subject: [PATCH] v1.3.0 --- admin/class-robotstxt-manager-admin.php | 2 + admin/class-robotstxt-manager-settings.php | 2 +- admin/views/page-catalog.php | 54 ++++++++++++------ changelog.txt | 19 ++++++ .../class-robotstxt-manager-core-client.php | 28 +++++++-- languages/robotstxt-manager-ca.mo | Bin 11506 -> 12607 bytes languages/robotstxt-manager-ca.po | 6 ++ languages/robotstxt-manager-es_ES.mo | Bin 11453 -> 12518 bytes languages/robotstxt-manager-es_ES.po | 6 ++ languages/robotstxt-manager.pot | 6 ++ readme.txt | 10 +++- robotstxt-manager.php | 4 +- 12 files changed, 108 insertions(+), 29 deletions(-) diff --git a/admin/class-robotstxt-manager-admin.php b/admin/class-robotstxt-manager-admin.php index 400631c..1921cc6 100644 --- a/admin/class-robotstxt-manager-admin.php +++ b/admin/class-robotstxt-manager-admin.php @@ -72,6 +72,8 @@ class Robotstxt_Manager_Admin { // Admin notices for subscriptions needing attention. $manager_notices = $this->build_subscription_notices( $catalog, $subscriptions ); $manager_subscriptions = $subscriptions; + $manager_has_api_key = $client->has_api_key(); + $manager_store_url = $client->get_store_url(); require ROBOTSTXT_MANAGER_DIR . 'admin/views/page-catalog.php'; } diff --git a/admin/class-robotstxt-manager-settings.php b/admin/class-robotstxt-manager-settings.php index b8d5d76..cddc28f 100644 --- a/admin/class-robotstxt-manager-settings.php +++ b/admin/class-robotstxt-manager-settings.php @@ -263,7 +263,7 @@ class Robotstxt_Manager_Settings { } echo '

'; } else { - echo '

' . esc_html__( 'Account-level API key issued by the ROBOTSTXT store. Required to authenticate catalog and subscription requests. The value is encrypted before storage.', 'robotstxt-manager' ) . '

'; + echo '

' . esc_html__( 'Account-level API key from the ROBOTSTXT store (create your free account there to get one). Optional — the free catalog works without it — but required to link your subscriptions, install premium plugins, and receive their updates. Encrypted before storage.', 'robotstxt-manager' ) . '

'; } // Action buttons. diff --git a/admin/views/page-catalog.php b/admin/views/page-catalog.php index 0cc556d..522a2a5 100644 --- a/admin/views/page-catalog.php +++ b/admin/views/page-catalog.php @@ -25,6 +25,8 @@ if ( ! defined( 'ABSPATH' ) ) { * @var array $local * @var array> $manager_subscriptions * @var list $manager_notices + * @var bool $manager_has_api_key + * @var string $manager_store_url */ $client_configured = Robotstxt_Manager_Core_Client::from_options()->is_configured(); @@ -77,6 +79,22 @@ $compat_warnings = 0; + +
+

+ ROBOTSTXT store to get your personal API key. The key links your subscriptions to this site and unlocks premium plugins and updates.', 'robotstxt-manager' ), + esc_url( $manager_store_url . '/wp-login.php?action=register' ) + ) + ); + ?> +

+
+ +

@@ -149,6 +167,14 @@ $compat_warnings = 0; $website_url = '' !== $page_url ? $page_url : $homepage; $has_detail = ( '' !== $website_url || '' !== $desc ); + // Subscription state: premium plugins are only usable + // (install/update) with an active or in-grace subscription. + $is_premium = ( $cost > 0.0 || 'premium' === $kind ); + $sub_row = $manager_subscriptions[ $slug ] ?? null; + $raw_status = is_array( $sub_row ) ? ( $sub_row['status'] ?? '' ) : ''; + $sub_status = is_string( $raw_status ) ? $raw_status : ''; + $subscribed = in_array( $sub_status, array( 'active', 'payment_failed' ), true ); + $raw_reqs = $entry['requires_plugins'] ?? ''; $req_slugs = array(); if ( is_string( $raw_reqs ) && '' !== trim( $raw_reqs ) ) { @@ -220,7 +246,7 @@ $compat_warnings = 0; 0.0 || 'premium' === $kind ) { + if ( $is_premium ) { echo esc_html( sprintf( /* translators: %s: formatted price number. */ @@ -230,13 +256,10 @@ $compat_warnings = 0; ); // Subscription pill for premium plugins. - $sub_row = $manager_subscriptions[ $slug ] ?? null; $sub_text = ''; if ( is_array( $sub_row ) ) { - $raw_sub_status = $sub_row['status'] ?? ''; $raw_sub_expiry = $sub_row['expires_at'] ?? ''; - $sub_status = is_string( $raw_sub_status ) ? $raw_sub_status : ''; $sub_expiry = is_string( $raw_sub_expiry ) ? $raw_sub_expiry : ''; if ( 'active' === $sub_status && '' !== $sub_expiry ) { @@ -261,11 +284,8 @@ $compat_warnings = 0; } if ( '' !== $sub_text ) { - $raw_pill_status = is_array( $sub_row ) ? ( $sub_row['status'] ?? '' ) : ''; - $pill_status = is_string( $raw_pill_status ) ? $raw_pill_status : ''; - echo '
' . esc_html( $sub_text ) . ''; } } else { @@ -274,18 +294,16 @@ $compat_warnings = 0; ?> - - - + + + + + - 0.0 && '' !== $page_url ) : ?> - - - 0.0 && '' !== $page_url ) ? 'button-secondary' : 'button-primary'; - ?> - + — + + diff --git a/changelog.txt b/changelog.txt index c032561..0fcf438 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,24 @@ == Changelog == += 1.3.0 = + +_Release date: 2026-08-17_ + +**Highlights** + +* The catalog now works **without an API key**: only the Store URL is required. The free catalog, prices, and product pages are public on Core, so a fresh install shows the store immediately. An info notice invites visitors to create their free account at the store to get a personal API key (linking subscriptions and unlocking premium plugins and updates). + +**Changed** + +* Action buttons follow subscription state: premium plugins without an active subscription show **Buy** only (Install/Update hidden — the download would be rejected); with an active or in-grace subscription (and for free plugins) they show **Install / Activate / Update** as usual. Previously premium rows always offered Install alongside Buy. +* The API-key setting description clarifies the key is optional for browsing, required for subscriptions/premium. +* Plugin version 1.2.1 → 1.3.0. No database schema changes (no custom tables). + +**Compatibility** + +* WordPress: 4.4 - 7.1 (scan-verified: wp-compat clean from 4.4) +* PHP: 8.0 - 8.5 (scan-verified: PHPCompatibility + manual feature audit) + = 1.2.1 = _Release date: 2026-08-17_ diff --git a/includes/class-robotstxt-manager-core-client.php b/includes/class-robotstxt-manager-core-client.php index adb6e93..672c66f 100644 --- a/includes/class-robotstxt-manager-core-client.php +++ b/includes/class-robotstxt-manager-core-client.php @@ -91,12 +91,25 @@ class Robotstxt_Manager_Core_Client { } /** - * Returns whether the client has both a URL and a key configured. + * Returns whether the client can talk to the store. + * + * Only the Store URL is required: the catalog (free plugins, prices, + * product pages) is public on Core. The API key is optional — it is + * needed for subscription data and premium downloads, not for listing. * * @return bool */ public function is_configured(): bool { - return '' !== $this->store_url && '' !== $this->api_key; + return '' !== $this->store_url; + } + + /** + * Returns whether an API key is configured. + * + * @return bool + */ + public function has_api_key(): bool { + return '' !== $this->api_key; } /** @@ -269,13 +282,16 @@ class Robotstxt_Manager_Core_Client { private function get( string $endpoint ) { $url = $this->store_url . '/wp-json/' . self::REST_NAMESPACE . $endpoint; + $headers = array( 'Accept' => 'application/json' ); + + if ( '' !== $this->api_key ) { + $headers['Authorization'] = 'Bearer ' . $this->api_key; + } + return wp_remote_get( $url, array( - 'headers' => array( - 'Authorization' => 'Bearer ' . $this->api_key, - 'Accept' => 'application/json', - ), + 'headers' => $headers, 'timeout' => self::TIMEOUT, ) ); diff --git a/languages/robotstxt-manager-ca.mo b/languages/robotstxt-manager-ca.mo index 6d9335fa6ab43bbe2cf0f3d8b4d2a8fbbb0477ac..e313bbfbb6f56a2c898f59fea1d3c40c05cdcfb3 100644 GIT binary patch delta 3078 zcmbW1Yitx%6vuDNqw*+yXhopFZE2N4*&@_}&=y)KSOJUBD#$};x6^j$bf(PAwiF3# zh^Su>6CivuHO2=dglJPVYLr-`Au);{43a1sKuwVt1V2D9#NV0SA|dd_n?3WpcXsZ% z=lsu^xxD_fXyQ!n@B@mm8Oz7U4pS-t{~5uBaWzA!Bk&r`gzwy=R0Q_JG4MPb4KKkR z@H&+J+eRtH7IhVtKzV2)m;pzmDOCp#%A+grGLk>eLH4Q(a5B6CqcCTzQpBVJC^2n= z_*6ULc=!s;g}qP$=}YlbSjPGUlmM!Wb0Nc9Di3Gh5D zgg4+cSU_5Runx|E*WhkgL=;kr!;qNNhfo6i3W}0v;RA3GN=ef>U6h*&MY&?=!!np4 zX!Rx&iMS6+#>Z3Zuc4IWGz=X>aWDwQ@f9csW#=WOFM*R-mqV%jYAF8KrT%Y&YgqfR z9)6jJ{w++h?^mi8c0qSGPuDFQD8hezQ{pE@DtXDNJkWDA>BF9gObr(P!8^g`{8l8 z2R6~UqS!e&A6|q7uy~463-G%f_OsqaG!pRqgicNtL3wZ)Y=v!5GB^n(upd(V6-tJe zAu6goHc22ep_HZq%E61_Y}f-!;bAx?O{r5*n(!P>Xb+XR&g4-hS?InO)p?Rp;X$;WX-dnyf%{{ue2(F_*QeE9JCQit#?4lbT^bh-hjNR>fIDS zh8?WGfwi!bdb|u1a0Tb9j9JO9UJKW;-U*MuQ*bsC?~W)nm-VqSz6J0C90O-l;L)%W z;#)0;8PJCk!1GWPeHAW%{ZPY8P!!L3m>|SKITOwa8$u)>hKVDomvlYPhmwnIoUImP zBI!n~0(%^jLA>Eu#I+ieL#bjo(o+;jGO3YJt5UONL$}~cY)xwYSc+0286q*23f~sV zZV4uR@C>#B6Nzb=a6HX*Ikq&p46jncCaeLANc}f35&7ghAe}FR(uAXm>l4^otOk1o zqv69L%_W~-d3&TR3o%hM6O#^q3X}ejW|UE%M0k}lZ^m+^{?a^DAZ#jdbF5}oiD~Rf zY-q^)osH#S@@mPDMqQ6JVp3baM`|7>eIl>#&?siI3FG?~j=qx_?dgdY&+X7bo2l0{ z)HXD(ZCux={lN81Jw4``Mquh5H}2^c&os3Wi@9+pkf-@SaCNI0XxA}IBD$e7uw2Km z_1PEphu*>sF(WW+w^et$Uc0Zmt)R_~2igk4r=mbJT2+ zbR;RG)r_c`WEQh*v&*z~-`vrEq$QTzEmb4TR#zIj%`;o73XA@K!(lC^=b2t%^=*u48To^66I32;u`r15K>jjRvM;d9!RIEO{&}`2yKNr3ZR#vsK)t%5!t8uUp~{ z&n6s0`=;ZYY_N?|@i_3l9ysJ{hZ_3+K(A*R;W=HF6N}r1r)|?Gm@ckEEg@&#Y>Cf5 zkcWoO8xp{xB2g+Xn~hiyH*71|Zp5sS?4&XF{g^+guO`1KJ*@iO(l!2X&F`#mSo&Ke zltOGEGegI0BOaE2s2L)9W$JE9hP$bt4Q*_Vn|`2eIzU@!??-KyTU(5MSu^wUt#GFw Q>UXOUqC?+-DVxUq3p;EqF8}}l delta 2038 zcmYk+Sx6O89LMp0noC+%wrR`N)G}MtY_rw0#a1n|(vm2NHY#W#D1=L^5Jg4%gGDGr z54PRxL0ZLni5AEQqlM~HVhd3bMYMf?b0@e5|MQudJ2U5h{^uNTmVYVrzKCsm)M#Zy zZ{k;onHQghaiBFvnAPGF?0}V#X6bkoqp=aA@DWzvQ`Gw&gf}x z7K52MQmN)}vW6R5kZ0@_D$|eH1tS@@M$#MGVhZkQ!^iO|*BAL3kJ`$Pf#)`3SFS5i zi5_yV&tU@BH!vPwV3JDpgOg)ji7QB(04oe!fv;75J=IH0 zYeFUP4mBm;P#yloOw9I}4aU{T;OrPuZ99*nu>lX@FH|M=Q65gsdxjIea0@k(X4hBP zN@d>ROYS$3wi2u(D<#r^4A$RG;$F=3QsQiW9mb8-gUqI26)HnNs??v5Kl{lc0{b)3N+2D{)pBtRuEIpDMwPq~ z^?nP|jq{Ecbts|lXdQU9c+v@#Uh_AEm_W2677@&mO(WElgxYvw9H9kBwVf8?DuxD~ z&vefx2i=>&`JBMD*QN&jpi`BYiaArjl5qBY9IABFiHU?ptu~)f#Z>nHjq2MxVm86R zt(2hB&LY>2P@~{Z8>{)B#pzrkhtM>rbZS~$9f(oHBtqLr z1sux={u4X@sxwfFHnROBOTSTXT store to get your personal API key. The key links your subscriptions to this site and unlocks premium plugins and updates." +msgstr "Crea el teu compte gratuït a la botiga de ROBOTSTXT per obtenir la teva clau API personal. La clau vincula les teves subscripcions a aquest lloc i desbloqueja els plugins premium i les seves actualitzacions." + +msgid "Account-level API key from the ROBOTSTXT store (create your free account there to get one). Optional — the free catalog works without it — but required to link your subscriptions, install premium plugins, and receive their updates. Encrypted before storage." +msgstr "Clau API a nivell de compte de la botiga de ROBOTSTXT (crea allà el teu compte gratuït per obtenir-la). Opcional: el catàleg de plugins gratuïts funciona sense ella, però és necessària per vincular les teves subscripcions, instal·lar plugins premium i rebre les actualitzacions. Es xifra abans de desar-se." diff --git a/languages/robotstxt-manager-es_ES.mo b/languages/robotstxt-manager-es_ES.mo index 9d6dc7125ec56e30eb3f7a8aec375471c841c7be..40903e87319abf49532a328027cafb5f47a968d1 100644 GIT binary patch delta 3074 zcmbW2Yit!o6vu}`L7-qk5P1)!Amwq3f`CBL7OEm32t`2@+wZg@x{F~LAIeh?BM8Uqmsq-qS25Ara?-`Twdg7u4&p8d_t&YU^t ze`asLT6xLJo$cRkm!hr4hG8XLmCC`ti+Rwl^-yXbybk-oPwrDH1^2_=@FMI5ufR?4 zCY1dfdMd>hbq!WPSu_NUhs9l#s)f5{=>oiT=fwrcUiB*+4zI#A>{p@`F{uzrOdB9R z)n+&dz6JZk51|B-FYpMgWc)3Z0Iov~N0Y@lI1l!dP|N!&#h;qSV;Zc5YvCqH4C*qJ z$gjc&VBhB-X ztB>eN#Ca$ge_a@V52YkO!q_ns2klTCUxji|>A*z#3OJPUR4BDy0>%G|!uuw;lyLy( z!(#){zkyEagG$xF^-wZD4CO+eg*#ytx^+e36Ht^m#i`X$WRsfLKnZXW6b0*`1h5{8 zQaLyhZilnrK1l4UeK7h<2Dg|H1qPwxE)FV(M;IR_9hq+<-N|qZl#C8SIrunyAD)EU zVGB1`6uJp#!{QN1KsB%ezXtASeh1M=fVDZDbQVGW)N&qcVJnmczd*^X9g5>C5FhFW zL>x7ER1(N!DDP*%X|NVffScerxEEf7C!l2h9Wrq}RPG#|>2$6_$z%fh%N;ldMY5An z6#5g&UFcn&1T+Ai?n1rc1$jRvQR?*AWZeabsOoo!II8=@$-$$clxPN|nmM(qFcB2^ z4!q2QFX2qMhw%5npP`gub49|f5C`gAC<=WJ<#*#CBo=k5Fn<&FWL(6>*#=9X?0XNE z$oKyR9m)7eJb^T@2jeqP9G`=H(&`e#m--8eGNaH}6sd-i;j>WoHA0crgT3J!a4p;c z=ffLNKEHVrm0HO8>JS}#s^UpXy#y!2y>KfmN8+g|r56Vh3QbD599xW~r2ebuhw5=%MyV0j1^jr*QnQfesiGL+hLOzh1w3|RcX4u$*qfQ-_(mY$99{O(}E}+WPCgJ z8BEl+8{o&$S>LqSQH#zxQ6qB`wdL01B4g}U!f7(LucK@|F$XDK>t_76Y>4NyX^?az zDXY<>RCSWYB*(NGN9U*X`mIZD?ti6f#o6lFmTvM*Lsi+BpiGCBPvTW&YtoM8HkT2B zQ&r}AUe>tA*Di-O7~eO3*_?YMon2|o>5wf}HEaApRC`rdFPX2KO8s8xbIK9WR5t_o$P+E69-_Ub4D0S8udq>CiTAy`>r42`{d-M&qOVbQtMO zWZclwjlLB|Hl3{HTiQ#9lAvS7<<7+Ao~etU-UP-uaj>V2O zQIoZ&O`u&W7g)Ys@ZV~?naHtx0wB96z5ue<+`a+4>u}$ZY@5{IPE&bya6!Y!a_o&( zvM;5V8J)2k2;Oo-v$J@3X@1SHnxeSeo#koV|6A$Kb&U&tw|McPPR`=KO2s?spVA90 zopEHkpu)dJ&=#6ea_Vk-x(%&^wBxOdjHMlq>L=gC?OV{+sUT{e6?#Gb;}L`U{sVHP BE#LqE delta 2038 zcmY+^Sx8h-9LMp$lc~*=wpp5{W?I=|wr`fLR%TYVnQb(ILJ%!RR0PvY*+VNKMbJYO zRFslU2?<8g0@+>=Mi$jTA>l(sAX3!#cjpFnnE(CUbMKwA{Lel2^M;01f%iQltBkUS zNG5)H%mUclnFFOM+N>JiU^lFcG0Vm(^x-}9;&a@KZ&Cj*>0-uTtO>L51NK8N51+(L zjMAeGobVsJhyC#h`td7v!XkRnSc;K0tOWa_AA8~+Q`xvN3A?A{M-)gO?@wF zpvT?%B}}D$3ls4@rYlu#oD9UI?q)&E!=d;C_hSmfrY}2>8u>NU0Pi3vv}R1e5IReU z%2*=lQN~iS0<(~=>>)i_vP)qR&orX~jgisB)qB`=D7NvY3CSf)zLj|Y~ zirxEuET+C0=i_ZGLoex>iQ9UUf6e?l7uI1Dp1=w5tUW1ygv!LTK4vqp9o2CzdDQ^t zVmcO~2Cxm4sokhlSK<`BfLf9eY65Mj4D?7K|5bF9!qr<`xX!}pMg{rJ!F{M1)uKAS zgQxK^9>#K}uMGXfT>OI?P%i1Zf$LENi|5Uj{V@$QaTDeT+#9v18QnxRcpFo&5t+2L zpa!6ey6?mB7>~oS5QpF{)J)GJ*|s{IfQ_hudq|6x{0u5XflC~fl830Z|AZRISA0!o zzGF!D2e>Z{)6;YHsJHko>fLyU>bM>GSsd$1mTfeuUf{YJzfeDhlePbMWiVPU1W~D9 zo*CAUYG4a$K$S=m>ye+`=MaP6&`CAYro{~pzvUBAOR)nrf#c}ITBIB2YpH%Z z5z&O&2_go(qcAJeLrV(8TjdmCu@;ltnX%wMZX$HI!&c4?RT0$tj(+O6_Da$#|A!dfF&XMffQeq*&#BCKprk!^} z%cerYoiau1U&!eaB99nD=xtSrB=j-S_L)UYBD5S`2{wZ*BeWcBd8f>E6)T7}1Yct3 zQ#}&(@^&mmR2FGgY|a0Q_O(7bdMUM@DxHaygg&Qf1Y5_(5n5k;AO00~m8~WcgDuh9 ZJ;4pWP(&~zc5V0I<|e3cyxsr+ diff --git a/languages/robotstxt-manager-es_ES.po b/languages/robotstxt-manager-es_ES.po index 8083a59..fb239cd 100644 --- a/languages/robotstxt-manager-es_ES.po +++ b/languages/robotstxt-manager-es_ES.po @@ -293,3 +293,9 @@ msgid "The subscription for %1$s expires in %2$d day." msgid_plural "The subscription for %1$s expires in %2$d days." msgstr[0] "La suscripción de %1$s caduca en %2$d día." msgstr[1] "La suscripción de %1$s caduca en %2$d días." + +msgid "Create your free account at the ROBOTSTXT store to get your personal API key. The key links your subscriptions to this site and unlocks premium plugins and updates." +msgstr "Crea tu cuenta gratuita en la tienda de ROBOTSTXT para obtener tu clave API personal. La clave vincula tus suscripciones a este sitio y desbloquea los plugins premium y sus actualizaciones." + +msgid "Account-level API key from the ROBOTSTXT store (create your free account there to get one). Optional — the free catalog works without it — but required to link your subscriptions, install premium plugins, and receive their updates. Encrypted before storage." +msgstr "Clave API a nivel de cuenta de la tienda de ROBOTSTXT (crea allí tu cuenta gratuita para obtenerla). Opcional: el catálogo de plugins gratis funciona sin ella, pero es necesaria para vincular tus suscripciones, instalar plugins premium y recibir sus actualizaciones. Se cifra antes de guardarse." diff --git a/languages/robotstxt-manager.pot b/languages/robotstxt-manager.pot index 38a56d3..4d2d0c3 100644 --- a/languages/robotstxt-manager.pot +++ b/languages/robotstxt-manager.pot @@ -25,3 +25,9 @@ msgstr "" msgid "Expired" msgstr "" + +msgid "Create your free account at the ROBOTSTXT store to get your personal API key. The key links your subscriptions to this site and unlocks premium plugins and updates." +msgstr "" + +msgid "Account-level API key from the ROBOTSTXT store (create your free account there to get one). Optional — the free catalog works without it — but required to link your subscriptions, install premium plugins, and receive their updates. Encrypted before storage." +msgstr "" diff --git a/readme.txt b/readme.txt index 7b8c566..e19ed1b 100644 --- a/readme.txt +++ b/readme.txt @@ -3,9 +3,9 @@ Contributors: javiercasares, robotstxt Tags: dashboard, catalog, updates, subscriptions, management Requires at least: 4.4 Tested up to: 7.1 -Stable tag: 1.2.1 +Stable tag: 1.3.0 Requires PHP: 8.0 -Version: 1.2.1 +Version: 1.3.0 License: GPL-3.0-or-later License URI: https://www.gnu.org/licenses/gpl-3.0.txt @@ -92,6 +92,12 @@ Encrypted at rest using AES-256-CBC with a key derived from your site's WordPres == Changelog == += 1.3.0 = + +_Release date: 2026-08-17_ + +* Catalog works without an API key (only the Store URL is needed); free plugins are listed and installable, and an info notice links to the store to register and get a personal key. Premium plugins show Buy only until subscribed; with an active subscription they show Install/Update. + = 1.2.1 = _Release date: 2026-08-17_ diff --git a/robotstxt-manager.php b/robotstxt-manager.php index c6d5428..ea76084 100644 --- a/robotstxt-manager.php +++ b/robotstxt-manager.php @@ -3,7 +3,7 @@ * Plugin Name: Manager (by ROBOTSTXT) * Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-manager * Description: Client-side dashboard for the ROBOTSTXT plugin ecosystem. Lists the catalog from a remote Plugins Core install, resolves local install/update state, and installs, activates, and updates plugins directly from the store. - * Version: 1.2.1 + * Version: 1.3.0 * Requires at least: 4.4 * Requires PHP: 8.0 * Author: ROBOTSTXT @@ -21,7 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) { } /** Plugin version. */ -define( 'ROBOTSTXT_MANAGER_VERSION', '1.2.1' ); +define( 'ROBOTSTXT_MANAGER_VERSION', '1.3.0' ); /** Absolute path to the plugin directory, with trailing slash. */ define( 'ROBOTSTXT_MANAGER_DIR', plugin_dir_path( __FILE__ ) );