$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__ ) );
|