diff --git a/.ai-assistant.md b/.ai-assistant.md new file mode 100644 index 0000000..5f7c8b2 --- /dev/null +++ b/.ai-assistant.md @@ -0,0 +1,173 @@ +# AI Assistant Guide for Fix Plugin Does Not Exist Notices + +This guide helps AI assistants understand the project structure, workflows, and best practices for this repository. + +## Project Overview + +- **Plugin Name**: Fix 'Plugin file does not exist.' Notices +- **Repository**: https://github.com/wpallstars/fix-plugin-does-not-exist-notices +- **Description**: WordPress plugin that adds missing plugins to the plugins list with a "Remove Reference" link to clean up invalid plugin entries and remove error notices. + +## Version Management + +### Version Numbering Convention + +We follow [Semantic Versioning](https://semver.org/): +- **MAJOR.MINOR.PATCH** (e.g., 1.6.0) + - **MAJOR**: Breaking changes + - **MINOR**: New features, non-breaking + - **PATCH**: Bug fixes, non-breaking + +### When to Increment Version Numbers + +- **PATCH** (1.6.0 → 1.6.1): + - Bug fixes + - Small text changes + - Minor improvements that don't add new features + +- **MINOR** (1.6.0 → 1.7.0): + - New features + - Significant improvements to existing functionality + - Deprecation of features (but not removal) + +- **MAJOR** (1.6.0 → 2.0.0): + - Breaking changes + - Removal of features + - Major architectural changes + +### Version Update Checklist + +When updating the version number, always update these files: +1. `fix-plugin-does-not-exist-notices.php` (Plugin header) +2. `CHANGELOG.md` (Add new version section) +3. `readme.txt` (Stable tag and Changelog section) +4. Update `FPDEN_VERSION` constant in the main plugin file + +## Git Workflow + +### Branch Naming Convention + +- Feature branches: `feature/descriptive-name` +- Bug fix branches: `fix/issue-description` +- Release branches: `v{MAJOR}.{MINOR}.{PATCH}` + +### Commit Message Guidelines + +- Use present tense ("Add feature" not "Added feature") +- Start with a verb +- Keep the first line under 50 characters +- Reference issues when relevant: "Fix #123: Resolve plugin detection issue" + +### Release Process + +1. Create a new branch for the version: `git checkout -b v{MAJOR}.{MINOR}.{PATCH}` +2. Update version numbers in all required files +3. Update CHANGELOG.md with all changes +4. Commit changes: `git commit -m "Prepare release v{MAJOR}.{MINOR}.{PATCH}"` +5. Push branch to all remotes: + ``` + git push github HEAD:v{MAJOR}.{MINOR}.{PATCH} + git push gitea HEAD:v{MAJOR}.{MINOR}.{PATCH} + ``` +6. Create and push a tag to trigger the GitHub Actions workflow: + ``` + git tag -a v{MAJOR}.{MINOR}.{PATCH} -m "Release version {MAJOR}.{MINOR}.{PATCH}" + git push github refs/tags/v{MAJOR}.{MINOR}.{PATCH} + git push gitea refs/tags/v{MAJOR}.{MINOR}.{PATCH} + ``` + +## Build Process + +The build process is handled by `build.sh`: +1. Updates version numbers +2. Installs composer dependencies +3. Copies files to build directory +4. Creates ZIP file + +To manually build the plugin: +``` +./build.sh {MAJOR}.{MINOR}.{PATCH} +``` + +## Remote Repositories + +The plugin is hosted on multiple repositories: +- GitHub: https://github.com/wpallstars/fix-plugin-does-not-exist-notices +- Gitea: https://gitea.wpallstars.com/wpallstars/fix-plugin-does-not-exist-notices +- WordPress.org: https://wordpress.org/plugins/fix-plugin-does-not-exist-notices/ + +Always push changes to all remotes to keep them in sync. + +## GitHub Actions + +The repository uses GitHub Actions for automated builds and deployments: +- Triggered by tags matching the pattern `v*` +- Builds the plugin +- Creates a GitHub release +- Deploys to WordPress.org + +## Testing Guidelines + +Before releasing: +1. Test with the latest WordPress version +2. Test with PHP 7.0+ (minimum supported version) +3. Verify all features work as expected +4. Check for any PHP warnings or notices + +## Common Tasks for AI Assistants + +### Creating a New Release + +``` +# 1. Create a new branch +git checkout -b v1.7.0 + +# 2. Update version numbers in files +# - fix-plugin-does-not-exist-notices.php +# - CHANGELOG.md +# - readme.txt +# - FPDEN_VERSION constant + +# 3. Commit changes +git add . +git commit -m "Prepare release v1.7.0" + +# 4. Push to remotes +git push github HEAD:v1.7.0 +git push gitea HEAD:v1.7.0 + +# 5. Create and push tag +git tag -a v1.7.0 -m "Release version 1.7.0" +git push github refs/tags/v1.7.0 +git push gitea refs/tags/v1.7.0 +``` + +### Adding a New Feature + +``` +# 1. Create feature branch +git checkout -b feature/new-feature-name + +# 2. Make changes and commit +git add . +git commit -m "Add new feature" + +# 3. Push to remotes +git push github HEAD:feature/new-feature-name +git push gitea HEAD:feature/new-feature-name +``` + +### Fixing a Bug + +``` +# 1. Create bugfix branch +git checkout -b fix/bug-description + +# 2. Make changes and commit +git add . +git commit -m "Fix #123: Fix bug description" + +# 3. Push to remotes +git push github HEAD:fix/bug-description +git push gitea HEAD:fix/bug-description +``` diff --git a/.github/ai-workflows/bug-fixing.md b/.github/ai-workflows/bug-fixing.md new file mode 100644 index 0000000..3c5a7be --- /dev/null +++ b/.github/ai-workflows/bug-fixing.md @@ -0,0 +1,160 @@ +# Bug Fixing Guide for AI Assistants + +This document provides guidance for AI assistants to help with bug fixing for the Fix Plugin Does Not Exist Notices plugin. + +## Bug Fixing Workflow + +### 1. Create a Bug Fix Branch + +Always start by creating a bug fix branch from the main branch: + +```bash +git checkout main +git pull github main +git checkout -b fix/bug-description +``` + +Use a descriptive name that clearly indicates what bug is being fixed. + +### 2. Understand the Bug + +Before fixing a bug, make sure you understand: + +- What is the expected behavior? +- What is the actual behavior? +- What are the steps to reproduce the bug? +- What is the impact of the bug? +- What is the root cause of the bug? + +### 3. Fix the Bug + +When fixing a bug: + +- Make minimal changes necessary to fix the bug +- Avoid introducing new features while fixing bugs +- Maintain backward compatibility +- Add appropriate comments explaining the fix +- Consider adding tests to prevent regression + +### 4. Update Documentation + +Update relevant documentation to reflect the bug fix: + +- Add a description to CHANGELOG.md under an "Unreleased" section +- Update readme.txt if the bug fix affects user-facing functionality + +### 5. Testing + +Test the bug fix thoroughly: + +- Verify that the bug is fixed +- Ensure no regression in related functionality +- Test with the latest WordPress version +- Test with the minimum supported WordPress version (5.0) +- Test with PHP 7.0+ (minimum supported version) + +### 6. Commit Changes + +Make atomic commits with clear messages: + +```bash +git add . +git commit -m "Fix #123: Brief description of the bug fix" +``` + +If there's an issue number, reference it in the commit message. + +### 7. Push to Remote + +Push the bug fix branch to the remote repositories: + +```bash +git push github HEAD:fix/bug-description +git push gitea HEAD:fix/bug-description +``` + +### 8. Create Pull Request (Optional) + +If the repository uses pull requests for code review, create a pull request from the bug fix branch to the main branch. + +## Determining Version Increment + +After fixing a bug, determine the appropriate version increment: + +- **PATCH** (e.g., 1.6.0 → 1.6.1): For most bug fixes that don't change functionality +- **MINOR** (e.g., 1.6.0 → 1.7.0): For bug fixes that introduce new features or significant changes +- **MAJOR** (e.g., 1.6.0 → 2.0.0): For bug fixes that introduce breaking changes + +## Hotfix Process + +For critical bugs that need immediate fixing in a released version: + +### 1. Create a Hotfix Branch + +```bash +git checkout v{MAJOR}.{MINOR}.{PATCH} +git checkout -b hotfix/v{MAJOR}.{MINOR}.{PATCH+1} +``` + +### 2. Fix the Bug + +Apply the minimal fix necessary to address the critical issue. + +### 3. Update Version Numbers + +Increment the PATCH version and update all version numbers: + +- Main plugin file (fix-plugin-does-not-exist-notices.php) +- FPDEN_VERSION constant +- CHANGELOG.md +- readme.txt + +### 4. Commit and Push + +```bash +git add . +git commit -m "Hotfix: Brief description of the critical bug fix" +git push github HEAD:hotfix/v{MAJOR}.{MINOR}.{PATCH+1} +git push gitea HEAD:hotfix/v{MAJOR}.{MINOR}.{PATCH+1} +``` + +### 5. Create and Push Tag + +```bash +git tag -a v{MAJOR}.{MINOR}.{PATCH+1} -m "Hotfix release version {MAJOR}.{MINOR}.{PATCH+1}" +git push github refs/tags/v{MAJOR}.{MINOR}.{PATCH+1} +git push gitea refs/tags/v{MAJOR}.{MINOR}.{PATCH+1} +``` + +## Common Bug Types and Fixing Strategies + +### WordPress Compatibility Issues + +- Test with the specific WordPress version where the issue occurs +- Check for deprecated functions or hooks +- Review WordPress changelog for relevant changes + +### PHP Compatibility Issues + +- Test with the specific PHP version where the issue occurs +- Check for deprecated PHP functions or features +- Use appropriate polyfills if necessary + +### JavaScript Issues + +- Test in different browsers +- Check for browser console errors +- Consider browser-specific workarounds if necessary + +### CSS Issues + +- Test in different browsers and screen sizes +- Use browser developer tools to inspect elements +- Consider browser-specific workarounds if necessary + +### Database Issues + +- Use proper database prefixing +- Sanitize database inputs +- Use prepared statements for queries +- Consider database version differences diff --git a/.github/ai-workflows/code-review.md b/.github/ai-workflows/code-review.md new file mode 100644 index 0000000..37c09f4 --- /dev/null +++ b/.github/ai-workflows/code-review.md @@ -0,0 +1,163 @@ +# Code Review Guide for AI Assistants + +This document provides guidance for AI assistants to help with code review for the Fix Plugin Does Not Exist Notices plugin. + +## Code Review Checklist + +When reviewing code, check for the following: + +### Functionality + +- [ ] Does the code work as expected? +- [ ] Does it handle edge cases appropriately? +- [ ] Are there any logical errors? +- [ ] Is error handling implemented properly? + +### Code Quality + +- [ ] Does the code follow WordPress coding standards? +- [ ] Is the code well-organized and easy to understand? +- [ ] Are there any code smells (duplicate code, overly complex functions, etc.)? +- [ ] Are functions and variables named appropriately? +- [ ] Are there appropriate comments and documentation? + +### Security + +- [ ] Is user input properly validated and sanitized? +- [ ] Is output properly escaped? +- [ ] Are capability checks used for user actions? +- [ ] Are nonces used for form submissions? +- [ ] Are there any potential SQL injection vulnerabilities? +- [ ] Are there any potential XSS vulnerabilities? + +### Performance + +- [ ] Are there any performance bottlenecks? +- [ ] Are database queries optimized? +- [ ] Is caching used appropriately? +- [ ] Are assets (CSS, JS) properly enqueued? + +### Compatibility + +- [ ] Is the code compatible with the minimum supported WordPress version (5.0)? +- [ ] Is the code compatible with the minimum supported PHP version (7.0)? +- [ ] Are there any browser compatibility issues? +- [ ] Are there any conflicts with other plugins? + +### Internationalization + +- [ ] Are all user-facing strings translatable? +- [ ] Is the correct text domain used? +- [ ] Are translation functions used correctly? + +### Accessibility + +- [ ] Does the code follow accessibility best practices? +- [ ] Are ARIA attributes used appropriately? +- [ ] Is keyboard navigation supported? +- [ ] Is screen reader support implemented? + +## Code Review Process + +### 1. Understand the Context + +Before reviewing code, understand: +- What problem is the code trying to solve? +- What are the requirements? +- What are the constraints? + +### 2. Review the Code + +Review the code with the checklist above in mind. + +### 3. Provide Feedback + +When providing feedback: +- Be specific and clear +- Explain why a change is needed +- Provide examples or suggestions when possible +- Prioritize feedback (critical issues vs. minor improvements) +- Be constructive and respectful + +### 4. Follow Up + +After the code has been updated: +- Review the changes +- Verify that issues have been addressed +- Provide additional feedback if necessary + +## Common Issues to Look For + +### PHP Issues + +- Undefined variables or functions +- Incorrect function parameters +- Missing return statements +- Improper error handling +- Inefficient loops or conditionals +- Hardcoded values that should be configurable + +### WordPress-Specific Issues + +- Incorrect hook usage +- Missing or incorrect nonces +- Missing capability checks +- Direct database queries instead of using WordPress functions +- Improper enqueuing of scripts and styles +- Not using WordPress functions for common tasks + +### JavaScript Issues + +- Undefined variables or functions +- Event listener memory leaks +- jQuery conflicts +- Browser compatibility issues +- Missing error handling + +### CSS Issues + +- Browser compatibility issues +- Specificity issues +- Unused styles +- Overriding WordPress admin styles inappropriately + +## Example Feedback + +### Good Feedback Example + +``` +In function `handle_remove_reference()`: + +1. The nonce check is missing, which could lead to CSRF vulnerabilities. + Consider adding: + ```php + if (!isset($_GET['_wpnonce']) || !wp_verify_nonce($_GET['_wpnonce'], 'fpden_remove_reference')) { + wp_die(__('Security check failed.', 'fix-plugin-does-not-exist-notices')); + } + ``` + +2. The user capability check should be more specific. Instead of: + ```php + if (!current_user_can('manage_options')) { + ``` + Consider using: + ```php + if (!current_user_can('activate_plugins')) { + ``` + This is more appropriate for the action being performed. + +3. The success message should be translatable: + ```php + // Change this: + add_settings_error('fpden', 'fpden_removed', 'Plugin reference removed successfully.', 'updated'); + + // To this: + add_settings_error('fpden', 'fpden_removed', __('Plugin reference removed successfully.', 'fix-plugin-does-not-exist-notices'), 'updated'); + ``` +``` + +### Poor Feedback Example + +``` +This code has security issues and doesn't follow best practices. Fix it. +``` diff --git a/.github/ai-workflows/feature-development.md b/.github/ai-workflows/feature-development.md new file mode 100644 index 0000000..8c7dc2a --- /dev/null +++ b/.github/ai-workflows/feature-development.md @@ -0,0 +1,130 @@ +# Feature Development Guide for AI Assistants + +This document provides guidance for AI assistants to help with feature development for the Fix Plugin Does Not Exist Notices plugin. + +## Feature Development Workflow + +### 1. Create a Feature Branch + +Always start by creating a feature branch from the main branch: + +```bash +git checkout main +git pull github main +git checkout -b feature/descriptive-name +``` + +Use a descriptive name that clearly indicates what the feature is about. + +### 2. Implement the Feature + +When implementing a new feature: + +- Follow WordPress coding standards +- Ensure all strings are translatable +- Add appropriate comments +- Consider performance implications +- Maintain backward compatibility + +### 3. Update Documentation + +Update relevant documentation to reflect the new feature: + +- Add a description to CHANGELOG.md under an "Unreleased" section +- Update readme.txt if the feature affects user-facing functionality +- Update inline documentation/comments + +### 4. Testing + +Test the feature thoroughly: + +- Test with the latest WordPress version +- Test with the minimum supported WordPress version (5.0) +- Test with PHP 7.0+ (minimum supported version) +- Test in different environments (if possible) + +### 5. Commit Changes + +Make atomic commits with clear messages: + +```bash +git add . +git commit -m "Add feature: descriptive name" +``` + +### 6. Push to Remote + +Push the feature branch to the remote repositories: + +```bash +git push github HEAD:feature/descriptive-name +git push gitea HEAD:feature/descriptive-name +``` + +### 7. Create Pull Request (Optional) + +If the repository uses pull requests for code review, create a pull request from the feature branch to the main branch. + +## Code Standards and Best Practices + +### PHP Coding Standards + +- Follow [WordPress PHP Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/) +- Use tabs for indentation, not spaces +- Use proper naming conventions: + - Class names: `Class_Name` + - Function names: `function_name` + - Variable names: `$variable_name` + +### JavaScript Coding Standards + +- Follow [WordPress JavaScript Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/javascript/) +- Use tabs for indentation, not spaces +- Use proper naming conventions: + - Function names: `functionName` + - Variable names: `variableName` + +### Internationalization (i18n) + +- Wrap all user-facing strings in appropriate translation functions: + - `__()` for simple strings + - `_e()` for echoed strings + - `esc_html__()` for escaped strings + - `esc_html_e()` for escaped and echoed strings +- Always use the plugin's text domain: `fix-plugin-does-not-exist-notices` + +### Security Best Practices + +- Validate and sanitize all input +- Escape all output +- Use nonces for form submissions +- Use capability checks for user actions + +## Feature Types and Implementation Guidelines + +### Admin Interface Features + +When adding features to the admin interface: + +- Use WordPress admin UI components for consistency +- Follow WordPress admin UI patterns +- Ensure accessibility compliance +- Add appropriate help text + +### Plugin Functionality Features + +When adding core functionality: + +- Ensure compatibility with WordPress hooks system +- Consider performance impact +- Maintain backward compatibility +- Add appropriate error handling + +### Integration Features + +When adding integration with other plugins or services: + +- Make integrations optional when possible +- Check if the integrated plugin/service is available before using it +- Provide fallback functionality when the integration is not available +- Document the integration requirements diff --git a/.github/ai-workflows/release-process.md b/.github/ai-workflows/release-process.md new file mode 100644 index 0000000..b91264c --- /dev/null +++ b/.github/ai-workflows/release-process.md @@ -0,0 +1,173 @@ +# Release Process for AI Assistants + +This document provides step-by-step instructions for AI assistants to help with the release process for the Fix Plugin Does Not Exist Notices plugin. + +## Pre-Release Checklist + +- [ ] All features for this release are complete +- [ ] All bug fixes for this release are complete +- [ ] CHANGELOG.md is up to date +- [ ] readme.txt is up to date +- [ ] All tests pass + +## Determining the New Version Number + +Based on the changes made, determine the appropriate version increment: + +1. **PATCH** (e.g., 1.6.0 → 1.6.1): For bug fixes and minor improvements +2. **MINOR** (e.g., 1.6.0 → 1.7.0): For new features and significant improvements +3. **MAJOR** (e.g., 1.6.0 → 2.0.0): For breaking changes + +## Release Steps + +### 1. Create a New Branch + +```bash +git checkout -b v{MAJOR}.{MINOR}.{PATCH} +``` + +Example: +```bash +git checkout -b v1.7.0 +``` + +### 2. Update Version Numbers + +Update the version number in the following files: + +#### a. Main Plugin File (fix-plugin-does-not-exist-notices.php) + +```php +/** + * Plugin Name: Fix 'Plugin file does not exist.' Notices + * Plugin URI: https://wordpress.org/plugins/fix-plugin-does-not-exist-notices/ + * Description: Adds missing plugins to the plugins list with a "Remove Reference" link so you can permanently clean up invalid plugin entries and remove error notices. + * Version: {MAJOR}.{MINOR}.{PATCH} + * ... + */ +``` + +Also update the FPDEN_VERSION constant: + +```php +define( 'FPDEN_VERSION', '{MAJOR}.{MINOR}.{PATCH}' ); +``` + +#### b. CHANGELOG.md + +Add a new section at the top of the CHANGELOG.md file: + +```markdown +## [{MAJOR}.{MINOR}.{PATCH}] - YYYY-MM-DD +### Added +- New feature 1 +- New feature 2 + +### Changed +- Change 1 +- Change 2 + +### Fixed +- Bug fix 1 +- Bug fix 2 +``` + +#### c. readme.txt + +Update the stable tag: + +``` +Stable tag: {MAJOR}.{MINOR}.{PATCH} +``` + +Add a new entry to the changelog section: + +``` += {MAJOR}.{MINOR}.{PATCH} = +* New feature 1 +* New feature 2 +* Change 1 +* Change 2 +* Fixed bug 1 +* Fixed bug 2 +``` + +Update the upgrade notice section: + +``` += {MAJOR}.{MINOR}.{PATCH} = +Brief description of the most important changes in this release +``` + +### 3. Commit Changes + +```bash +git add fix-plugin-does-not-exist-notices.php CHANGELOG.md readme.txt +git commit -m "Prepare release v{MAJOR}.{MINOR}.{PATCH}" +``` + +### 4. Push Branch to Remotes + +```bash +git push github HEAD:v{MAJOR}.{MINOR}.{PATCH} +git push gitea HEAD:v{MAJOR}.{MINOR}.{PATCH} +``` + +### 5. Create and Push Tag + +```bash +git tag -a v{MAJOR}.{MINOR}.{PATCH} -m "Release version {MAJOR}.{MINOR}.{PATCH}" +git push github refs/tags/v{MAJOR}.{MINOR}.{PATCH} +git push gitea refs/tags/v{MAJOR}.{MINOR}.{PATCH} +``` + +### 6. Monitor GitHub Actions + +Open the GitHub Actions page to monitor the build and deployment process: +https://github.com/wpallstars/fix-plugin-does-not-exist-notices/actions + +### 7. Verify Release + +- [ ] Check that the GitHub release was created successfully +- [ ] Verify that the plugin was deployed to WordPress.org +- [ ] Test the plugin from WordPress.org to ensure it works correctly + +## Rollback Procedure (If Needed) + +If issues are discovered after release: + +### 1. Create a Hotfix Branch + +```bash +git checkout v{MAJOR}.{MINOR}.{PATCH} +git checkout -b hotfix/v{MAJOR}.{MINOR}.{PATCH+1} +``` + +### 2. Fix the Issues + +Make the necessary changes to fix the issues. + +### 3. Update Version Numbers + +Increment the PATCH version and update all version numbers as described above. + +### 4. Commit and Push + +```bash +git add . +git commit -m "Fix issues in v{MAJOR}.{MINOR}.{PATCH}" +git push github HEAD:hotfix/v{MAJOR}.{MINOR}.{PATCH+1} +git push gitea HEAD:hotfix/v{MAJOR}.{MINOR}.{PATCH+1} +``` + +### 5. Create and Push Tag + +```bash +git tag -a v{MAJOR}.{MINOR}.{PATCH+1} -m "Hotfix release version {MAJOR}.{MINOR}.{PATCH+1}" +git push github refs/tags/v{MAJOR}.{MINOR}.{PATCH+1} +git push gitea refs/tags/v{MAJOR}.{MINOR}.{PATCH+1} +``` + +### 6. Monitor and Verify + +Follow steps 6 and 7 from the release process to monitor and verify the hotfix release. diff --git a/.gitignore b/.gitignore index d95bd35..1d64fdb 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,10 @@ bower_components/ composer.lock package-lock.json +# Composer +vendor/ +composer.phar + # Build files build/ dist/ @@ -76,4 +80,4 @@ codecov.yml webpack.config.js gulpfile.js Gruntfile.js -*.zip \ No newline at end of file +*.zip \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bc7fee..d85e798 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ All notable changes to this project will be documented in this file. +## [1.6.0] - 2024-05-15 +### Added +- Full translation support with POT file +- JavaScript localization for better multilingual support +- Plugin constants for improved code organization +- Git Updater support for updates from GitHub and Gitea + +### Changed +- Updated code to follow WordPress internationalization best practices +- Improved asset loading with version constants +- Smart update detection based on installation source + ## [1.5.0] - 2024-05-15 ### Added - Improved compatibility with WordPress 6.4 diff --git a/build.sh b/build.sh index 3f21f78..34fd1b0 100755 --- a/build.sh +++ b/build.sh @@ -18,6 +18,10 @@ ZIP_FILE="${PLUGIN_SLUG}-${VERSION}.zip" echo "Creating build directory..." mkdir -p $BUILD_DIR +# Install composer dependencies +echo "Installing composer dependencies..." +composer install --no-dev --optimize-autoloader + # Copy required files echo "Copying plugin files..." cp fix-plugin-does-not-exist-notices.php $BUILD_DIR/ @@ -25,6 +29,18 @@ cp readme.txt $BUILD_DIR/ cp LICENSE $BUILD_DIR/ cp README.md $BUILD_DIR/ cp CHANGELOG.md $BUILD_DIR/ +cp composer.json $BUILD_DIR/ + +# Copy directories +echo "Copying directories..." +mkdir -p $BUILD_DIR/includes +cp -r includes/* $BUILD_DIR/includes/ +mkdir -p $BUILD_DIR/languages +cp -r languages/* $BUILD_DIR/languages/ +mkdir -p $BUILD_DIR/assets +cp -r assets/* $BUILD_DIR/assets/ +mkdir -p $BUILD_DIR/vendor +cp -r vendor/* $BUILD_DIR/vendor/ # Create ZIP file echo "Creating ZIP file..." @@ -39,4 +55,4 @@ if [ -f "$ZIP_FILE" ]; then else echo "❌ Build failed: ZIP file was not created" exit 1 -fi \ No newline at end of file +fi \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..a37e57f --- /dev/null +++ b/composer.json @@ -0,0 +1,21 @@ +{ + "name": "wpallstars/fix-plugin-does-not-exist-notices", + "description": "Adds missing plugins to the plugins list with a 'Remove Reference' link so you can permanently clean up invalid plugin entries and remove error notices.", + "type": "wordpress-plugin", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Marcus Quinn", + "email": "6428977+marcusquinn@users.noreply.github.com" + } + ], + "require": { + "php": ">=7.0", + "afragen/git-updater-lite": "^1" + }, + "autoload": { + "psr-4": { + "WPAllStars\\FixPluginDoesNotExistNotices\\": "includes/" + } + } +} diff --git a/fix-plugin-does-not-exist-notices.php b/fix-plugin-does-not-exist-notices.php index c7f44ea..7c68295 100644 --- a/fix-plugin-does-not-exist-notices.php +++ b/fix-plugin-does-not-exist-notices.php @@ -9,8 +9,9 @@ * * @wordpress-plugin * Plugin Name: Fix 'Plugin file does not exist.' Notices + * Plugin URI: https://wordpress.org/plugins/fix-plugin-does-not-exist-notices/ * Description: Adds missing plugins to the plugins list with a "Remove Reference" link so you can permanently clean up invalid plugin entries and remove error notices. - * Version: 1.5.0 + * Version: 1.6.0 * Author: Marcus Quinn * Author URI: https://www.wpallstars.com * License: GPL-2.0+ @@ -19,6 +20,10 @@ * Domain Path: /languages * Requires at least: 5.0 * Requires PHP: 7.0 + * GitHub Plugin URI: wpallstars/fix-plugin-does-not-exist-notices + * GitHub Branch: main + * Gitea Plugin URI: wpallstars/fix-plugin-does-not-exist-notices + * Gitea Branch: main * * This plugin is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,6 +44,27 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } +// Define plugin constants +define( 'FPDEN_VERSION', '1.6.0' ); +define( 'FPDEN_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); +define( 'FPDEN_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); +define( 'FPDEN_PLUGIN_FILE', __FILE__ ); +define( 'FPDEN_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ); + +/** + * Load plugin text domain. + * + * @return void + */ +function fpden_load_textdomain() { + load_plugin_textdomain( + 'fix-plugin-does-not-exist-notices', + false, + dirname( plugin_basename( __FILE__ ) ) . '/languages/' + ); +} +add_action( 'plugins_loaded', 'fpden_load_textdomain' ); + /** * Main class for the plugin. */ @@ -82,28 +108,33 @@ class Fix_Plugin_Does_Not_Exist_Notices { return; // No missing plugins, no need for the special notice JS/CSS. } - $plugin_url = plugin_dir_url( __FILE__ ); - wp_enqueue_style( 'fpden-admin-styles', - $plugin_url . 'assets/css/admin-styles.css', + FPDEN_PLUGIN_URL . 'assets/css/admin-styles.css', array(), - filemtime( plugin_dir_path( __FILE__ ) . 'assets/css/admin-styles.css' ) // Versioning based on file modification time. + FPDEN_VERSION ); wp_enqueue_script( 'fpden-admin-scripts', - $plugin_url . 'assets/js/admin-scripts.js', + FPDEN_PLUGIN_URL . 'assets/js/admin-scripts.js', array( 'jquery' ), // Add dependencies if needed, e.g., jQuery. - filemtime( plugin_dir_path( __FILE__ ) . 'assets/js/admin-scripts.js' ), // Versioning. + FPDEN_VERSION, true // Load in footer. ); - // Optional: Pass localized data to script if needed. - // wp_localize_script('fpden-admin-scripts', 'fpdenData', array( - // 'ajax_url' => admin_url('admin-ajax.php'), - // 'nonce' => wp_create_nonce('fpden_ajax_nonce'), - // )); + // Add translation strings for JavaScript + wp_localize_script( + 'fpden-admin-scripts', + 'fpdenData', + array( + 'i18n' => array( + 'clickToScroll' => esc_html__( 'Click here to scroll to missing plugins', 'fix-plugin-does-not-exist-notices' ), + 'pluginMissing' => esc_html__( 'Plugin file missing', 'fix-plugin-does-not-exist-notices' ), + 'removeReference' => esc_html__( 'Remove Reference', 'fix-plugin-does-not-exist-notices' ), + ), + ) + ); } /** @@ -369,3 +400,14 @@ class Fix_Plugin_Does_Not_Exist_Notices { // Initialize the plugin class. new Fix_Plugin_Does_Not_Exist_Notices(); + +// Initialize the updater if composer autoload exists +$autoloader = __DIR__ . '/vendor/autoload.php'; +if (file_exists($autoloader)) { + require_once $autoloader; + + // Initialize the updater if the class exists + if (class_exists('\WPAllStars\FixPluginDoesNotExistNotices\Updater')) { + new \WPAllStars\FixPluginDoesNotExistNotices\Updater(__FILE__); + } +} diff --git a/includes/Updater.php b/includes/Updater.php new file mode 100644 index 0000000..655ac51 --- /dev/null +++ b/includes/Updater.php @@ -0,0 +1,152 @@ +plugin_file = $plugin_file; + $this->source = $this->determine_installation_source(); + $this->init(); + } + + /** + * Initialize the updater based on the installation source + * + * @return void + */ + public function init() { + // Only initialize Git Updater if not installed from WordPress.org + if ($this->source !== 'wordpress.org') { + $this->init_git_updater(); + } + } + + /** + * Determine the installation source of the plugin + * + * @return string Installation source: 'github', 'gitea', or 'wordpress.org' + */ + private function determine_installation_source() { + // Default to WordPress.org + $source = 'wordpress.org'; + + // Check if the plugin was installed from GitHub + if ($this->is_github_installation()) { + $source = 'github'; + } + // Check if the plugin was installed from Gitea + elseif ($this->is_gitea_installation()) { + $source = 'gitea'; + } + + return $source; + } + + /** + * Check if the plugin was installed from GitHub + * + * @return bool + */ + private function is_github_installation() { + // Check for GitHub-specific markers in the plugin directory + $plugin_dir = plugin_dir_path($this->plugin_file); + + // Look for .git directory with GitHub remote + if (file_exists($plugin_dir . '.git')) { + $git_config = @file_get_contents($plugin_dir . '.git/config'); + if ($git_config && strpos($git_config, 'github.com') !== false) { + return true; + } + } + + // Check for GitHub-specific files that might indicate it was downloaded from GitHub + if (file_exists($plugin_dir . '.github')) { + return true; + } + + return false; + } + + /** + * Check if the plugin was installed from Gitea + * + * @return bool + */ + private function is_gitea_installation() { + // Check for Gitea-specific markers in the plugin directory + $plugin_dir = plugin_dir_path($this->plugin_file); + + // Look for .git directory with Gitea remote + if (file_exists($plugin_dir . '.git')) { + $git_config = @file_get_contents($plugin_dir . '.git/config'); + if ($git_config && strpos($git_config, 'gitea.wpallstars.com') !== false) { + return true; + } + } + + return false; + } + + /** + * Initialize Git Updater Lite + * + * @return void + */ + private function init_git_updater() { + // Check if the Git Updater Lite class exists (composer autoload) + if (!class_exists('\\Fragen\\Git_Updater\\Lite')) { + // Try to include the autoloader + $autoloader = dirname($this->plugin_file) . '/vendor/autoload.php'; + if (file_exists($autoloader)) { + require_once $autoloader; + } else { + return; // Can't load Git Updater Lite + } + } + + // Set the update server based on the installation source + add_filter('gul_update_server', function() { + if ($this->source === 'github') { + return 'https://wpallstars.com'; // GitHub update server + } elseif ($this->source === 'gitea') { + return 'https://wpallstars.com'; // Gitea update server + } + return ''; + }); + + // Initialize Git Updater Lite + if (class_exists('\\Fragen\\Git_Updater\\Lite')) { + (new \Fragen\Git_Updater\Lite($this->plugin_file))->run(); + } + } +} diff --git a/languages/fix-plugin-does-not-exist-notices.pot b/languages/fix-plugin-does-not-exist-notices.pot new file mode 100644 index 0000000..886d262 --- /dev/null +++ b/languages/fix-plugin-does-not-exist-notices.pot @@ -0,0 +1,114 @@ +# Copyright (C) 2024 Marcus Quinn +# This file is distributed under the GPL-2.0+. +msgid "" +msgstr "" +"Project-Id-Version: Fix 'Plugin file does not exist.' Notices 1.6.0\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/fix-plugin-does-not-exist-notices\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2024-05-15T12:00:00+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.8.1\n" +"X-Domain: fix-plugin-does-not-exist-notices\n" + +#. Plugin Name of the plugin +msgid "Fix 'Plugin file does not exist.' Notices" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://wordpress.org/plugins/fix-plugin-does-not-exist-notices/" +msgstr "" + +#. Description of the plugin +msgid "Adds missing plugins to the plugins list with a \"Remove Reference\" link so you can permanently clean up invalid plugin entries and remove error notices." +msgstr "" + +#. Author of the plugin +msgid "Marcus Quinn" +msgstr "" + +#. Author URI of the plugin +msgid "https://www.wpallstars.com" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:127 +msgid "Click here to scroll to missing plugins" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:128 +msgid "Plugin file missing" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:129 +#: fix-plugin-does-not-exist-notices.php:205 +msgid "Remove Reference" +msgstr "" + +#. translators: %s: Path to wp-content/plugins +#: fix-plugin-does-not-exist-notices.php:161 +msgid "This plugin is still marked as \"Active\" in your database — but its folder and files can't be found in %s. Click \"Remove Reference\" to permanently remove it from your active plugins list and eliminate the error notice." +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:164 +msgid "N/A" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:168 +msgid "Missing" +msgstr "" + +#. translators: %s: Plugin file path +#: fix-plugin-does-not-exist-notices.php:204 +msgid "Remove reference to missing plugin %s" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:227 +msgid "You do not have sufficient permissions to perform this action." +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:233 +msgid "Invalid plugin specified." +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:308 +msgid "Plugin reference removed successfully." +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:316 +msgid "Failed to remove plugin reference. The plugin may already have been removed, or there was a database issue." +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:331 +msgid "Fix Plugin Does Not Exist Notices" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:333 +msgid "Missing plugin files detected:" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:334 +msgid "The plugins listed below with a" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:335 +msgid "File Missing" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:336 +msgid "tag no longer exist but are still referenced in your database." +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:339 +msgid "How to fix:" +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:340 +msgid "Click the \"Remove Reference\" link next to each missing plugin to safely remove it from your active plugins list." +msgstr "" + +#: fix-plugin-does-not-exist-notices.php:342 +msgid "This will clean up your database and remove the error notifications." +msgstr "" diff --git a/readme.txt b/readme.txt index 666d86f..c46860b 100644 --- a/readme.txt +++ b/readme.txt @@ -5,7 +5,7 @@ Tags: plugins, missing plugins, cleanup, error fix, admin tools, plugin file doe Requires at least: 5.0 Tested up to: 6.4 Requires PHP: 7.0 -Stable tag: 1.5.0 +Stable tag: 1.6.0 License: GPL-2.0+ License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -89,6 +89,15 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are == Changelog == += 1.6.0 = +* Added full translation support with POT file +* Added JavaScript localization for better multilingual support +* Added plugin constants for improved code organization +* Added Git Updater support for updates from GitHub and Gitea +* Updated code to follow WordPress internationalization best practices +* Improved asset loading with version constants +* Added smart update detection based on installation source + = 1.5.0 = * Improved compatibility with WordPress 6.4 * Enhanced error detection for plugin references @@ -161,6 +170,9 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are == Upgrade Notice == += 1.6.0 = +Added full translation support and Git Updater compatibility for direct updates from GitHub and Gitea! + = 1.5.0 = Improved compatibility with WordPress 6.4 and accessibility enhancements for screen readers!