Refactor plugin to use OOP best practices with proper namespaces and class structure
Some checks failed
ci/woodpecker/push/woodpecker Pipeline is pending
Build Release / Build and Create Release (push) Has been cancelled
Build Release / Deploy to WordPress.org (push) Has been cancelled
ci/woodpecker/tag/woodpecker Pipeline was successful

This commit is contained in:
2025-04-14 19:18:05 +01:00
parent 7c0dadac08
commit 15244dc687
10 changed files with 1230 additions and 1044 deletions

167
includes/Modal.php Normal file
View File

@ -0,0 +1,167 @@
<?php
/**
* Modal Functionality
*
* @package WPALLSTARS\FixPluginDoesNotExistNotices
*/
namespace WPALLSTARS\FixPluginDoesNotExistNotices;
/**
* Modal Class
*
* Handles the update source selector modal.
*/
class Modal {
/**
* Constructor
*/
public function __construct() {
// Add filter for plugin action links to add our update source selector
add_filter('plugin_action_links_' . plugin_basename(FPDEN_PLUGIN_DIR . 'wp-fix-plugin-does-not-exist-notices.php'), array($this, 'add_update_source_link'));
// Add AJAX handler for saving update source
add_action('wp_ajax_fpden_save_update_source', array($this, 'save_update_source'));
// Add the update source modal to admin footer
add_action('admin_footer', array($this, 'add_update_source_modal'));
}
/**
* Add the "Update Source" link to plugin action links
*
* @param array $links Array of plugin action links
* @return array Modified array of plugin action links
*/
public function add_update_source_link($links) {
if (!current_user_can('manage_options')) {
return $links;
}
// Get current update source
$current_source = get_option('fpden_update_source', 'auto');
// Add a badge to show the current source
$badge_class = 'fpden-source-badge ' . $current_source;
$badge_text = ucfirst($current_source);
if ($current_source === 'auto') {
$badge_text = 'Auto';
} elseif ($current_source === 'wordpress.org') {
$badge_text = 'WP.org';
}
// Add the link with the badge
$update_source_link = '<a href="#" class="fpden-update-source-toggle">Update Source <span class="' . $badge_class . '">' . $badge_text . '</span></a>';
$links[] = $update_source_link;
return $links;
}
/**
* Add the update source modal to the admin footer
*/
public function add_update_source_modal() {
if (!is_admin() || !current_user_can('manage_options')) {
return;
}
// Only show on plugins page
$screen = get_current_screen();
if (!$screen || $screen->id !== 'plugins') {
return;
}
// Get current source
$current_source = get_option('fpden_update_source', 'auto');
// Enqueue the CSS and JS
wp_enqueue_style(
'fpden-update-source-selector',
FPDEN_PLUGIN_URL . 'admin/css/update-source-selector.css',
array(),
FPDEN_VERSION
);
wp_enqueue_script(
'fpden-update-source-selector',
FPDEN_PLUGIN_URL . 'admin/js/update-source-selector.js',
array('jquery'),
FPDEN_VERSION,
true
);
// Add nonce to the existing fpdenData object or create it if it doesn't exist
$nonce = wp_create_nonce('fpden_update_source');
wp_localize_script(
'fpden-update-source-selector',
'fpdenData',
array(
'updateSourceNonce' => $nonce,
)
);
// Modal HTML
?>
<div id="fpden-update-source-modal">
<a href="#" class="fpden-close-modal" aria-label="Close modal">×</a>
<h2>Choose Update Source</h2>
<p>Select where you want to receive plugin updates from:</p>
<form id="fpden-update-source-form">
<label>
<input type="radio" name="update_source" value="wordpress.org" <?php checked($current_source, 'wordpress.org'); ?>>
<a href="https://wordpress.org/plugins/wp-fix-plugin-does-not-exist-notices/" target="_blank" rel="noopener noreferrer">WordPress.org</a>
<span class="fpden-source-description">Updates from the official WordPress.org plugin repository. Has a version update delay, to allow for the WP.org policy review and approval process. Best for unmonitored auto-updates.</span>
</label>
<label>
<input type="radio" name="update_source" value="github" <?php checked($current_source, 'github'); ?>>
<a href="https://github.com/wpallstars/wp-fix-plugin-does-not-exist-notices" target="_blank" rel="noopener noreferrer">GitHub</a>
<span class="fpden-source-description">Update directly from the GitHub repo main branch for the latest stable release. Git Updater plugin must be installed & active. Best for monitored updates, where the latest features and fixes are required as soon as they are merged into the main branch.</span>
</label>
<label>
<input type="radio" name="update_source" value="gitea" <?php checked($current_source, 'gitea'); ?>>
<a href="https://gitea.wpallstars.com/wpallstars/wp-fix-plugin-does-not-exist-notices" target="_blank" rel="noopener noreferrer">Gitea</a>
<span class="fpden-source-description">Update directly from the Gitea repo main branch for the latest stable release. Git Updater plugin must be installed & active. Best for monitored updates, where the latest features and fixes are required as soon as they are merged into the main branch, and independence from big-tech.</span>
</label>
<div class="fpden-submit-container">
<button type="submit" class="button button-primary">Save</button>
</div>
</form>
</div>
<?php
}
/**
* Handle AJAX request to save update source
*/
public function save_update_source() {
// Check nonce
check_ajax_referer('fpden_update_source', 'nonce');
// Check permissions
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
// Get and sanitize source
$source = isset($_POST['source']) ? sanitize_text_field($_POST['source']) : '';
// Validate source
$valid_sources = ['wordpress.org', 'github', 'gitea'];
if (!in_array($source, $valid_sources)) {
$source = ''; // Empty means use auto-detection
}
// Save option
update_option('fpden_update_source', $source);
// Clear update cache
delete_site_transient('update_plugins');
wp_send_json_success();
}
}