11 Commits

Author SHA1 Message Date
Cooper Dalrymple 2e7b565407 Prevent captcha in form editor 2026-06-08 15:45:24 -05:00
Cooper Dalrymple ac7760db55 Update version to 1.1.2 2026-06-08 15:37:27 -05:00
Cooper Dalrymple 26d318160b Add default widget styling 2026-06-08 15:34:53 -05:00
Cooper Dalrymple d72ad2c866 Fix captcha validation on multi-page forms 2026-06-08 15:30:14 -05:00
Cooper Dalrymple defa5fe39d Update version to 1.1.1 2026-06-08 14:26:29 -05:00
Cooper Dalrymple b8e0322245 Fix settings page loading 2026-06-08 14:25:49 -05:00
ogrecooper 962bd4bcc5 Merge pull request 'Added Gravity Forms Addon' (#2) from gravityforms into main
Reviewed-on: #2
2026-06-05 22:44:41 +00:00
Cooper Dalrymple 15a89a140f Added Gravity Forms Addon 2026-06-05 17:44:26 -05:00
Cooper Dalrymple 7da66983a9 Push to version 1.0.1 2026-06-05 15:38:00 -05:00
Cooper Dalrymple ef48fe9c21 Setup license requirement 2026-06-05 15:37:47 -05:00
Cooper Dalrymple 891d0ab3fc Switch to updatepulse 2026-06-05 15:35:20 -05:00
14 changed files with 478 additions and 130 deletions
+12
View File
@@ -0,0 +1,12 @@
/**
* @package ogre-captcha
* @author cleverogre
* @copyright 2026 CleverOgre
* @license GLP-3.0-or-later
* @version 1.1.2
* @since 1.1.2
*/
:root :where(cap-widget) {
flex-basis: 100%;
}
+29 -18
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://getcomposer.org/schema.json",
"name": "cleverogre/ogre-captcha",
"version": "1.0.0",
"version": "1.1.2",
"title": "Ogre CAPTCHA",
"description": "Protect your site with CAPTCHA",
"author": "CleverOgre",
@@ -15,21 +15,21 @@
],
"homepage": "https://cleverogre.com",
"repositories": {
"cleverogre/plugin-update-checker": {
"type": "vcs",
"url": "git@git.cleverogre.com:cleverogre/plugin-update-checker.git"
},
"cleverogre/updatepulse-updater": {
"type": "vcs",
"url": "git@git.cleverogre.com:cleverogre/updatepulse-updater.git"
},
"cleverogre/plugin-framework": {
"type": "vcs",
"url": "git@git.cleverogre.com:cleverogre/plugin-framework.git"
},
"wp-package-updater": {
"type": "package",
"package": {
"name": "froger-me/wp-package-updater",
"version": "1.4.0",
"source": {
"url": "https://github.com/froger-me/wp-package-updater.git",
"type": "git",
"reference": "master"
}
}
"advancedcustomfields": {
"type": "composer",
"url": "https://connect.advancedcustomfields.com"
}
},
"require": {
@@ -38,17 +38,28 @@
"replace": {
"wpengine/advanced-custom-fields-pro": "*"
},
"scripts": {
"post-update-cmd": [
"php vendor/magicoli/wp-package-updater-lib/install.php"
]
},
"config": {
"allow-plugins": {
"composer/installers": true
},
"optimize-autoloader": true
},
"extra": {
"installer-paths": {
"acf/": [
"wpengine/advanced-custom-fields-pro"
],
"lib/{$name}/": [
"cleverogre/plugin-update-checker",
"cleverogre/updatepulse-updater"
]
}
},
"autoload": {
"files": [
"ogre-captcha.php"
]
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
Generated
+195 -78
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "978b7fe126b61796750d67c4c7231417",
"content-hash": "49f5e6f919f33ce6a3edc2992620a64a",
"packages": [
{
"name": "cleverogre/plugin-framework",
@@ -12,13 +12,12 @@
"source": {
"type": "git",
"url": "git@git.cleverogre.com:cleverogre/plugin-framework.git",
"reference": "6ba78008013665151d0ffecb94d732baa522caec"
"reference": "74700a249ae3b5e559c071e2467764da4645a26f"
},
"require": {
"froger-me/wp-package-updater": "^1.4.0",
"magicoli/wp-package-updater-lib": "^0.1.9",
"wpengine/advanced-custom-fields-pro": "^6.4.2",
"yahnis-elsts/plugin-update-checker": "^5.0"
"cleverogre/plugin-update-checker": "dev-main",
"cleverogre/updatepulse-updater": "dev-main",
"wpengine/advanced-custom-fields-pro": "^6.4.2"
},
"default-branch": true,
"type": "library",
@@ -26,6 +25,10 @@
"installer-paths": {
"acf/": [
"wpengine/advanced-custom-fields-pro"
],
"lib/{$name}/": [
"cleverogre/plugin-update-checker",
"cleverogre/updatepulse-updater"
]
}
},
@@ -38,11 +41,6 @@
"inc/abstract-plugin.php"
]
},
"scripts": {
"post-update-cmd": [
"php vendor/magicoli/wp-package-updater-lib/install.php"
]
},
"license": [
"GPL-3.0+"
],
@@ -53,77 +51,26 @@
"Plugin",
"WordPress"
],
"time": "2026-04-28T13:19:19+00:00"
"time": "2026-06-05T20:21:23+00:00"
},
{
"name": "froger-me/wp-package-updater",
"version": "1.4.0",
"name": "cleverogre/plugin-update-checker",
"version": "dev-main",
"source": {
"type": "git",
"url": "https://github.com/froger-me/wp-package-updater.git",
"reference": "master"
},
"type": "library"
},
{
"name": "magicoli/wp-package-updater-lib",
"version": "v0.1.10",
"source": {
"type": "git",
"url": "https://github.com/magicoli/wp-package-updater-lib.git",
"reference": "e822132741c08d054fb97f249b1143c220f30e6f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/magicoli/wp-package-updater-lib/zipball/e822132741c08d054fb97f249b1143c220f30e6f",
"reference": "e822132741c08d054fb97f249b1143c220f30e6f",
"shasum": ""
},
"require-dev": {
"froger-me/wp-plugin-update-server": "*"
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Magiiic"
}
],
"description": "Composer package for wp-package-updater library.",
"support": {
"issues": "https://github.com/magicoli/wp-package-updater-lib/issues",
"source": "https://github.com/magicoli/wp-package-updater-lib/tree/v0.1.10"
},
"time": "2023-06-09T12:42:28+00:00"
},
{
"name": "yahnis-elsts/plugin-update-checker",
"version": "v5.7",
"source": {
"type": "git",
"url": "https://github.com/YahnisElsts/plugin-update-checker.git",
"reference": "275a96a2a18d03c34c87f35cb68673c8c49ac3b1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/YahnisElsts/plugin-update-checker/zipball/275a96a2a18d03c34c87f35cb68673c8c49ac3b1",
"reference": "275a96a2a18d03c34c87f35cb68673c8c49ac3b1",
"shasum": ""
"url": "git@git.cleverogre.com:cleverogre/plugin-update-checker.git",
"reference": "b05c3dd4cf01f45544358671018dd5b5851cd079"
},
"require": {
"composer/installers": "~1.0",
"ext-json": "*",
"php": ">=5.6.20"
},
"type": "library",
"autoload": {
"files": [
"load-v5p7.php"
]
"default-branch": true,
"type": "wordpress-plugin",
"extra": {
"installer-name": "plugin-update-checker"
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
@@ -143,20 +90,190 @@
"theme updates",
"wordpress"
],
"support": {
"issues": "https://github.com/YahnisElsts/plugin-update-checker/issues",
"source": "https://github.com/YahnisElsts/plugin-update-checker/tree/v5.7"
"time": "2026-06-05T22:05:11+00:00"
},
{
"name": "cleverogre/updatepulse-updater",
"version": "dev-main",
"source": {
"type": "git",
"url": "git@git.cleverogre.com:cleverogre/updatepulse-updater.git",
"reference": "0e57c729b09f426d26add0d7c872ce60d3c8cacf"
},
"time": "2026-05-26T12:48:45+00:00"
"require": {
"composer/installers": "~1.0"
},
"default-branch": true,
"type": "wordpress-plugin",
"extra": {
"installer-name": "updatepulse-updater"
},
"license": [
"GPL-3.0+"
],
"description": "Used to enable updates for plugins and themes distributed via UpdatePulse Server.",
"homepage": "https://github.com/Anyape/updatepulse-server-integration/tree/main/dummy-plugin/lib/updatepulse-updater",
"time": "2026-06-05T20:17:30+00:00"
},
{
"name": "composer/installers",
"version": "v1.12.0",
"source": {
"type": "git",
"url": "https://github.com/composer/installers.git",
"reference": "d20a64ed3c94748397ff5973488761b22f6d3f19"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19",
"reference": "d20a64ed3c94748397ff5973488761b22f6d3f19",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0 || ^2.0"
},
"replace": {
"roundcube/plugin-installer": "*",
"shama/baton": "*"
},
"require-dev": {
"composer/composer": "1.6.* || ^2.0",
"composer/semver": "^1 || ^3",
"phpstan/phpstan": "^0.12.55",
"phpstan/phpstan-phpunit": "^0.12.16",
"symfony/phpunit-bridge": "^4.2 || ^5",
"symfony/process": "^2.3"
},
"type": "composer-plugin",
"extra": {
"class": "Composer\\Installers\\Plugin",
"branch-alias": {
"dev-main": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Installers\\": "src/Composer/Installers"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Kyle Robinson Young",
"email": "kyle@dontkry.com",
"homepage": "https://github.com/shama"
}
],
"description": "A multi-framework Composer library installer",
"homepage": "https://composer.github.io/installers/",
"keywords": [
"Craft",
"Dolibarr",
"Eliasis",
"Hurad",
"ImageCMS",
"Kanboard",
"Lan Management System",
"MODX Evo",
"MantisBT",
"Mautic",
"Maya",
"OXID",
"Plentymarkets",
"Porto",
"RadPHP",
"SMF",
"Starbug",
"Thelia",
"Whmcs",
"WolfCMS",
"agl",
"aimeos",
"annotatecms",
"attogram",
"bitrix",
"cakephp",
"chef",
"cockpit",
"codeigniter",
"concrete5",
"croogo",
"dokuwiki",
"drupal",
"eZ Platform",
"elgg",
"expressionengine",
"fuelphp",
"grav",
"installer",
"itop",
"joomla",
"known",
"kohana",
"laravel",
"lavalite",
"lithium",
"magento",
"majima",
"mako",
"mediawiki",
"miaoxing",
"modulework",
"modx",
"moodle",
"osclass",
"pantheon",
"phpbb",
"piwik",
"ppi",
"processwire",
"puppet",
"pxcms",
"reindex",
"roundcube",
"shopware",
"silverstripe",
"sydes",
"sylius",
"symfony",
"tastyigniter",
"typo3",
"wordpress",
"yawik",
"zend",
"zikula"
],
"support": {
"issues": "https://github.com/composer/installers/issues",
"source": "https://github.com/composer/installers/tree/v1.12.0"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
"time": "2021-09-13T08:19:44+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"minimum-stability": "dev",
"stability-flags": {
"cleverogre/plugin-framework": 20
},
"prefer-stable": false,
"prefer-stable": true,
"prefer-lowest": false,
"platform": {},
"platform-dev": {},
+2
View File
@@ -44,12 +44,14 @@ gulp.task(
gulp.task('package-copy', () => {
return gulp.src([
'assets/**/*',
'inc/**/*',
'lib/**/*',
'vendor/**/*',
'LICENSE',
`${NAME}.php`,
'readme.txt',
'updatepulse.json',
'!vendor/**/node_modules/**/*',
], {
base: './',
+8 -20
View File
@@ -20,9 +20,6 @@ defined('ABSPATH') || exit;
abstract class Location {
use Singleton;
public const ERROR_EMPTY_TOKEN = 'empty_captcha_token';
public const ERROR_INVALID_CAPTCHA = 'invalid_captcha_result';
protected string $name;
protected function __construct(string $name) {
@@ -54,31 +51,22 @@ abstract class Location {
Widget::render();
}
public function process(WP_Error $errors):void {
if (!Settings::is_connected()) return;
$token = Widget::get_token();
if (empty($token)) {
$errors->add(self::ERROR_EMPTY_TOKEN, Plugin::__('<strong>Error:</strong> Please complete CAPTCHA verification.'));
return;
}
if (!API::verify($token)) {
$errors->add(self::ERROR_INVALID_CAPTCHA, Plugin::__('<strong>Error:</strong> Your answer was incorrect - please try again.'));
return;
}
public function process(WP_Error|null $errors = null):void {
API::process(Widget::get_token(), $errors);
}
protected function print_errors(WP_Error $errors):void {
if (!$errors->has_errors()) return;
ob_start();
echo '<ul>';
$messages = [];
foreach ($errors->get_error_codes() as $code) {
foreach ($errors->get_error_messages($code) as $message) {
echo '<li>' . wp_kses($message, ['strong']) . '</li>';
$messages[] = $message;
}
}
echo '</ul>';
ob_start();
echo '<ul><li>' . implode('</li><li>', $messages) . '</li></ul>';
wp_die(ob_get_clean());
}
+18
View File
@@ -10,12 +10,17 @@
namespace Ogre\Captcha;
use Ogre\Captcha as Plugin;
use Ogre\Captcha\Settings;
use WP_Error;
defined('ABSPATH') || exit;
final class API {
public const ERROR_EMPTY_TOKEN = 'empty_captcha_token';
public const ERROR_INVALID_CAPTCHA = 'invalid_captcha_result';
private static function transaction(string $url, array $data):array|string|bool {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, wp_json_encode($data));
@@ -52,4 +57,17 @@ final class API {
return is_bool($result) ? $result : false;
}
public static function process(string $token, WP_Error|null $errors = null): WP_Error {
if (is_null($errors)) $errors = new WP_Error();
if (!Settings::is_connected()) return $errors;
if (empty($token)) {
$errors->add(self::ERROR_EMPTY_TOKEN, Plugin::__('Please complete CAPTCHA verification.'));
} else if (!API::verify($token)) {
$errors->add(self::ERROR_INVALID_CAPTCHA, Plugin::__('Your answer was incorrect - please try again.'));
}
return $errors;
}
}
+10
View File
@@ -44,6 +44,16 @@ final class Settings {
return $data;
}
private static function set(string $key, $value = null):void {
$data = self::get();
if (is_null($value) && isset($data[$key])) {
unset($data[$key]);
} else {
$data[$key] = $value;
}
update_option(Plugin::get_id(), $data);
}
private static function is_checked(string $name, string $value):bool {
return in_array($value, (array) self::get($name));
}
+14 -6
View File
@@ -4,19 +4,20 @@
* @author cleverogre
* @copyright 2026 CleverOgre
* @license GLP-3.0-or-later
* @version 1.0.0
* @version 1.1.2
* @since 1.0.0
*/
namespace Ogre\Captcha;
use Ogre\Captcha as Plugin;
use Ogre\Captcha\Settings;
defined('ABSPATH') || exit;
final class Widget {
private const SCRIPT_HANDLE = 'cap';
private const HANDLE = 'cap';
private const TOKEN_NAME = 'cap-token';
private static function get_script_url():string {
@@ -24,14 +25,21 @@ final class Widget {
return Settings::get_instance_url('assets/widget.js');
}
public static function enqueue_script():void {
if (!Settings::is_connected() || wp_script_is(self::SCRIPT_HANDLE)) return;
wp_enqueue_script(self::SCRIPT_HANDLE, self::get_script_url());
public static function enqueue_assets():void {
if (!Settings::is_connected()) return;
if (!wp_script_is(self::HANDLE)) {
wp_enqueue_script(self::HANDLE, self::get_script_url());
}
if (!wp_style_is(self::HANDLE)) {
wp_enqueue_style(self::HANDLE, Plugin::get_url('assets/widget.css'));
}
}
public static function render(string $id = 'cap'):void {
if (!Settings::is_connected()) return;
self::enqueue_script();
self::enqueue_assets();
printf(
'<cap-widget id="%s" required data-cap-api-endpoint="%s"></cap-widget>',
esc_attr($id),
+151
View File
@@ -0,0 +1,151 @@
<?php
/**
* @package ogre-captcha
* @author cleverogre
* @copyright 2026 CleverOgre
* @license GLP-3.0-or-later
* @version 1.1.2
* @since 1.1.0
*/
namespace Ogre\Captcha\GravityForms;
use Ogre\Singleton;
use Ogre\Captcha as Plugin;
use Ogre\Captcha\API;
use Ogre\Captcha\Settings;
use Ogre\Captcha\Widget;
use GFForms;
use GFAddOn;
use GFFormDisplay;
defined('ABSPATH') || exit;
GFForms::include_addon_framework();
final class Addon extends GFAddOn {
use Singleton;
protected $_min_gravityforms_version = '2.6.3.2';
public static function get_instance(): Addon {
return self::instance();
}
function __construct() {
$this->_version = Plugin::get_version();
$this->_slug = Plugin::get_id();
$this->_path = sprintf(
'%1$s/%1$s.php',
Plugin::get_id()
);
$this->_full_path = Plugin::get_file();
$this->_title = sprintf(
Plugin::__('%s Add-On'),
Plugin::get_title()
);
$this->_short_title = Plugin::get_title();
parent::__construct();
}
public function init() {
add_filter('gform_submit_button', [$this, 'submit_button'], 10, 2);
add_filter('gform_validation', [$this, 'validation'], 10, 2);
parent::init();
}
public function get_menu_icon() {
return 'gform-icon--lock';
}
public function plugin_settings_fields() {
return [
[
'title' => esc_html(sprintf(
Plugin::__('%s Settings'),
Plugin::get_title()
)),
'description' => sprintf(
Plugin::__('Looking to configure your CAPTCHA connection? You can find the settings on <a href="%s">this page</a>.'),
esc_url(Settings::get_url())
),
'fields' => [
[
'label' => sprintf(
Plugin::esc_html__('Enable %s'),
Plugin::get_title()
),
'type' => 'checkbox',
'name' => 'enabled',
'choices' => [
[
'label' => Plugin::esc_html__('Enable CAPTCHA on all forms by default.'),
'name' => 'enabled',
]
]
]
]
]
];
}
public function form_settings_fields($form) {
return [
[
'title' => esc_html(sprintf(
Plugin::__('%s Settings'),
Plugin::get_title()
)),
'fields' => [
[
'type' => 'checkbox',
'name' => 'disabled',
'choices' => [
[
'label' => Plugin::esc_html__('Disable CAPTCHA for this form.'),
'name' => 'disabled',
]
]
]
]
]
];
}
public function is_enabled(array|null $form = null): bool {
$plugin_enabled = (bool) $this->get_plugin_setting('enabled');
if (is_null($form) || !$plugin_enabled) return $plugin_enabled;
$form_settings = $this->get_form_settings($form);
$form_disabled = (bool) rgar($form_settings, 'disabled');
return !$form_disabled;
}
public function submit_button(string $button_input, array $form): string {
if (!Settings::is_connected() || !$this->is_enabled($form)) return $button_input;
if ((is_admin() && !defined('DOING_AJAX')) || GFCommon::is_form_editor()) return $button_input;
ob_start();
Widget::render();
return ob_get_clean() . $button_input;
}
public function validation(array $validation_result, string $context): array {
if ($context != 'form-submit') return $validation_result;
$form = $validation_result['form'];
if (!GFFormDisplay::is_last_page($form) || rgpost('action') == 'heartbeat') return $validation_result;
if (!Settings::is_connected() || !$this->is_enabled($form)) return $validation_result;
$errors = API::process(Widget::get_token());
if ($errors->has_errors()) {
$validation_result['is_valid'] = false;
}
// TODO: Mark as spam (optional)
return $validation_result;
}
}
+3 -2
View File
@@ -10,6 +10,7 @@
namespace Ogre\Captcha\Location;
use Ogre\Captcha\API;
use Override;
use Ogre\Captcha\Location;
use Ogre\Captcha\Settings;
@@ -42,8 +43,8 @@ final class LoginPage extends Location {
return array_merge(
$shake_error_codes,
[
self::ERROR_EMPTY_TOKEN,
self::ERROR_INVALID_CAPTCHA,
API::ERROR_EMPTY_TOKEN,
API::ERROR_INVALID_CAPTCHA,
]
);
}
+28 -4
View File
@@ -6,14 +6,14 @@
* @author cleverogre
* @copyright 2026 CleverOgre
* @license GLP-3.0-or-later
* @version 1.0.0
* @version 1.1.2
* @since 1.0.0
*
* @wordpress-plugin
* Plugin Name: Ogre CAPTCHA
* Plugin URI: https://git.cleverogre.com/cleverogre/ogre-captcha/
* Description: Protect your site with CAPTCHA
* Version: 1.0.0
* Version: 1.1.2
* Requires at least: 6.0
* Requires PHP: 8.2
* Author: CleverOgre
@@ -23,11 +23,19 @@
* License URI: http://www.gnu.org/licenses/gpl-3.0.html
* Update URI: https://git.cleverogre.com/cleverogre/ogre-captcha/
* Domain Path: /lang
* Icon1x: https://plugins.cleverogre.com/wp-content/uploads/ogre-captcha-icon-128x128.png
* Icon2x: https://plugins.cleverogre.com/wp-content/uploads/ogre-captcha-icon-256x256.png
* BannerLow: https://plugins.cleverogre.com/wp-content/uploads/ogre-captcha-banner-772x250.png
* BannerHigh: https://plugins.cleverogre.com/wp-content/uploads/ogre-captcha-banner-1544x500.png
* Requires License: yes
*/
namespace Ogre;
use Ogre\Captcha\Settings;
use Ogre\Captcha\GravityForms\Addon;
use GFAddOn;
use Override;
defined('ABSPATH') || exit;
@@ -39,6 +47,10 @@ final class Captcha extends Plugin {
return is_plugin_active('woocommerce/woocommerce.php');
}
public static function is_gravityforms_active():bool {
return is_plugin_active('gravityforms/gravityforms.php');
}
protected function __construct() {
parent::__construct();
@@ -54,18 +66,22 @@ final class Captcha extends Plugin {
'inc/location/class-post-password-form.php',
'inc/location/class-registration-page.php',
]);
add_action('plugins_loaded', [$this, 'load_woocommerce'], 9, 0);
}
#[Override]
protected function enable():void {
parent::enable();
add_filter('plugin_action_links_' . self::get_basename(), [$this, 'action_links']);
add_action('plugins_loaded', [$this, 'load_woocommerce'], 2, 0);
add_action('gform_loaded', [$this, 'load_gravityforms'], 5, 0);
}
#[Override]
protected function disable():void {
parent::disable();
remove_filter('plugin_action_links_' . self::get_basename(), [$this, 'action_links']);
remove_action('plugins_loaded', [$this, 'load_woocommerce'], 2);
remove_action('gform_loaded', [$this, 'load_gravityforms'], 5);
}
public function action_links(array $links):array {
@@ -90,6 +106,14 @@ final class Captcha extends Plugin {
]);
}
public function load_gravityforms():void {
if (!self::is_gravityforms_active() || !method_exists('GFForms', 'include_addon_framework')) return;
require_once('inc/gravityforms/class-addon.php');
GFAddOn::register(Addon::class);
}
}
Captcha::instance();
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://www.schemastore.org/package.json",
"name": "cleverogre/ogre-captcha",
"version": "1.0.0",
"version": "1.1.2",
"title": "Ogre CAPTCHA",
"description": "Protect your site with CAPTCHA",
"author": "CleverOgre",
+4 -1
View File
@@ -3,7 +3,7 @@ Contributors: ogrecooper, cleverogre
Tested up to: 7.0
Requires at least: 6.0
Requires PHP: 8.2
Version: 1.0.0
Version: 1.0.1
License: GPLv3 or later
License URI: https://www.gnu.org/licenses/gpl-3.0.html
Copyright: CleverOgre
@@ -28,5 +28,8 @@ If you don't know what plugin you have downloaded, please contact [CleverOgre](t
== Changelog ==
= 1.0.1 - 2026-06-05 =
* Update to use UpdatePulse server
= 1.0.0 - 2026-06-04 =
* Initial release
+3
View File
@@ -0,0 +1,3 @@
{
"server": "https://plugins.cleverogre.com"
}