monorepo/native/wordpress/maplepress-plugin/includes/admin-settings-display.php

332 lines
11 KiB
PHP

<?php
/**
* Admin settings page template.
*
* @package MaplePress
* @subpackage MaplePress/includes
*/
// Exit if accessed directly.
if (!defined("ABSPATH")) {
exit();
} ?>
<div class="wrap">
<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
<?php
$options = get_option("maplepress_settings");
$has_api_key = !empty($options["api_key"]);
$is_verified = isset($options["is_verified"]) && $options["is_verified"];
// Refresh quota data if verified and API credentials are available
// Fetch fresh data on every page load without persisting to avoid triggering hooks
if (
$is_verified &&
!empty($options["api_url"]) &&
!empty($options["api_key"])
) {
require_once MAPLEPRESS_PLUGIN_DIR .
"includes/class-maplepress-api-client.php";
$api_client = new MaplePress_API_Client(
$options["api_url"],
$options["api_key"],
);
$fresh_status = $api_client->verify_connection();
// Update options with fresh quota data if API call succeeded
// Note: We only update the in-memory $options array, not the database
// This ensures fresh display without triggering validation hooks
if (!is_wp_error($fresh_status)) {
// Update quota fields in options for display only
if (isset($fresh_status["search_requests_count"])) {
$options["search_requests_count"] = absint(
$fresh_status["search_requests_count"],
);
}
if (isset($fresh_status["storage_used_bytes"])) {
$options["storage_used_bytes"] = absint(
$fresh_status["storage_used_bytes"],
);
}
if (isset($fresh_status["monthly_pages_indexed"])) {
$options["monthly_pages_indexed"] = absint(
$fresh_status["monthly_pages_indexed"],
);
}
if (isset($fresh_status["total_pages_indexed"])) {
$options["total_pages_indexed"] = absint(
$fresh_status["total_pages_indexed"],
);
}
// Do NOT call update_option() here - it could trigger validation/sync hooks
}
}
?>
<?php if (!$has_api_key): ?>
<!-- First-time setup instructions -->
<div class="notice notice-info" style="padding: 15px; margin: 20px 0;">
<h2 style="margin-top: 0;"><?php esc_html_e(
"🚀 Welcome to MaplePress!",
"maplepress",
); ?></h2>
<p><?php esc_html_e(
"MaplePress provides cloud services for your WordPress site - starting with advanced search, with more features coming soon (uploads, metrics, analytics, etc.).",
"maplepress",
); ?></p>
<p><strong><?php esc_html_e(
'✨ When you save settings with "Enable MaplePress search" checked, all your existing pages will automatically sync!',
"maplepress",
); ?></strong></p>
<p><?php esc_html_e("To get started, follow these steps:", "maplepress"); ?></p>
<ol style="margin-left: 20px;">
<li>
<strong><?php esc_html_e(
"Create a MaplePress account:",
"maplepress",
); ?></strong><br>
<a href="https://getmaplepress.com/register" target="_blank" class="button button-primary" style="margin-top: 5px;">
<?php esc_html_e("Sign Up at MaplePress.io", "maplepress"); ?>
</a>
<?php esc_html_e("or", "maplepress"); ?>
<a href="https://getmaplepress.com/login" target="_blank" class="button" style="margin-top: 5px;">
<?php esc_html_e("Login to Existing Account", "maplepress"); ?>
</a>
</li>
<li style="margin-top: 10px;">
<strong><?php esc_html_e(
"Create a site in your dashboard",
"maplepress",
); ?></strong><br>
<span style="color: #666;"><?php esc_html_e(
"After logging in, create a new site for this WordPress installation.",
"maplepress",
); ?></span>
</li>
<li style="margin-top: 10px;">
<strong><?php esc_html_e(
"Copy your API URL and API key",
"maplepress",
); ?></strong><br>
<span style="color: #666;">
<?php esc_html_e(
"Your API URL is https://getmaplepress.ca (or your custom backend URL). Your API key will be displayed once - make sure to copy both!",
"maplepress",
); ?>
</span>
</li>
<li style="margin-top: 10px;">
<strong><?php esc_html_e(
"Paste your API URL and API key below and save",
"maplepress",
); ?></strong>
</li>
</ol>
</div>
<?php endif; ?>
<?php settings_errors("maplepress_settings"); ?>
<?php // Display sync status messages
if (isset($_GET["sync_status"])) {
if (
$_GET["sync_status"] === "success" &&
isset($_GET["synced_count"])
) { ?>
<div class="notice notice-success is-dismissible">
<p>
<?php printf(
/* translators: %d: number of pages synced */
esc_html__(
"✓ Successfully synced %d pages to MaplePress!",
"maplepress",
),
absint($_GET["synced_count"]),
); ?>
</p>
</div>
<?php } elseif (
$_GET["sync_status"] === "error" &&
isset($_GET["sync_message"])
) { ?>
<div class="notice notice-error is-dismissible">
<p>
<?php printf(
/* translators: %s: error message */
esc_html__("✗ Sync failed: %s", "maplepress"),
esc_html(urldecode($_GET["sync_message"])),
); ?>
</p>
</div>
<?php } elseif ($_GET["sync_status"] === "no_posts") { ?>
<div class="notice notice-warning is-dismissible">
<p><?php esc_html_e(
"No published posts or pages found to sync.",
"maplepress",
); ?></p>
</div>
<?php }
} ?>
<form method="post" action="options.php">
<?php
settings_fields("maplepress_settings_group");
do_settings_sections("maplepress");
submit_button(__("Save Settings & Verify Connection", "maplepress"));
?>
</form>
<?php if ($is_verified): ?>
<!-- Connection status - show site details -->
<hr>
<h2><?php esc_html_e("✓ Connected to MaplePress", "maplepress"); ?></h2>
<table class="form-table">
<tr>
<th scope="row"><?php esc_html_e("Domain", "maplepress"); ?></th>
<td><?php echo esc_html($options["domain"] ?? "N/A"); ?></td>
</tr>
<tr>
<th scope="row"><?php esc_html_e("Plan", "maplepress"); ?></th>
<td><strong><?php echo esc_html(
ucfirst($options["plan_tier"] ?? "free"),
); ?></strong></td>
</tr>
<tr>
<th scope="row"><?php esc_html_e("Status", "maplepress"); ?></th>
<td>
<?php if ($options["enabled"]): ?>
<span style="color: #46b450; font-weight: bold;">● <?php esc_html_e(
"Active",
"maplepress",
); ?></span>
<?php else: ?>
<span style="color: #dc3232; font-weight: bold;">● <?php esc_html_e(
"Inactive (Enable above to activate)",
"maplepress",
); ?></span>
<?php endif; ?>
</td>
</tr>
</table>
<?php if (
isset($options["storage_quota_bytes"]) ||
isset($options["search_quota_monthly"]) ||
isset($options["indexing_quota_pages"])
): ?>
<h3><?php esc_html_e("Usage & Quotas", "maplepress"); ?></h3>
<table class="form-table">
<?php if (isset($options["storage_quota_bytes"])): ?>
<tr>
<th scope="row"><?php esc_html_e("Storage", "maplepress"); ?></th>
<td>
<?php
$used = isset($options["storage_used_bytes"])
? $options["storage_used_bytes"]
: 0;
$quota = $options["storage_quota_bytes"];
$used_mb = round($used / 1024 / 1024, 2);
$quota_mb = round($quota / 1024 / 1024, 2);
$percent = $quota > 0 ? round(($used / $quota) * 100, 1) : 0;
?>
<strong><?php echo esc_html($used_mb); ?> MB</strong> / <?php echo esc_html(
$quota_mb,
); ?> MB
<span style="color: <?php echo $percent > 80
? "#dc3232"
: "#46b450"; ?>;">(<?php echo esc_html($percent); ?>% used)</span>
</td>
</tr>
<?php endif; ?>
<?php if (isset($options["search_quota_monthly"])): ?>
<tr>
<th scope="row"><?php esc_html_e("Monthly Searches", "maplepress"); ?></th>
<td>
<?php
$used = isset($options["search_requests_count"])
? $options["search_requests_count"]
: 0;
$quota = $options["search_quota_monthly"];
$percent = $quota > 0 ? round(($used / $quota) * 100, 1) : 0;
?>
<strong><?php echo esc_html(
number_format($used),
); ?></strong> / <?php echo esc_html(number_format($quota)); ?>
<span style="color: <?php echo $percent > 80
? "#dc3232"
: "#46b450"; ?>;">(<?php echo esc_html($percent); ?>% used)</span>
</td>
</tr>
<?php endif; ?>
<?php if (isset($options["indexing_quota_pages"])): ?>
<tr>
<th scope="row"><?php esc_html_e("Monthly Indexing", "maplepress"); ?></th>
<td>
<?php
$used = isset($options["monthly_pages_indexed"])
? $options["monthly_pages_indexed"]
: 0;
$quota = $options["indexing_quota_pages"];
$percent = $quota > 0 ? round(($used / $quota) * 100, 1) : 0;
?>
<strong><?php echo esc_html(
number_format($used),
); ?></strong> / <?php echo esc_html(number_format($quota)); ?> pages
<span style="color: <?php echo $percent > 80
? "#dc3232"
: "#46b450"; ?>;">(<?php echo esc_html(
$percent,
); ?>% used this month)</span>
</td>
</tr>
<tr>
<th scope="row"><?php esc_html_e("Total Pages Indexed", "maplepress"); ?></th>
<td>
<?php $total = isset($options["total_pages_indexed"])
? $options["total_pages_indexed"]
: 0; ?>
<strong><?php echo esc_html(number_format($total)); ?></strong> pages (all-time)
</td>
</tr>
<?php endif; ?>
</table>
<?php endif; ?>
<hr>
<h2><?php esc_html_e("Sync Pages", "maplepress"); ?></h2>
<p><?php esc_html_e(
"Sync all your published posts and pages to MaplePress. New posts and pages are automatically synced when published.",
"maplepress",
); ?></p>
<form method="post" action="<?php echo esc_url(admin_url("admin.php")); ?>">
<input type="hidden" name="action" value="maplepress_bulk_sync">
<?php wp_nonce_field("maplepress_bulk_sync"); ?>
<p>
<button type="submit" class="button button-primary">
<?php esc_html_e("Sync All Pages Now", "maplepress"); ?>
</button>
</p>
</form>
<p>
<a href="https://getmaplepress.com/dashboard" target="_blank" class="button">
<?php esc_html_e("→ Open MaplePress Dashboard", "maplepress"); ?>
</a>
</p>
<?php endif; ?>
<hr>
<h2><?php esc_html_e("About MaplePress", "maplepress"); ?></h2>
<p>
<?php printf(
/* translators: %s: MaplePress website URL */
esc_html__(
"MaplePress is a cloud services platform for WordPress that offloads computationally intensive tasks to dedicated infrastructure. Currently featuring advanced search capabilities, with more services coming soon including uploads, metrics, and analytics. Visit %s to learn more.",
"maplepress",
),
'<a href="https://mapleopentech.io" target="_blank">https://mapleopentech.io</a>',
); ?>
</p>
</div>