Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
d353250fd9 | |||
ff0b330a3a | |||
e9a18de3d7 | |||
bfaa2b807a | |||
873ca5f272 | |||
24ff0f9552 | |||
515336aa2b | |||
10f6783cdb | |||
a58516367a | |||
569ef54904 | |||
e1d9160dae | |||
265bb38659 | |||
6b5267177f | |||
bae264f655 | |||
32cf7126e2 | |||
60c2115916 | |||
843f86be85 | |||
a4966ce897 | |||
0e09e70c90 | |||
0a98ba8c2e | |||
35534aa246 | |||
97901dfdfe | |||
ca94605ae8 | |||
7cc33a7284 | |||
e3319c4959 | |||
e7e831d8b5 | |||
ad3821d7aa | |||
84111171f4 | |||
9c557bc46d | |||
00052f0e1e | |||
0fa1e048ef | |||
3fdd02774c | |||
91e1da9d05 | |||
f3d3bbdd2b | |||
08616164e9 | |||
22d13ef8aa |
235
.ai-assistant.md
Normal file
235
.ai-assistant.md
Normal file
@ -0,0 +1,235 @@
|
||||
# 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. `README.md` (Update Changelog section to match readme.txt)
|
||||
5. Update `FPDEN_VERSION` constant in the main plugin file
|
||||
|
||||
**IMPORTANT**: Always ensure README.md is kept in sync with readme.txt for consistency across platforms.
|
||||
|
||||
## 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"
|
||||
|
||||
### Pre-Release Checklist
|
||||
|
||||
Before creating a new release, verify the following:
|
||||
|
||||
- [ ] Determine the correct version increment (MAJOR, MINOR, or PATCH) based on the changes
|
||||
- [ ] Ensure all changes are documented in CHANGELOG.md
|
||||
- [ ] Verify all code changes are tested and working correctly
|
||||
- [ ] Check that all files are properly formatted and follow WordPress coding standards
|
||||
- [ ] Ensure Git Updater configuration is correct (if applicable)
|
||||
|
||||
### 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:
|
||||
- `fix-plugin-does-not-exist-notices.php` (Plugin header)
|
||||
- `FPDEN_VERSION` constant in the main plugin file
|
||||
- `readme.txt` (Stable tag)
|
||||
- `README.md` (Ensure changelog is updated)
|
||||
- `languages/fix-plugin-does-not-exist-notices.pot` (Project-Id-Version)
|
||||
- Any other files that reference the version number
|
||||
3. Update CHANGELOG.md with all changes
|
||||
4. Update readme.txt changelog section
|
||||
5. Update README.md changelog section to match readme.txt
|
||||
6. Commit changes: `git commit -m "Prepare release v{MAJOR}.{MINOR}.{PATCH}"`
|
||||
7. Test changes locally on the version branch
|
||||
8. When satisfied with testing, merge to main:
|
||||
```
|
||||
git checkout main
|
||||
git merge v{MAJOR}.{MINOR}.{PATCH} --no-ff
|
||||
```
|
||||
9. Push main to all remotes:
|
||||
```
|
||||
git push github main
|
||||
git push gitea main
|
||||
```
|
||||
10. 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}
|
||||
```
|
||||
11. Verify the GitHub Actions workflow completes successfully
|
||||
|
||||
## 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 main
|
||||
git checkout -b v1.7.0
|
||||
|
||||
# 2. Update version numbers in ALL required files
|
||||
# - fix-plugin-does-not-exist-notices.php
|
||||
# - CHANGELOG.md
|
||||
# - readme.txt
|
||||
# - README.md
|
||||
# - languages/fix-plugin-does-not-exist-notices.pot
|
||||
# - FPDEN_VERSION constant
|
||||
|
||||
# 3. Commit changes
|
||||
git add .
|
||||
git commit -m "Prepare release v1.7.0"
|
||||
|
||||
# 4. Test changes locally on the version branch
|
||||
# (Run tests, verify functionality)
|
||||
|
||||
# 5. Merge to main when ready
|
||||
git checkout main
|
||||
git merge v1.7.0 --no-ff
|
||||
|
||||
# 6. Push main to remotes
|
||||
git push github main
|
||||
git push gitea main
|
||||
|
||||
# 7. 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 from main
|
||||
git checkout main
|
||||
git checkout -b feature/new-feature-name
|
||||
|
||||
# 2. Make changes and commit
|
||||
git add .
|
||||
git commit -m "Add new feature"
|
||||
|
||||
# 3. Test locally
|
||||
# (Run tests, verify functionality)
|
||||
|
||||
# 4. When ready for release, merge to a version branch
|
||||
git checkout -b v1.7.0
|
||||
git merge feature/new-feature-name --no-ff
|
||||
|
||||
# 5. Continue with the release process
|
||||
# (Update version numbers, etc.)
|
||||
```
|
||||
|
||||
### Fixing a Bug
|
||||
|
||||
```
|
||||
# 1. Create bugfix branch from main
|
||||
git checkout main
|
||||
git checkout -b fix/bug-description
|
||||
|
||||
# 2. Make changes and commit
|
||||
git add .
|
||||
git commit -m "Fix #123: Fix bug description"
|
||||
|
||||
# 3. Test locally
|
||||
# (Run tests, verify functionality)
|
||||
|
||||
# 4. When ready for release, merge to a version branch
|
||||
git checkout -b v1.6.5
|
||||
git merge fix/bug-description --no-ff
|
||||
|
||||
# 5. Continue with the release process
|
||||
# (Update version numbers, etc.)
|
||||
```
|
||||
|
||||
### Testing a Previous Version
|
||||
|
||||
```
|
||||
# Checkout a specific tag for testing
|
||||
git checkout v1.6.3
|
||||
|
||||
# Or create a test branch from a specific tag
|
||||
git checkout v1.6.3 -b test/some-feature
|
||||
```
|
195
.github/ai-workflows/bug-fixing.md
vendored
Normal file
195
.github/ai-workflows/bug-fixing.md
vendored
Normal file
@ -0,0 +1,195 @@
|
||||
# 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. Prepare for Release
|
||||
|
||||
When the bug fix is ready to be released:
|
||||
|
||||
1. Create a version branch for the release:
|
||||
|
||||
```bash
|
||||
git checkout -b v{MAJOR}.{MINOR}.{PATCH}
|
||||
```
|
||||
|
||||
2. Merge your bug fix branch into the version branch:
|
||||
|
||||
```bash
|
||||
git merge fix/bug-description --no-ff
|
||||
```
|
||||
|
||||
3. Update version numbers and changelog entries
|
||||
|
||||
4. Follow the standard release process from this point
|
||||
|
||||
### 8. Push to Remote (Optional for Collaboration)
|
||||
|
||||
If you need to collaborate with others on the bug fix before it's ready for release:
|
||||
|
||||
```bash
|
||||
git push github HEAD:fix/bug-description
|
||||
git push gitea HEAD:fix/bug-description
|
||||
```
|
||||
|
||||
### 9. Create Pull Request (Optional)
|
||||
|
||||
If the repository uses pull requests for code review, create a pull request from the bug fix branch to the version 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
|
||||
- **IMPORTANT**: Always increment the patch version for every change, even small ones, to make rollbacks easier if issues are found in testing
|
||||
- **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
|
||||
|
||||
## Testing Previous Versions
|
||||
|
||||
To test a previous version of the plugin:
|
||||
|
||||
```bash
|
||||
# Checkout a specific tag for testing
|
||||
git checkout v{MAJOR}.{MINOR}.{PATCH}
|
||||
|
||||
# Or create a test branch from a specific tag
|
||||
git checkout v{MAJOR}.{MINOR}.{PATCH} -b test/some-feature
|
||||
```
|
||||
|
||||
## 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
|
||||
- README.md
|
||||
- languages/fix-plugin-does-not-exist-notices.pot (Project-Id-Version)
|
||||
|
||||
### 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
|
163
.github/ai-workflows/code-review.md
vendored
Normal file
163
.github/ai-workflows/code-review.md
vendored
Normal file
@ -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.
|
||||
```
|
151
.github/ai-workflows/feature-development.md
vendored
Normal file
151
.github/ai-workflows/feature-development.md
vendored
Normal file
@ -0,0 +1,151 @@
|
||||
# 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
|
||||
- Remember that any feature addition will require a version increment in all relevant files
|
||||
|
||||
### 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. Prepare for Release
|
||||
|
||||
When the feature is ready to be released:
|
||||
|
||||
1. Create a version branch for the release:
|
||||
|
||||
```bash
|
||||
git checkout -b v{MAJOR}.{MINOR}.{PATCH}
|
||||
```
|
||||
|
||||
2. Merge your feature branch into the version branch:
|
||||
|
||||
```bash
|
||||
git merge feature/descriptive-name --no-ff
|
||||
```
|
||||
|
||||
3. Update version numbers and changelog entries
|
||||
|
||||
4. Follow the standard release process from this point
|
||||
|
||||
### 7. Push to Remote (Optional for Collaboration)
|
||||
|
||||
If you need to collaborate with others on the feature before it's ready for release:
|
||||
|
||||
```bash
|
||||
git push github HEAD:feature/descriptive-name
|
||||
git push gitea HEAD:feature/descriptive-name
|
||||
```
|
||||
|
||||
### 8. Create Pull Request (Optional)
|
||||
|
||||
If the repository uses pull requests for code review, create a pull request from the feature branch to the version 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
|
226
.github/ai-workflows/release-process.md
vendored
Normal file
226
.github/ai-workflows/release-process.md
vendored
Normal file
@ -0,0 +1,226 @@
|
||||
# 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
|
||||
- **IMPORTANT**: Always increment the patch version for every change, even small ones, to make rollbacks easier if issues are found in testing
|
||||
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. POT File (languages/fix-plugin-does-not-exist-notices.pot)
|
||||
|
||||
Update the Project-Id-Version and POT-Creation-Date:
|
||||
|
||||
```
|
||||
"Project-Id-Version: Fix 'Plugin file does not exist.' Notices {MAJOR}.{MINOR}.{PATCH}\n"
|
||||
"POT-Creation-Date: YYYY-MM-DDT00:00:00+00:00\n"
|
||||
```
|
||||
|
||||
#### d. 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 README.md languages/fix-plugin-does-not-exist-notices.pot
|
||||
git commit -m "Prepare release v{MAJOR}.{MINOR}.{PATCH}"
|
||||
```
|
||||
|
||||
### 4. Test Changes Locally
|
||||
|
||||
Test the changes thoroughly on the version branch to ensure everything works as expected:
|
||||
|
||||
- Test with the latest WordPress version
|
||||
- Test with PHP 7.0+ (minimum supported version)
|
||||
- Verify all features work as expected
|
||||
- Check for any PHP warnings or notices
|
||||
|
||||
### 5. Merge to Main
|
||||
|
||||
When satisfied with testing, merge the version branch to main:
|
||||
|
||||
```bash
|
||||
git checkout main
|
||||
git merge v{MAJOR}.{MINOR}.{PATCH} --no-ff
|
||||
```
|
||||
|
||||
The `--no-ff` flag creates a merge commit even if a fast-forward merge is possible, which helps preserve the branch history.
|
||||
|
||||
### 6. Push Main to Remotes
|
||||
|
||||
```bash
|
||||
git push github main
|
||||
git push gitea main
|
||||
```
|
||||
|
||||
### 7. 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}
|
||||
```
|
||||
|
||||
### 8. 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
|
||||
|
||||
### 9. 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
|
||||
|
||||
## Testing Previous Versions
|
||||
|
||||
To test a previous version of the plugin:
|
||||
|
||||
```bash
|
||||
# Checkout a specific tag for testing
|
||||
git checkout v{MAJOR}.{MINOR}.{PATCH}
|
||||
|
||||
# Or create a test branch from a specific tag
|
||||
git checkout v{MAJOR}.{MINOR}.{PATCH} -b test/some-feature
|
||||
```
|
||||
|
||||
## 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. Test the Hotfix
|
||||
|
||||
Test the hotfix thoroughly to ensure it resolves the issue without introducing new problems.
|
||||
|
||||
### 5. Commit Changes
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Fix issues in v{MAJOR}.{MINOR}.{PATCH}"
|
||||
```
|
||||
|
||||
### 6. Merge to Main
|
||||
|
||||
```bash
|
||||
git checkout main
|
||||
git merge hotfix/v{MAJOR}.{MINOR}.{PATCH+1} --no-ff
|
||||
git push github main
|
||||
git push gitea main
|
||||
```
|
||||
|
||||
### 7. 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}
|
||||
```
|
||||
|
||||
### 8. Monitor and Verify
|
||||
|
||||
Follow steps 8 and 9 from the release process to monitor and verify the hotfix release.
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -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
|
||||
*.zip
|
35
CHANGELOG.md
35
CHANGELOG.md
@ -2,15 +2,50 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [1.6.4] - 2024-05-16
|
||||
### Improved
|
||||
- Version management to ensure consistent patch version increments
|
||||
- Documentation for version update process
|
||||
- AI workflow files with detailed version increment instructions
|
||||
|
||||
## [1.6.3] - 2024-05-15
|
||||
### Fixed
|
||||
- Git Updater repository URLs to use full repository paths
|
||||
- Update URI configuration for proper update detection
|
||||
- Version management following semantic versioning
|
||||
|
||||
### Changed
|
||||
- Updated organization name from 'WP All Stars' to 'WP ALLSTARS'
|
||||
- Updated namespace from 'WPAllStars' to 'WPALLSTARS'
|
||||
|
||||
## [1.6.2] - 2024-05-15
|
||||
### Changed
|
||||
- Updated POT file version for consistency
|
||||
- Improved JavaScript localization with proper fallbacks
|
||||
- Enhanced code quality for WordPress.org submission
|
||||
### Added
|
||||
- Git Updater configuration with Update URI
|
||||
- Update server URL configuration
|
||||
|
||||
## [1.6.1] - 2024-05-15
|
||||
### Added
|
||||
- AI assistant guide and workflow documentation
|
||||
- Detailed release process documentation
|
||||
- Feature development guidelines
|
||||
- Bug fixing procedures
|
||||
- Code review standards
|
||||
|
||||
## [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
|
||||
|
124
README.md
124
README.md
@ -120,35 +120,109 @@ The plugin works by:
|
||||
|
||||
## Changelog
|
||||
|
||||
### 1.4.1
|
||||
- Added FAQ about keeping the plugin installed after notices are cleared
|
||||
### 1.6.13
|
||||
* Code cleanup and optimization
|
||||
* Improved Git Updater integration
|
||||
* Fixed author display in plugin information
|
||||
* Ensured compatibility with WordPress 6.4
|
||||
|
||||
### 1.4.0
|
||||
- Updated plugin name and text domain
|
||||
- Repository rename from plugin-reference-cleaner to fix-plugin-does-not-exist-notices
|
||||
### 1.6.12
|
||||
* Added WP ALLSTARS as a co-author
|
||||
* Updated author information and links
|
||||
* Added author websites to plugin description
|
||||
* Fixed issue with multiple author URLs
|
||||
|
||||
### 1.3.3
|
||||
* Improved notification placement next to WordPress error messages
|
||||
* Added "Click here to scroll" button that automatically locates missing plugins
|
||||
* Enhanced reliability with multiple injection methods
|
||||
* Added visual arrow pointing from notification to error message
|
||||
### 1.6.11
|
||||
* CRITICAL FIX: Completely removed auto-deactivation prevention code that was causing fatal errors
|
||||
* Simplified plugin functionality to focus on core features only
|
||||
* Improved compatibility with various WordPress configurations
|
||||
* Ensured plugin works correctly when other plugins are deleted
|
||||
|
||||
### 1.3.2
|
||||
* Added prominent notification directly below WordPress error messages
|
||||
* Improved user guidance with visual cues to connect error and solution
|
||||
* Added eye-catching styling to help users understand how to fix errors
|
||||
### 1.6.10
|
||||
* Fixed critical error that could occur when a plugin folder is deleted
|
||||
* Improved error handling with try/catch blocks
|
||||
* Added more specific checks for the plugins page
|
||||
* Enhanced compatibility with various WordPress configurations
|
||||
* Made the code more defensive to prevent potential issues
|
||||
|
||||
### 1.3.1
|
||||
* Added instructional notification explaining how to use the plugin
|
||||
* Improved user guidance with step-by-step instructions
|
||||
* Enhanced visual identification of missing plugins
|
||||
### 1.6.9
|
||||
* Fixed issue with notices not appearing below WordPress error messages
|
||||
* Improved JavaScript detection of WordPress error notices
|
||||
* Prevented WordPress from automatically clearing error notices on page refresh
|
||||
* Added multiple timing attempts to ensure notices appear correctly
|
||||
* Enhanced error notice targeting for better compatibility
|
||||
|
||||
### 1.3.0
|
||||
* Complete redesign for maximum compatibility with all WordPress themes
|
||||
* Now adds missing plugins directly to the plugins list table
|
||||
* Uses standard WordPress admin UI patterns instead of DOM manipulation
|
||||
* Added "Remove Reference" action link in the plugins list
|
||||
* Significantly improved reliability across all WordPress configurations
|
||||
### 1.6.8
|
||||
* Fixed notice positioning to appear directly below WordPress error messages
|
||||
* Improved notice width to match WordPress error messages
|
||||
* Updated explanatory text for better clarity
|
||||
* Fixed issue with notices not appearing in some cases
|
||||
* Improved JavaScript detection of WordPress error messages
|
||||
|
||||
### 1.6.7
|
||||
* Fixed duplicate notices issue by removing PHP-generated notice
|
||||
* Simplified notice system to only show one notice below WordPress error
|
||||
* Ensured consistent terminology with "Remove Notice" text
|
||||
* Optimized plugin detection with caching to improve performance
|
||||
* Fixed JavaScript to correctly handle multiple error messages
|
||||
|
||||
### 1.6.6
|
||||
* Fixed issue with "Remove Notice" link not appearing on missing plugin rows
|
||||
* Fixed issue with automatic removal of plugin references without user action
|
||||
* Fixed notice positioning to ensure it appears below error messages
|
||||
* Restored pointer triangle to indicate relationship with error message
|
||||
* Improved detection of missing plugins in the plugin list
|
||||
* Enhanced scroll functionality to work with all plugin types
|
||||
|
||||
### 1.6.5
|
||||
* Fixed duplicate notices issue - now only one notice appears below error messages
|
||||
* Changed notice heading to "Fix Plugin Does Not Exist Notices ☝️"
|
||||
* Updated explanatory text to be more clear about the removal process
|
||||
* Changed "Remove Reference" link text to "Remove Notice" for better clarity
|
||||
* Made "(File Missing)" text bold and red for better visibility
|
||||
* Fixed scroll functionality to work with all plugin rows
|
||||
* Improved JavaScript to prevent multiple notices from appearing
|
||||
|
||||
### 1.6.4
|
||||
* Updated version management to ensure consistent patch version increments
|
||||
* Improved documentation for version update process
|
||||
* Enhanced AI workflow files with detailed version increment instructions
|
||||
|
||||
### 1.6.3
|
||||
* Fixed Git Updater repository URLs to use full repository paths
|
||||
* Corrected Update URI configuration for proper update detection
|
||||
* Improved version management following semantic versioning
|
||||
* Updated organization name from 'WP All Stars' to 'WP ALLSTARS'
|
||||
* Updated namespace from 'WPAllStars' to 'WPALLSTARS'
|
||||
|
||||
### 1.6.2
|
||||
* Updated POT file version for consistency
|
||||
* Improved JavaScript localization with proper fallbacks
|
||||
* Enhanced code quality for WordPress.org submission
|
||||
* Added Git Updater configuration with Update URI
|
||||
* Added update server URL configuration
|
||||
|
||||
### 1.6.1
|
||||
* Added AI assistant guide and workflow documentation
|
||||
* Added detailed release process documentation
|
||||
* Added feature development guidelines
|
||||
* Added bug fixing procedures
|
||||
* Added code review standards
|
||||
|
||||
### 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
|
||||
* Minor UI improvements for better visibility
|
||||
* Accessibility enhancements for screen readers
|
||||
|
||||
[View full changelog](CHANGELOG.md)
|
||||
|
||||
@ -158,4 +232,4 @@ This project is licensed under the GPL-2.0+ License - see the [LICENSE](LICENSE)
|
||||
|
||||
## Support
|
||||
|
||||
For support, please visit [WP All Stars](https://www.wpallstars.com).
|
||||
For support, please visit [WP ALLSTARS](https://www.wpallstars.com).
|
@ -5,6 +5,9 @@
|
||||
margin: 5px 0 15px;
|
||||
font-size: 14px;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
max-width: none;
|
||||
}
|
||||
.prc-notice h3 {
|
||||
margin-top: 0;
|
||||
@ -23,6 +26,13 @@
|
||||
}
|
||||
|
||||
/* Style for highlighting the missing plugin row */
|
||||
tr.inactive.prc-highlight-missing {
|
||||
tr.inactive.prc-highlight-missing,
|
||||
tr.active.prc-highlight-missing {
|
||||
background-color: #fff8e5 !important; /* Use !important to override default styles */
|
||||
}
|
||||
|
||||
/* Make File Missing text bold and red */
|
||||
span.error {
|
||||
font-weight: bold !important;
|
||||
color: #dc3232 !important;
|
||||
}
|
||||
|
@ -1,59 +1,105 @@
|
||||
(function() {
|
||||
// Track if we've already added our notice
|
||||
var noticeAdded = false;
|
||||
|
||||
// Function to inject our notice
|
||||
function injectNotice() {
|
||||
// If we've already added a notice, don't add another one
|
||||
if (noticeAdded) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find all notification containers first
|
||||
var noticeContainers = document.querySelectorAll('.notice, .error, .updated');
|
||||
var noticeContainers = document.querySelectorAll('.notice, .error, .updated, div.error');
|
||||
var targetNotice = null;
|
||||
|
||||
// Find all error notifications about missing plugins
|
||||
noticeContainers.forEach(function(notice) {
|
||||
if (notice.textContent.includes('Plugin file does not exist') ||
|
||||
notice.textContent.includes('has been deactivated due to an error')) {
|
||||
|
||||
// Check if we already added our notice
|
||||
if (notice.nextElementSibling && notice.nextElementSibling.classList.contains('prc-notice')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create our custom notice
|
||||
var ourNotice = document.createElement('div');
|
||||
ourNotice.className = 'prc-notice';
|
||||
|
||||
// Add content (using localized strings passed via wp_localize_script if needed, but simple for now)
|
||||
ourNotice.innerHTML = '<h3 style="margin-top:0;color:#826200;">👉 Fix Plugin Does Not Exist Notices Can Fix This</h3>' +
|
||||
'<p>To remove the above error notification, scroll down to find the plugin marked with "<strong style="color:red">(File Missing)</strong>" and click its "<strong>Remove Reference</strong>" link.</p>' +
|
||||
'<p>This will permanently remove the missing plugin reference from your database.</p>' +
|
||||
'<p><a href="#" id="prc-scroll-to-plugin" style="font-weight:bold;text-decoration:underline;color:#826200;">Click here to scroll to the missing plugin</a></p>';
|
||||
|
||||
// Insert our notice right after the error
|
||||
notice.parentNode.insertBefore(ourNotice, notice.nextSibling);
|
||||
|
||||
// Add scroll behavior
|
||||
var scrollLink = document.getElementById('prc-scroll-to-plugin');
|
||||
if (scrollLink) {
|
||||
scrollLink.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
var missingPlugins = document.querySelectorAll('tr.inactive:not(.plugin-update-tr)');
|
||||
for (var i = 0; i < missingPlugins.length; i++) {
|
||||
if (missingPlugins[i].textContent.includes('(File Missing)')) {
|
||||
// Add a class for highlighting instead of direct style manipulation
|
||||
missingPlugins[i].classList.add('prc-highlight-missing');
|
||||
missingPlugins[i].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
// Optional: Remove highlight after a delay
|
||||
setTimeout(function() {
|
||||
missingPlugins[i].classList.remove('prc-highlight-missing');
|
||||
}, 3000); // Remove highlight after 3 seconds
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if ((notice.textContent.includes('Plugin file does not exist') ||
|
||||
notice.textContent.includes('has been deactivated due to an error')) &&
|
||||
(notice.classList.contains('error') || notice.classList.contains('notice-error'))) {
|
||||
// We'll use the last matching notice as our target
|
||||
targetNotice = notice;
|
||||
console.log('Found WordPress error notice:', notice.textContent);
|
||||
}
|
||||
});
|
||||
|
||||
// If we didn't find a specific error notice, look for the general WordPress error at the top
|
||||
if (!targetNotice) {
|
||||
// Try to find the WordPress error message at the top of the page
|
||||
var wpError = document.querySelector('.error:not(.below-h2), div.error:not(.below-h2), .notice-error:not(.below-h2)');
|
||||
if (wpError) {
|
||||
targetNotice = wpError;
|
||||
console.log('Found general WordPress error notice');
|
||||
}
|
||||
}
|
||||
|
||||
// If we found a target notice, add our custom notice after it
|
||||
if (targetNotice) {
|
||||
// Check if we already added our notice
|
||||
if (targetNotice.nextElementSibling && targetNotice.nextElementSibling.classList.contains('prc-notice')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create our custom notice
|
||||
var ourNotice = document.createElement('div');
|
||||
ourNotice.className = 'prc-notice';
|
||||
|
||||
// Add content using localized strings passed via wp_localize_script
|
||||
var pluginMissingText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.pluginMissing ?
|
||||
fpdenData.i18n.pluginMissing : 'File Missing';
|
||||
var removeNoticeText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.removeNotice ?
|
||||
fpdenData.i18n.removeNotice : 'Remove Notice';
|
||||
var clickToScrollText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.clickToScroll ?
|
||||
fpdenData.i18n.clickToScroll : 'Click here to scroll to and highlight missing plugins';
|
||||
|
||||
ourNotice.innerHTML = '<h3 style="margin-top:0;color:#826200;">Fix Plugin Does Not Exist Notices 👆</h3>' +
|
||||
'<p>To remove these notices, scroll down to each plugin\'s name.php row, followed by: "<strong style="color:red">(' + pluginMissingText + ')</strong>". Then, click the "<strong>' + removeNoticeText + '</strong>" link for that plugin.</p>' +
|
||||
'<p>This safely removes the missing active plugin reference from your database.</p>' +
|
||||
'<p>Calls the standard WordPress function to update your active plugin options table, leaving only the remaining plugins installed and active.</p>' +
|
||||
'<p><a href="#" id="prc-scroll-to-plugin" style="font-weight:bold;text-decoration:underline;color:#826200;">' + clickToScrollText + '</a></p>';
|
||||
|
||||
// Insert our notice right after the error
|
||||
targetNotice.parentNode.insertBefore(ourNotice, targetNotice.nextSibling);
|
||||
|
||||
// Make sure our notice has the same width as the WordPress error notice
|
||||
ourNotice.style.width = targetNotice.offsetWidth + 'px';
|
||||
ourNotice.style.maxWidth = '100%';
|
||||
ourNotice.style.boxSizing = 'border-box';
|
||||
|
||||
// Mark that we've added our notice
|
||||
noticeAdded = true;
|
||||
|
||||
// Add scroll behavior
|
||||
var scrollLink = document.getElementById('prc-scroll-to-plugin');
|
||||
if (scrollLink) {
|
||||
scrollLink.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
// Look for all plugin rows, not just inactive ones
|
||||
var allPluginRows = document.querySelectorAll('tr.active, tr.inactive');
|
||||
for (var i = 0; i < allPluginRows.length; i++) {
|
||||
if (allPluginRows[i].textContent.includes('(File Missing)')) {
|
||||
// Add a class for highlighting instead of direct style manipulation
|
||||
allPluginRows[i].classList.add('prc-highlight-missing');
|
||||
allPluginRows[i].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
// Optional: Remove highlight after a delay
|
||||
(function(row) {
|
||||
setTimeout(function() {
|
||||
row.classList.remove('prc-highlight-missing');
|
||||
}, 3000); // Remove highlight after 3 seconds
|
||||
})(allPluginRows[i]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Try to inject notices on multiple events to ensure it works
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
injectNotice();
|
||||
// Delay the initial injection to ensure WordPress has fully loaded its notices
|
||||
setTimeout(injectNotice, 100);
|
||||
|
||||
// Also set up a MutationObserver to watch for dynamically added notices
|
||||
var observer = new MutationObserver(function(mutations) {
|
||||
@ -61,8 +107,8 @@
|
||||
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
|
||||
// Check if added nodes are notices or contain notices
|
||||
mutation.addedNodes.forEach(function(node) {
|
||||
if (node.nodeType === 1 && (node.matches('.notice, .error, .updated') || node.querySelector('.notice, .error, .updated'))) {
|
||||
injectNotice();
|
||||
if (node.nodeType === 1 && (node.matches('.notice, .error, .updated, div.error') || node.querySelector('.notice, .error, .updated, div.error'))) {
|
||||
setTimeout(injectNotice, 50); // Small delay to ensure the DOM is updated
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -78,4 +124,9 @@
|
||||
setTimeout(injectNotice, 500); // Delay slightly to ensure dynamic content is loaded
|
||||
});
|
||||
|
||||
// Additional attempt after a longer delay to catch late-loading notices
|
||||
window.addEventListener('load', function() {
|
||||
setTimeout(injectNotice, 1000); // Longer delay as final attempt
|
||||
});
|
||||
|
||||
})();
|
||||
|
18
build.sh
18
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
|
||||
fi
|
21
composer.json
Normal file
21
composer.json
Normal file
@ -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/"
|
||||
}
|
||||
}
|
||||
}
|
@ -4,14 +4,17 @@
|
||||
*
|
||||
* @package FixPluginDoesNotExistNotices
|
||||
* @author Marcus Quinn
|
||||
* @copyright 2023 WP All Stars
|
||||
* @copyright 2023 WP ALLSTARS
|
||||
* @license GPL-2.0+
|
||||
* @noinspection PhpUndefinedFunctionInspection
|
||||
* @noinspection PhpUndefinedConstantInspection
|
||||
*
|
||||
* @wordpress-plugin
|
||||
* Plugin Name: Fix 'Plugin file 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.6.0
|
||||
* Author: Marcus Quinn
|
||||
* 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. By Marcus Quinn (marcusquinn.com) & WP ALLSTARS (wpallstars.com).
|
||||
* Version: 1.6.13
|
||||
* Author: Marcus Quinn & WP ALLSTARS
|
||||
* Author URI: https://www.wpallstars.com
|
||||
* License: GPL-2.0+
|
||||
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
||||
@ -19,6 +22,11 @@
|
||||
* Domain Path: /languages
|
||||
* Requires at least: 5.0
|
||||
* Requires PHP: 7.0
|
||||
* Update URI: https://git-updater.wpallstars.com
|
||||
* 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
|
||||
@ -40,7 +48,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||
}
|
||||
|
||||
// Define plugin constants
|
||||
define( 'FPDEN_VERSION', '1.6.0' );
|
||||
define( 'FPDEN_VERSION', '1.6.13' );
|
||||
define( 'FPDEN_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
||||
define( 'FPDEN_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
||||
define( 'FPDEN_PLUGIN_FILE', __FILE__ );
|
||||
@ -65,6 +73,13 @@ add_action( 'plugins_loaded', 'fpden_load_textdomain' );
|
||||
*/
|
||||
class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
|
||||
/**
|
||||
* Cached list of invalid plugins.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $invalid_plugins = null;
|
||||
|
||||
/**
|
||||
* Constructor. Hooks into WordPress actions and filters.
|
||||
*/
|
||||
@ -83,6 +98,9 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
|
||||
// Enqueue admin scripts and styles.
|
||||
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) );
|
||||
|
||||
// We're no longer trying to prevent WordPress from auto-deactivating plugins
|
||||
// as it was causing critical errors in some environments
|
||||
}
|
||||
|
||||
/**
|
||||
@ -125,8 +143,8 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
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' ),
|
||||
'pluginMissing' => esc_html__( 'File Missing', 'fix-plugin-does-not-exist-notices' ),
|
||||
'removeNotice' => esc_html__( 'Remove Notice', 'fix-plugin-does-not-exist-notices' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
@ -158,7 +176,7 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
'Name' => $plugin_name . ' <span class="error">(File Missing)</span>',
|
||||
/* translators: %s: Path to wp-content/plugins */
|
||||
'Description' => sprintf(
|
||||
__( '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.', 'fix-plugin-does-not-exist-notices' ),
|
||||
__( 'This plugin is still marked as "Active" in your database — but its folder and files can\'t be found in %s. Click "Remove Notice" to permanently remove it from your active plugins list and eliminate the error notice.', 'fix-plugin-does-not-exist-notices' ),
|
||||
'<code>/wp-content/plugins/</code>'
|
||||
),
|
||||
'Version' => __( 'N/A', 'fix-plugin-does-not-exist-notices' ),
|
||||
@ -175,16 +193,17 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the Remove Reference action link to invalid plugins.
|
||||
* Add the Remove Notice action link to invalid plugins.
|
||||
*
|
||||
* Filters the action links displayed for each plugin on the plugins page.
|
||||
* Adds a "Remove Reference" link for plugins identified as missing.
|
||||
* Adds a "Remove Notice" link for plugins identified as missing.
|
||||
*
|
||||
* @param array $actions An array of plugin action links.
|
||||
* @param string $plugin_file Path to the plugin file relative to the plugins directory.
|
||||
* @param array $plugin_data An array of plugin data.
|
||||
* @param string $context The plugin context (e.g., 'all', 'active', 'inactive').
|
||||
* @return array The potentially modified array of plugin action links.
|
||||
* @noinspection PhpUnusedParameterInspection
|
||||
*/
|
||||
public function add_remove_reference_action( $actions, $plugin_file, $plugin_data, $context ) {
|
||||
// Only run on the plugins page.
|
||||
@ -192,8 +211,11 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
return $actions;
|
||||
}
|
||||
|
||||
// Check if this is a missing plugin identified by our previous filter.
|
||||
if ( isset( $plugin_data['Name'] ) && strpos( $plugin_data['Name'], '<span class="error">(File Missing)</span>' ) !== false ) {
|
||||
// Get our list of invalid plugins
|
||||
$invalid_plugins = $this->get_invalid_plugins();
|
||||
|
||||
// Check if this plugin file is in our list of invalid plugins
|
||||
if ( in_array( $plugin_file, $invalid_plugins, true ) ) {
|
||||
// Clear existing actions like "Activate", "Deactivate", "Edit".
|
||||
$actions = array();
|
||||
|
||||
@ -202,7 +224,7 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
$remove_url = admin_url( 'plugins.php?action=remove_reference&plugin=' . urlencode( $plugin_file ) . '&_wpnonce=' . $nonce );
|
||||
/* translators: %s: Plugin file path */
|
||||
$aria_label = sprintf( __( 'Remove reference to missing plugin %s', 'fix-plugin-does-not-exist-notices' ), esc_attr( $plugin_file ) );
|
||||
$actions['remove_reference'] = '<a href="' . esc_url( $remove_url ) . '" class="delete" aria-label="' . $aria_label . '">' . esc_html__( 'Remove Reference', 'fix-plugin-does-not-exist-notices' ) . '</a>';
|
||||
$actions['remove_reference'] = '<a href="' . esc_url( $remove_url ) . '" class="delete" aria-label="' . $aria_label . '">' . esc_html__( 'Remove Notice', 'fix-plugin-does-not-exist-notices' ) . '</a>';
|
||||
}
|
||||
|
||||
return $actions;
|
||||
@ -290,8 +312,9 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
/**
|
||||
* Display admin notices on the plugins page.
|
||||
*
|
||||
* Shows informational notices about missing plugins and feedback
|
||||
* messages after attempting to remove a reference.
|
||||
* Shows feedback messages after attempting to remove a reference.
|
||||
* The main informational notice is handled by JavaScript to position it
|
||||
* directly below the WordPress error message.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
@ -317,34 +340,8 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
// Get invalid plugins to display the main informational notice.
|
||||
// Note: We don't need to call get_invalid_plugins() again if enqueue_admin_assets already did,
|
||||
// but calling it here ensures the notice shows even if assets weren't enqueued (e.g., JS disabled).
|
||||
// Consider caching the result in a class property if performance is critical.
|
||||
$invalid_plugins = $this->get_invalid_plugins();
|
||||
|
||||
// Display the main informational notice if there are missing plugins.
|
||||
if ( ! empty( $invalid_plugins ) ) {
|
||||
?>
|
||||
<div class="notice notice-info is-dismissible">
|
||||
<h3><?php esc_html_e( 'Fix Plugin Does Not Exist Notices', 'fix-plugin-does-not-exist-notices' ); ?></h3>
|
||||
<p>
|
||||
<strong><?php esc_html_e( 'Missing plugin files detected:', 'fix-plugin-does-not-exist-notices' ); ?></strong>
|
||||
<?php esc_html_e( 'The plugins listed below with a', 'fix-plugin-does-not-exist-notices' ); ?>
|
||||
<span style="color:red;">(<?php esc_html_e( 'File Missing', 'fix-plugin-does-not-exist-notices' ); ?>)</span>
|
||||
<?php esc_html_e( 'tag no longer exist but are still referenced in your database.', 'fix-plugin-does-not-exist-notices' ); ?>
|
||||
</p>
|
||||
<p>
|
||||
<strong><?php esc_html_e( 'How to fix:', 'fix-plugin-does-not-exist-notices' ); ?></strong>
|
||||
<?php esc_html_e( 'Click the "Remove Reference" link next to each missing plugin to safely remove it from your active plugins list.', 'fix-plugin-does-not-exist-notices' ); ?>
|
||||
</p>
|
||||
<p><?php esc_html_e( 'This will clean up your database and remove the error notifications.', 'fix-plugin-does-not-exist-notices' ); ?></p>
|
||||
</div>
|
||||
<?php
|
||||
// The JavaScript enqueued by enqueue_admin_assets() will handle adding the contextual notice
|
||||
// near the actual WordPress error message.
|
||||
}
|
||||
// The main informational notice is now handled entirely by JavaScript
|
||||
// to position it directly below the WordPress error message.
|
||||
}
|
||||
|
||||
/**
|
||||
@ -363,11 +360,17 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
* Get a list of active plugin file paths that do not exist on the filesystem.
|
||||
*
|
||||
* Checks both single site and network active plugins based on the context.
|
||||
* Uses caching to avoid repeated filesystem checks.
|
||||
*
|
||||
* @return array An array of plugin file paths (relative to WP_PLUGIN_DIR) that are missing.
|
||||
*/
|
||||
private function get_invalid_plugins() {
|
||||
$invalid_plugins = array();
|
||||
// Return cached result if available
|
||||
if ( null !== $this->invalid_plugins ) {
|
||||
return $this->invalid_plugins;
|
||||
}
|
||||
|
||||
$this->invalid_plugins = array();
|
||||
$active_plugins = array();
|
||||
|
||||
// Determine which option to check based on context (Network Admin or single site).
|
||||
@ -385,13 +388,26 @@ class Fix_Plugin_Does_Not_Exist_Notices {
|
||||
$plugin_path = WP_PLUGIN_DIR . '/' . $plugin_file;
|
||||
// Use validate_file to prevent directory traversal issues, although less likely here.
|
||||
if ( validate_file( $plugin_file ) === 0 && ! file_exists( $plugin_path ) ) {
|
||||
$invalid_plugins[] = $plugin_file;
|
||||
$this->invalid_plugins[] = $plugin_file;
|
||||
}
|
||||
}
|
||||
|
||||
return $invalid_plugins;
|
||||
return $this->invalid_plugins;
|
||||
}
|
||||
|
||||
// We've removed the prevent_auto_deactivation method as it was causing critical errors
|
||||
} // End 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__);
|
||||
}
|
||||
}
|
||||
|
158
includes/Updater.php
Normal file
158
includes/Updater.php
Normal file
@ -0,0 +1,158 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugin Updater
|
||||
*
|
||||
* @package FixPluginDoesNotExistNotices
|
||||
* @noinspection PhpUndefinedFunctionInspection
|
||||
* @noinspection PhpUndefinedClassInspection
|
||||
*/
|
||||
|
||||
namespace WPALLSTARS\FixPluginDoesNotExistNotices;
|
||||
|
||||
/**
|
||||
* Class Updater
|
||||
*
|
||||
* Handles plugin updates from different sources based on installation origin.
|
||||
*/
|
||||
class Updater {
|
||||
|
||||
/**
|
||||
* Plugin file path
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $plugin_file;
|
||||
|
||||
/**
|
||||
* Installation source
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $source;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $plugin_file Main plugin file path.
|
||||
*/
|
||||
public function __construct($plugin_file) {
|
||||
$this->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
|
||||
* @noinspection PhpUndefinedFunctionInspection
|
||||
*/
|
||||
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
|
||||
* @noinspection PhpUndefinedFunctionInspection
|
||||
*/
|
||||
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
|
||||
* @noinspection PhpUndefinedFunctionInspection
|
||||
* @noinspection PhpUndefinedClassInspection
|
||||
*/
|
||||
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://github.com/wpallstars/fix-plugin-does-not-exist-notices'; // GitHub repository URL
|
||||
} elseif ($this->source === 'gitea') {
|
||||
return 'https://gitea.wpallstars.com/wpallstars/fix-plugin-does-not-exist-notices'; // Gitea repository URL
|
||||
}
|
||||
return '';
|
||||
});
|
||||
|
||||
// Initialize Git Updater Lite
|
||||
if (class_exists('\\Fragen\\Git_Updater\\Lite')) {
|
||||
(new \Fragen\Git_Updater\Lite($this->plugin_file))->run();
|
||||
}
|
||||
}
|
||||
}
|
@ -2,14 +2,14 @@
|
||||
# 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"
|
||||
"Project-Id-Version: Fix 'Plugin file does not exist.' Notices 1.6.13\n"
|
||||
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/fix-plugin-does-not-exist-notices\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\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"
|
||||
"POT-Creation-Date: 2024-05-16T12: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"
|
||||
|
119
readme.txt
119
readme.txt
@ -1,15 +1,15 @@
|
||||
=== Fix 'Plugin file does not exist.' Notices ===
|
||||
Contributors: marcusquinn
|
||||
Donate link: https://www.wpallstars.com
|
||||
Contributors: marcusquinn, wpallstars
|
||||
Donate link: https://www.marcusquinn.com
|
||||
Tags: plugins, missing plugins, cleanup, error fix, admin tools, plugin file does not exist
|
||||
Requires at least: 5.0
|
||||
Tested up to: 6.4
|
||||
Requires PHP: 7.0
|
||||
Stable tag: 1.6.0
|
||||
Stable tag: 1.6.13
|
||||
License: GPL-2.0+
|
||||
License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
Easily remove references to deleted plugins that cause "Plugin file does not exist" errors in your WordPress admin.
|
||||
Easily remove references to deleted plugins that cause "Plugin file does not exist" errors in your WordPress admin. By Marcus Quinn (marcusquinn.com) & WP ALLSTARS (wpallstars.com).
|
||||
|
||||
== Description ==
|
||||
|
||||
@ -89,12 +89,103 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are
|
||||
|
||||
== Changelog ==
|
||||
|
||||
= 1.6.13 =
|
||||
* Code cleanup and optimization
|
||||
* Improved Git Updater integration
|
||||
* Fixed author display in plugin information
|
||||
* Ensured compatibility with WordPress 6.4
|
||||
|
||||
= 1.6.12 =
|
||||
* Added WP ALLSTARS as a co-author
|
||||
* Updated author information and links
|
||||
* Added author websites to plugin description
|
||||
* Fixed issue with multiple author URLs
|
||||
|
||||
= 1.6.11 =
|
||||
* CRITICAL FIX: Completely removed auto-deactivation prevention code that was causing fatal errors
|
||||
* Simplified plugin functionality to focus on core features only
|
||||
* Improved compatibility with various WordPress configurations
|
||||
* Ensured plugin works correctly when other plugins are deleted
|
||||
|
||||
= 1.6.10 =
|
||||
* Fixed critical error that could occur when a plugin folder is deleted
|
||||
* Improved error handling with try/catch blocks
|
||||
* Added more specific checks for the plugins page
|
||||
* Enhanced compatibility with various WordPress configurations
|
||||
* Made the code more defensive to prevent potential issues
|
||||
|
||||
= 1.6.9 =
|
||||
* Fixed issue with notices not appearing below WordPress error messages
|
||||
* Improved JavaScript detection of WordPress error notices
|
||||
* Prevented WordPress from automatically clearing error notices on page refresh
|
||||
* Added multiple timing attempts to ensure notices appear correctly
|
||||
* Enhanced error notice targeting for better compatibility
|
||||
|
||||
= 1.6.8 =
|
||||
* Fixed notice positioning to appear directly below WordPress error messages
|
||||
* Improved notice width to match WordPress error messages
|
||||
* Updated explanatory text for better clarity
|
||||
* Fixed issue with notices not appearing in some cases
|
||||
* Improved JavaScript detection of WordPress error messages
|
||||
|
||||
= 1.6.7 =
|
||||
* Fixed duplicate notices issue by removing PHP-generated notice
|
||||
* Simplified notice system to only show one notice below WordPress error
|
||||
* Ensured consistent terminology with "Remove Notice" text
|
||||
* Optimized plugin detection with caching to improve performance
|
||||
* Fixed JavaScript to correctly handle multiple error messages
|
||||
|
||||
= 1.6.6 =
|
||||
* Fixed issue with "Remove Notice" link not appearing on missing plugin rows
|
||||
* Fixed issue with automatic removal of plugin references without user action
|
||||
* Fixed notice positioning to ensure it appears below error messages
|
||||
* Restored pointer triangle to indicate relationship with error message
|
||||
* Improved detection of missing plugins in the plugin list
|
||||
* Enhanced scroll functionality to work with all plugin types
|
||||
|
||||
= 1.6.5 =
|
||||
* Fixed duplicate notices issue - now only one notice appears below error messages
|
||||
* Changed notice heading to "Fix Plugin Does Not Exist Notices ☝️"
|
||||
* Updated explanatory text to be more clear about the removal process
|
||||
* Changed "Remove Reference" link text to "Remove Notice" for better clarity
|
||||
* Made "(File Missing)" text bold and red for better visibility
|
||||
* Fixed scroll functionality to work with all plugin rows
|
||||
* Improved JavaScript to prevent multiple notices from appearing
|
||||
|
||||
= 1.6.4 =
|
||||
* Updated version management to ensure consistent patch version increments
|
||||
* Improved documentation for version update process
|
||||
* Enhanced AI workflow files with detailed version increment instructions
|
||||
|
||||
= 1.6.3 =
|
||||
* Fixed Git Updater repository URLs to use full repository paths
|
||||
* Corrected Update URI configuration for proper update detection
|
||||
* Improved version management following semantic versioning
|
||||
* Updated organization name from 'WP All Stars' to 'WP ALLSTARS'
|
||||
* Updated namespace from 'WPAllStars' to 'WPALLSTARS'
|
||||
|
||||
= 1.6.2 =
|
||||
* Updated POT file version for consistency
|
||||
* Improved JavaScript localization with proper fallbacks
|
||||
* Enhanced code quality for WordPress.org submission
|
||||
* Added Git Updater configuration with Update URI
|
||||
* Added update server URL configuration
|
||||
|
||||
= 1.6.1 =
|
||||
* Added AI assistant guide and workflow documentation
|
||||
* Added detailed release process documentation
|
||||
* Added feature development guidelines
|
||||
* Added bug fixing procedures
|
||||
* Added code review standards
|
||||
|
||||
= 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
|
||||
@ -168,8 +259,26 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are
|
||||
|
||||
== Upgrade Notice ==
|
||||
|
||||
= 1.6.13 =
|
||||
Code cleanup, improved Git Updater integration, and ensured compatibility with WordPress 6.4.
|
||||
|
||||
= 1.6.12 =
|
||||
Added WP ALLSTARS as a co-author and updated author information.
|
||||
|
||||
= 1.6.11 =
|
||||
URGENT CRITICAL FIX: Completely removes code that was causing fatal errors. If you're experiencing the "critical error" message, this update will resolve it.
|
||||
|
||||
= 1.6.3 =
|
||||
Fixed Git Updater repository URLs and updated organization naming for consistent branding across all platforms!
|
||||
|
||||
= 1.6.2 =
|
||||
Improved JavaScript localization, enhanced code quality, and added Git Updater configuration for seamless updates!
|
||||
|
||||
= 1.6.1 =
|
||||
Added comprehensive AI assistant guide and workflow documentation for improved development processes!
|
||||
|
||||
= 1.6.0 =
|
||||
Added full translation support! The plugin can now be translated into any language.
|
||||
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!
|
||||
|
Reference in New Issue
Block a user