Compare commits
16 Commits
Author | SHA1 | Date | |
---|---|---|---|
a4966ce897 | |||
0e09e70c90 | |||
0a98ba8c2e | |||
35534aa246 | |||
97901dfdfe | |||
e3319c4959 | |||
e7e831d8b5 | |||
9c557bc46d | |||
0fa1e048ef | |||
91e1da9d05 | |||
08616164e9 | |||
22d13ef8aa | |||
322cada133 | |||
df344d76ae | |||
4014716da9 | |||
613c4f43b6 |
195
.ai-assistant.md
Normal file
195
.ai-assistant.md
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
# 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)
|
||||||
|
- 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. Push branch to all remotes:
|
||||||
|
```
|
||||||
|
git push github HEAD:v{MAJOR}.{MINOR}.{PATCH}
|
||||||
|
git push gitea HEAD:v{MAJOR}.{MINOR}.{PATCH}
|
||||||
|
```
|
||||||
|
8. 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}
|
||||||
|
```
|
||||||
|
9. 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 -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
|
||||||
|
# - 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
|
||||||
|
```
|
160
.github/ai-workflows/bug-fixing.md
vendored
Normal file
160
.github/ai-workflows/bug-fixing.md
vendored
Normal file
@ -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
|
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.
|
||||||
|
```
|
130
.github/ai-workflows/feature-development.md
vendored
Normal file
130
.github/ai-workflows/feature-development.md
vendored
Normal file
@ -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
|
173
.github/ai-workflows/release-process.md
vendored
Normal file
173
.github/ai-workflows/release-process.md
vendored
Normal file
@ -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.
|
1
.github/workflows/release.yml
vendored
1
.github/workflows/release.yml
vendored
@ -28,6 +28,7 @@ jobs:
|
|||||||
cp readme.txt build/fix-plugin-does-not-exist-notices/
|
cp readme.txt build/fix-plugin-does-not-exist-notices/
|
||||||
cp LICENSE build/fix-plugin-does-not-exist-notices/
|
cp LICENSE build/fix-plugin-does-not-exist-notices/
|
||||||
cp README.md build/fix-plugin-does-not-exist-notices/
|
cp README.md build/fix-plugin-does-not-exist-notices/
|
||||||
|
cp -r assets build/fix-plugin-does-not-exist-notices/
|
||||||
|
|
||||||
- name: Create ZIP file
|
- name: Create ZIP file
|
||||||
run: |
|
run: |
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -29,6 +29,10 @@ bower_components/
|
|||||||
composer.lock
|
composer.lock
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
|
||||||
|
# Composer
|
||||||
|
vendor/
|
||||||
|
composer.phar
|
||||||
|
|
||||||
# Build files
|
# Build files
|
||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
|
48
CHANGELOG.md
48
CHANGELOG.md
@ -2,6 +2,54 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [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
|
||||||
|
- Improved compatibility with WordPress 6.4
|
||||||
|
- Enhanced error detection for plugin references
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Minor UI improvements for better visibility
|
||||||
|
- Accessibility enhancements for screen readers
|
||||||
|
|
||||||
## [1.4.1] - 2023-11-30
|
## [1.4.1] - 2023-11-30
|
||||||
### Added
|
### Added
|
||||||
- FAQ about keeping the plugin installed after notices are cleared
|
- FAQ about keeping the plugin installed after notices are cleared
|
||||||
|
58
README.md
58
README.md
@ -120,35 +120,41 @@ The plugin works by:
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
### 1.4.1
|
### 1.6.3
|
||||||
- Added FAQ about keeping the plugin installed after notices are cleared
|
* 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.4.0
|
### 1.6.2
|
||||||
- Updated plugin name and text domain
|
* Updated POT file version for consistency
|
||||||
- Repository rename from plugin-reference-cleaner to fix-plugin-does-not-exist-notices
|
* 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.3.3
|
### 1.6.1
|
||||||
* Improved notification placement next to WordPress error messages
|
* Added AI assistant guide and workflow documentation
|
||||||
* Added "Click here to scroll" button that automatically locates missing plugins
|
* Added detailed release process documentation
|
||||||
* Enhanced reliability with multiple injection methods
|
* Added feature development guidelines
|
||||||
* Added visual arrow pointing from notification to error message
|
* Added bug fixing procedures
|
||||||
|
* Added code review standards
|
||||||
|
|
||||||
### 1.3.2
|
### 1.6.0
|
||||||
* Added prominent notification directly below WordPress error messages
|
* Added full translation support with POT file
|
||||||
* Improved user guidance with visual cues to connect error and solution
|
* Added JavaScript localization for better multilingual support
|
||||||
* Added eye-catching styling to help users understand how to fix errors
|
* 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.3.1
|
### 1.5.0
|
||||||
* Added instructional notification explaining how to use the plugin
|
* Improved compatibility with WordPress 6.4
|
||||||
* Improved user guidance with step-by-step instructions
|
* Enhanced error detection for plugin references
|
||||||
* Enhanced visual identification of missing plugins
|
* Minor UI improvements for better visibility
|
||||||
|
* Accessibility enhancements for screen readers
|
||||||
### 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
|
|
||||||
|
|
||||||
[View full changelog](CHANGELOG.md)
|
[View full changelog](CHANGELOG.md)
|
||||||
|
|
||||||
@ -158,4 +164,4 @@ This project is licensed under the GPL-2.0+ License - see the [LICENSE](LICENSE)
|
|||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
For support, please visit [WP All Stars](https://www.wpallstars.com).
|
For support, please visit [WP ALLSTARS](https://www.wpallstars.com).
|
28
assets/css/admin-styles.css
Normal file
28
assets/css/admin-styles.css
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
.prc-notice {
|
||||||
|
border-left: 4px solid #ffba00;
|
||||||
|
background-color: #fff8e5;
|
||||||
|
padding: 10px 12px;
|
||||||
|
margin: 5px 0 15px;
|
||||||
|
font-size: 14px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.prc-notice h3 {
|
||||||
|
margin-top: 0;
|
||||||
|
color: #826200;
|
||||||
|
}
|
||||||
|
.prc-notice::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: -10px;
|
||||||
|
left: 20px;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 10px solid transparent;
|
||||||
|
border-right: 10px solid transparent;
|
||||||
|
border-bottom: 10px solid #fff8e5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Style for highlighting the missing plugin row */
|
||||||
|
tr.inactive.prc-highlight-missing {
|
||||||
|
background-color: #fff8e5 !important; /* Use !important to override default styles */
|
||||||
|
}
|
88
assets/js/admin-scripts.js
Normal file
88
assets/js/admin-scripts.js
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
(function() {
|
||||||
|
// Function to inject our notice
|
||||||
|
function injectNotice() {
|
||||||
|
// Find all notification containers first
|
||||||
|
var noticeContainers = document.querySelectorAll('.notice, .error, .updated');
|
||||||
|
|
||||||
|
// 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
|
||||||
|
var pluginMissingText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.pluginMissing ?
|
||||||
|
fpdenData.i18n.pluginMissing : 'Plugin file missing';
|
||||||
|
var removeReferenceText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.removeReference ?
|
||||||
|
fpdenData.i18n.removeReference : 'Remove Reference';
|
||||||
|
var clickToScrollText = typeof fpdenData !== 'undefined' && fpdenData.i18n && fpdenData.i18n.clickToScroll ?
|
||||||
|
fpdenData.i18n.clickToScroll : 'Click here to scroll to missing plugins';
|
||||||
|
|
||||||
|
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">(' + pluginMissingText + ')</strong>" and click its "<strong>' + removeReferenceText + '</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;">' + clickToScrollText + '</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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to inject notices on multiple events to ensure it works
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
injectNotice();
|
||||||
|
|
||||||
|
// Also set up a MutationObserver to watch for dynamically added notices
|
||||||
|
var observer = new MutationObserver(function(mutations) {
|
||||||
|
mutations.forEach(function(mutation) {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start observing the body for changes in children
|
||||||
|
observer.observe(document.body, { childList: true, subtree: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
// Backup attempt with window.onload (less reliable than DOMContentLoaded but good fallback)
|
||||||
|
window.addEventListener('load', function() {
|
||||||
|
setTimeout(injectNotice, 500); // Delay slightly to ensure dynamic content is loaded
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
16
build.sh
16
build.sh
@ -18,6 +18,10 @@ ZIP_FILE="${PLUGIN_SLUG}-${VERSION}.zip"
|
|||||||
echo "Creating build directory..."
|
echo "Creating build directory..."
|
||||||
mkdir -p $BUILD_DIR
|
mkdir -p $BUILD_DIR
|
||||||
|
|
||||||
|
# Install composer dependencies
|
||||||
|
echo "Installing composer dependencies..."
|
||||||
|
composer install --no-dev --optimize-autoloader
|
||||||
|
|
||||||
# Copy required files
|
# Copy required files
|
||||||
echo "Copying plugin files..."
|
echo "Copying plugin files..."
|
||||||
cp fix-plugin-does-not-exist-notices.php $BUILD_DIR/
|
cp fix-plugin-does-not-exist-notices.php $BUILD_DIR/
|
||||||
@ -25,6 +29,18 @@ cp readme.txt $BUILD_DIR/
|
|||||||
cp LICENSE $BUILD_DIR/
|
cp LICENSE $BUILD_DIR/
|
||||||
cp README.md $BUILD_DIR/
|
cp README.md $BUILD_DIR/
|
||||||
cp CHANGELOG.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
|
# Create ZIP file
|
||||||
echo "Creating ZIP file..."
|
echo "Creating ZIP file..."
|
||||||
|
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,13 +4,16 @@
|
|||||||
*
|
*
|
||||||
* @package FixPluginDoesNotExistNotices
|
* @package FixPluginDoesNotExistNotices
|
||||||
* @author Marcus Quinn
|
* @author Marcus Quinn
|
||||||
* @copyright 2023 WP All Stars
|
* @copyright 2023 WP ALLSTARS
|
||||||
* @license GPL-2.0+
|
* @license GPL-2.0+
|
||||||
|
* @noinspection PhpUndefinedFunctionInspection
|
||||||
|
* @noinspection PhpUndefinedConstantInspection
|
||||||
*
|
*
|
||||||
* @wordpress-plugin
|
* @wordpress-plugin
|
||||||
* Plugin Name: Fix 'Plugin file does not exist.' Notices
|
* 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.
|
* 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.4.2
|
* Version: 1.6.3
|
||||||
* Author: Marcus Quinn
|
* Author: Marcus Quinn
|
||||||
* Author URI: https://www.wpallstars.com
|
* Author URI: https://www.wpallstars.com
|
||||||
* License: GPL-2.0+
|
* License: GPL-2.0+
|
||||||
@ -19,6 +22,11 @@
|
|||||||
* Domain Path: /languages
|
* Domain Path: /languages
|
||||||
* Requires at least: 5.0
|
* Requires at least: 5.0
|
||||||
* Requires PHP: 7.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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -34,310 +42,376 @@
|
|||||||
* along with this plugin. If not, see https://www.gnu.org/licenses/gpl-2.0.html.
|
* along with this plugin. If not, see https://www.gnu.org/licenses/gpl-2.0.html.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Exit if accessed directly
|
// Exit if accessed directly.
|
||||||
if (!defined('ABSPATH')) {
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Define plugin constants
|
||||||
|
define( 'FPDEN_VERSION', '1.6.3' );
|
||||||
|
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.
|
||||||
|
*/
|
||||||
class Fix_Plugin_Does_Not_Exist_Notices {
|
class Fix_Plugin_Does_Not_Exist_Notices {
|
||||||
public function __construct() {
|
|
||||||
// Add our plugin to the plugins list
|
|
||||||
add_filter('all_plugins', array($this, 'add_missing_plugins_references'));
|
|
||||||
|
|
||||||
// Add our action link to the plugins list
|
/**
|
||||||
add_filter('plugin_action_links', array($this, 'add_remove_reference_action'), 20, 4);
|
* Constructor. Hooks into WordPress actions and filters.
|
||||||
|
*/
|
||||||
|
public function __construct() {
|
||||||
|
// Add our plugin to the plugins list.
|
||||||
|
add_filter( 'all_plugins', array( $this, 'add_missing_plugins_references' ) );
|
||||||
|
|
||||||
// Handle the remove reference action
|
// Add our action link to the plugins list.
|
||||||
add_action('admin_init', array($this, 'handle_remove_reference'));
|
add_filter( 'plugin_action_links', array( $this, 'add_remove_reference_action' ), 20, 4 );
|
||||||
|
|
||||||
// Add admin notices for operation feedback
|
// Handle the remove reference action.
|
||||||
add_action('admin_notices', array($this, 'admin_notices'));
|
add_action( 'admin_init', array( $this, 'handle_remove_reference' ) );
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
// Add admin notices for operation feedback.
|
||||||
* Find and add invalid plugin references to the plugins list
|
add_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
||||||
*/
|
|
||||||
public function add_missing_plugins_references($plugins) {
|
|
||||||
// Only run on the plugins page
|
|
||||||
if (!$this->is_plugins_page()) {
|
|
||||||
return $plugins;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get active plugins that don't exist
|
// Enqueue admin scripts and styles.
|
||||||
$invalid_plugins = $this->get_invalid_plugins();
|
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) );
|
||||||
|
}
|
||||||
|
|
||||||
// Add each invalid plugin to the plugin list
|
/**
|
||||||
foreach ($invalid_plugins as $plugin_path) {
|
* Enqueue scripts and styles needed for the admin area.
|
||||||
if (!isset($plugins[$plugin_path])) {
|
*
|
||||||
$plugin_name = basename($plugin_path);
|
* @param string $hook_suffix The current admin page hook.
|
||||||
$plugins[$plugin_path] = array(
|
* @return void
|
||||||
'Name' => $plugin_name . ' <span class="error">(File Missing)</span>',
|
*/
|
||||||
'Description' => 'This plugin is still marked as "Active" in your database — but its folder and files can\'t be found in /wp-content/plugins/. Click "Remove Reference" to permanently remove it from your active plugins list and eliminate the error notice.',
|
public function enqueue_admin_assets( $hook_suffix ) {
|
||||||
'Version' => 'N/A',
|
// Only load on the plugins page.
|
||||||
'Author' => '',
|
if ( 'plugins.php' !== $hook_suffix ) {
|
||||||
'PluginURI' => '',
|
return;
|
||||||
'AuthorURI' => '',
|
}
|
||||||
'Title' => $plugin_name . ' (Missing)',
|
|
||||||
'AuthorName' => ''
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $plugins;
|
// Get invalid plugins to decide if assets are needed.
|
||||||
}
|
$invalid_plugins = $this->get_invalid_plugins();
|
||||||
|
if ( empty( $invalid_plugins ) ) {
|
||||||
|
return; // No missing plugins, no need for the special notice JS/CSS.
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
wp_enqueue_style(
|
||||||
* Add the Remove Reference action link to invalid plugins
|
'fpden-admin-styles',
|
||||||
*/
|
FPDEN_PLUGIN_URL . 'assets/css/admin-styles.css',
|
||||||
public function add_remove_reference_action($actions, $plugin_file, $plugin_data, $context) {
|
array(),
|
||||||
// Only run on the plugins page
|
FPDEN_VERSION
|
||||||
if (!$this->is_plugins_page()) {
|
);
|
||||||
return $actions;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if this is a missing plugin
|
wp_enqueue_script(
|
||||||
if (isset($plugin_data['Name']) && strpos($plugin_data['Name'], '<span class="error">(File Missing)</span>') !== false) {
|
'fpden-admin-scripts',
|
||||||
// Clear existing actions
|
FPDEN_PLUGIN_URL . 'assets/js/admin-scripts.js',
|
||||||
$actions = array();
|
array( 'jquery' ), // Add dependencies if needed, e.g., jQuery.
|
||||||
|
FPDEN_VERSION,
|
||||||
|
true // Load in footer.
|
||||||
|
);
|
||||||
|
|
||||||
// Add our action
|
// Add translation strings for JavaScript
|
||||||
$nonce = wp_create_nonce('remove_plugin_reference_' . $plugin_file);
|
wp_localize_script(
|
||||||
$remove_url = admin_url('plugins.php?action=remove_reference&plugin=' . urlencode($plugin_file) . '&_wpnonce=' . $nonce);
|
'fpden-admin-scripts',
|
||||||
$actions['remove_reference'] = '<a href="' . esc_url($remove_url) . '" class="delete" aria-label="' . esc_attr__('Remove Reference', 'fix-plugin-does-not-exist-notices') . '">Remove Reference</a>';
|
'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' ),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return $actions;
|
/**
|
||||||
}
|
* Find and add invalid plugin references to the plugins list.
|
||||||
|
*
|
||||||
|
* Filters the list of plugins displayed on the plugins page to include
|
||||||
|
* entries for active plugins whose files are missing.
|
||||||
|
*
|
||||||
|
* @param array $plugins An array of plugin data.
|
||||||
|
* @return array The potentially modified array of plugin data.
|
||||||
|
*/
|
||||||
|
public function add_missing_plugins_references( $plugins ) {
|
||||||
|
// Only run on the plugins page.
|
||||||
|
if ( ! $this->is_plugins_page() ) {
|
||||||
|
return $plugins;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
// Get active plugins that don't exist.
|
||||||
* Handle the remove reference action
|
$invalid_plugins = $this->get_invalid_plugins();
|
||||||
*/
|
|
||||||
public function handle_remove_reference() {
|
|
||||||
// Check if we're removing a reference
|
|
||||||
if (!isset($_GET['action']) || $_GET['action'] !== 'remove_reference' || !isset($_GET['plugin'])) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify permissions
|
// Add each invalid plugin to the plugin list.
|
||||||
if (!current_user_can('activate_plugins')) {
|
foreach ( $invalid_plugins as $plugin_path ) {
|
||||||
wp_die(__('You do not have sufficient permissions to perform this action.', 'fix-plugin-does-not-exist-notices'));
|
if ( ! isset( $plugins[ $plugin_path ] ) ) {
|
||||||
}
|
$plugin_name = basename( $plugin_path );
|
||||||
|
$plugins[ $plugin_path ] = array(
|
||||||
|
'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' ),
|
||||||
|
'<code>/wp-content/plugins/</code>'
|
||||||
|
),
|
||||||
|
'Version' => __( 'N/A', 'fix-plugin-does-not-exist-notices' ),
|
||||||
|
'Author' => '',
|
||||||
|
'PluginURI' => '',
|
||||||
|
'AuthorURI' => '',
|
||||||
|
'Title' => $plugin_name . ' (' . __( 'Missing', 'fix-plugin-does-not-exist-notices' ) . ')',
|
||||||
|
'AuthorName' => '',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get the plugin file
|
return $plugins;
|
||||||
$plugin_file = isset($_GET['plugin']) ? $_GET['plugin'] : '';
|
}
|
||||||
|
|
||||||
// Verify nonce
|
/**
|
||||||
check_admin_referer('remove_plugin_reference_' . $plugin_file);
|
* Add the Remove Reference 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.
|
||||||
|
*
|
||||||
|
* @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.
|
||||||
|
if ( ! $this->is_plugins_page() ) {
|
||||||
|
return $actions;
|
||||||
|
}
|
||||||
|
|
||||||
// Remove the plugin reference
|
// Check if this is a missing plugin identified by our previous filter.
|
||||||
$success = $this->remove_plugin_reference($plugin_file);
|
if ( isset( $plugin_data['Name'] ) && strpos( $plugin_data['Name'], '<span class="error">(File Missing)</span>' ) !== false ) {
|
||||||
|
// Clear existing actions like "Activate", "Deactivate", "Edit".
|
||||||
|
$actions = array();
|
||||||
|
|
||||||
// Redirect back to plugins page with a message
|
// Add our custom action.
|
||||||
$redirect = admin_url('plugins.php');
|
$nonce = wp_create_nonce( 'remove_plugin_reference_' . $plugin_file );
|
||||||
$redirect = add_query_arg($success ? 'reference_removed' : 'reference_removal_failed', '1', $redirect);
|
$remove_url = admin_url( 'plugins.php?action=remove_reference&plugin=' . urlencode( $plugin_file ) . '&_wpnonce=' . $nonce );
|
||||||
wp_redirect($redirect);
|
/* translators: %s: Plugin file path */
|
||||||
exit;
|
$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>';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
return $actions;
|
||||||
* Remove a plugin reference from the active plugins
|
}
|
||||||
*/
|
|
||||||
public function remove_plugin_reference($plugin_file) {
|
|
||||||
$success = false;
|
|
||||||
|
|
||||||
// Handle multisite network admin
|
/**
|
||||||
if (is_multisite() && is_network_admin()) {
|
* Handle the remove reference action triggered by the link.
|
||||||
$active_plugins = get_site_option('active_sitewide_plugins', array());
|
*
|
||||||
if (isset($active_plugins[$plugin_file])) {
|
* Checks for the correct action, verifies nonce and permissions,
|
||||||
unset($active_plugins[$plugin_file]);
|
* calls the removal function, and redirects back to the plugins page.
|
||||||
$success = update_site_option('active_sitewide_plugins', $active_plugins);
|
*
|
||||||
}
|
* @return void
|
||||||
}
|
*/
|
||||||
// Handle single site or multisite subsite
|
public function handle_remove_reference() {
|
||||||
else {
|
// Check if our specific action is being performed.
|
||||||
$active_plugins = get_option('active_plugins', array());
|
if ( ! isset( $_GET['action'] ) || 'remove_reference' !== $_GET['action'] || ! isset( $_GET['plugin'] ) ) {
|
||||||
$key = array_search($plugin_file, $active_plugins);
|
return;
|
||||||
if ($key !== false) {
|
}
|
||||||
unset($active_plugins[$key]);
|
|
||||||
$active_plugins = array_values($active_plugins); // Re-index array
|
|
||||||
$success = update_option('active_plugins', $active_plugins);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $success;
|
// Verify user permissions.
|
||||||
}
|
if ( ! current_user_can( 'activate_plugins' ) ) {
|
||||||
|
wp_die( esc_html__( 'You do not have sufficient permissions to perform this action.', 'fix-plugin-does-not-exist-notices' ) );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
// Sanitize and get the plugin file path.
|
||||||
* Display admin notices
|
$plugin_file = isset( $_GET['plugin'] ) ? sanitize_text_field( wp_unslash( $_GET['plugin'] ) ) : '';
|
||||||
*/
|
if ( empty( $plugin_file ) ) {
|
||||||
public function admin_notices() {
|
wp_die( esc_html__( 'Invalid plugin specified.', 'fix-plugin-does-not-exist-notices' ) );
|
||||||
// Only run on the plugins page
|
}
|
||||||
if (!$this->is_plugins_page()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get invalid plugins
|
// Verify nonce for security.
|
||||||
$invalid_plugins = $this->get_invalid_plugins();
|
check_admin_referer( 'remove_plugin_reference_' . $plugin_file );
|
||||||
|
|
||||||
// Create a highlighted notice immediately after WordPress error messages
|
// Attempt to remove the plugin reference.
|
||||||
if (!empty($invalid_plugins)) {
|
$success = $this->remove_plugin_reference( $plugin_file );
|
||||||
// Add a notice specifically targeting the WordPress error notification
|
|
||||||
// Use admin_head to ensure it runs early in the page load process
|
|
||||||
add_action('admin_head', function() use ($invalid_plugins) {
|
|
||||||
?>
|
|
||||||
<style type="text/css">
|
|
||||||
.prc-notice {
|
|
||||||
border-left: 4px solid #ffba00;
|
|
||||||
background-color: #fff8e5;
|
|
||||||
padding: 10px 12px;
|
|
||||||
margin: 5px 0 15px;
|
|
||||||
font-size: 14px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.prc-notice h3 {
|
|
||||||
margin-top: 0;
|
|
||||||
color: #826200;
|
|
||||||
}
|
|
||||||
.prc-notice::before {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
top: -10px;
|
|
||||||
left: 20px;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
border-left: 10px solid transparent;
|
|
||||||
border-right: 10px solid transparent;
|
|
||||||
border-bottom: 10px solid #fff8e5;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript">
|
|
||||||
// Function to inject our notice
|
|
||||||
function injectNotice() {
|
|
||||||
// Find all notification containers first
|
|
||||||
var noticeContainers = document.querySelectorAll('.notice, .error, .updated');
|
|
||||||
|
|
||||||
// Find all error notifications about missing plugins
|
// Prepare redirect URL with feedback query args.
|
||||||
noticeContainers.forEach(function(notice) {
|
$redirect_url = admin_url( 'plugins.php' );
|
||||||
if (notice.textContent.includes('Plugin file does not exist') ||
|
$redirect_url = add_query_arg( $success ? 'reference_removed' : 'reference_removal_failed', '1', $redirect_url );
|
||||||
notice.textContent.includes('has been deactivated due to an error')) {
|
|
||||||
|
|
||||||
// Check if we already added our notice
|
// Redirect and exit.
|
||||||
if (notice.nextElementSibling && notice.nextElementSibling.classList.contains('prc-notice')) {
|
wp_safe_redirect( $redirect_url );
|
||||||
return;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create our custom notice
|
/**
|
||||||
var ourNotice = document.createElement('div');
|
* Remove a plugin reference from the active plugins list in the database.
|
||||||
ourNotice.className = 'prc-notice';
|
*
|
||||||
|
* Handles both single site and multisite network activated plugins.
|
||||||
|
*
|
||||||
|
* @param string $plugin_file The plugin file path to remove.
|
||||||
|
* @return bool True on success, false on failure or if the plugin wasn't found.
|
||||||
|
*/
|
||||||
|
public function remove_plugin_reference( $plugin_file ) {
|
||||||
|
$success = false;
|
||||||
|
|
||||||
// Add content
|
// Ensure plugin file path is provided.
|
||||||
ourNotice.innerHTML = '<h3 style="margin-top:0;color:#826200;">👉 Fix Plugin Does Not Exist Notices Can Fix This</h3>' +
|
if ( empty( $plugin_file ) ) {
|
||||||
'<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>' +
|
return false;
|
||||||
'<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
|
// Handle multisite network admin context.
|
||||||
notice.parentNode.insertBefore(ourNotice, notice.nextSibling);
|
if ( is_multisite() && is_network_admin() ) {
|
||||||
|
$active_plugins = get_site_option( 'active_sitewide_plugins', array() );
|
||||||
|
// Network active plugins are stored as key => timestamp.
|
||||||
|
if ( isset( $active_plugins[ $plugin_file ] ) ) {
|
||||||
|
unset( $active_plugins[ $plugin_file ] );
|
||||||
|
$success = update_site_option( 'active_sitewide_plugins', $active_plugins );
|
||||||
|
}
|
||||||
|
} else { // Handle single site or non-network admin context.
|
||||||
|
$active_plugins = get_option( 'active_plugins', array() );
|
||||||
|
// Single site active plugins are stored as an indexed array.
|
||||||
|
$key = array_search( $plugin_file, $active_plugins, true ); // Use strict comparison.
|
||||||
|
if ( false !== $key ) {
|
||||||
|
unset( $active_plugins[ $key ] );
|
||||||
|
// Re-index the array numerically.
|
||||||
|
$active_plugins = array_values( $active_plugins );
|
||||||
|
$success = update_option( 'active_plugins', $active_plugins );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add scroll behavior
|
return $success;
|
||||||
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)')) {
|
|
||||||
missingPlugins[i].style.backgroundColor = '#fff8e5';
|
|
||||||
missingPlugins[i].scrollIntoView({behavior: 'smooth', block: 'center'});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to inject notices on multiple events to ensure it works
|
/**
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
* Display admin notices on the plugins page.
|
||||||
injectNotice();
|
*
|
||||||
|
* Shows informational notices about missing plugins and feedback
|
||||||
|
* messages after attempting to remove a reference.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function admin_notices() {
|
||||||
|
// Only run on the plugins page.
|
||||||
|
if ( ! $this->is_plugins_page() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Also set up a MutationObserver to watch for dynamically added notices
|
// Check for feedback messages from the remove action.
|
||||||
var observer = new MutationObserver(function(mutations) {
|
if ( isset( $_GET['reference_removed'] ) && '1' === $_GET['reference_removed'] ) {
|
||||||
mutations.forEach(function(mutation) {
|
?>
|
||||||
if (mutation.addedNodes && mutation.addedNodes.length > 0) {
|
<div class="notice notice-success is-dismissible">
|
||||||
injectNotice();
|
<p><?php esc_html_e( 'Plugin reference removed successfully.', 'fix-plugin-does-not-exist-notices' ); ?></p>
|
||||||
}
|
</div>
|
||||||
});
|
<?php
|
||||||
});
|
}
|
||||||
|
|
||||||
// Start observing the body for changes
|
if ( isset( $_GET['reference_removal_failed'] ) && '1' === $_GET['reference_removal_failed'] ) {
|
||||||
observer.observe(document.body, { childList: true, subtree: true });
|
?>
|
||||||
});
|
<div class="notice notice-error is-dismissible">
|
||||||
|
<p><?php esc_html_e( 'Failed to remove plugin reference. The plugin may already have been removed, or there was a database issue.', 'fix-plugin-does-not-exist-notices' ); ?></p>
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
// Backup attempt with window.onload
|
// Get invalid plugins to display the main informational notice.
|
||||||
window.onload = function() {
|
// Note: We don't need to call get_invalid_plugins() again if enqueue_admin_assets already did,
|
||||||
setTimeout(injectNotice, 500);
|
// 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();
|
||||||
|
|
||||||
// Final backup in case other methods fail
|
// Display the main informational notice if there are missing plugins.
|
||||||
setTimeout(injectNotice, 1000);
|
if ( ! empty( $invalid_plugins ) ) {
|
||||||
</script>
|
?>
|
||||||
<?php
|
<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.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Also display our standard info notice with more details
|
/**
|
||||||
echo '<div class="notice notice-info is-dismissible">';
|
* Check if the current admin page is the plugins page.
|
||||||
echo '<h3>Fix Plugin Does Not Exist Notices</h3>';
|
*
|
||||||
echo '<p><strong>Missing plugin files detected:</strong> The plugins listed below with <span style="color:red;">(File Missing)</span> tag no longer exist but are still referenced in your database.</p>';
|
* @global string $pagenow WordPress global variable for the current admin page filename.
|
||||||
echo '<p><strong>How to fix:</strong> Click the "Remove Reference" link next to each missing plugin to safely remove it from your active plugins list.</p>';
|
* @return bool True if the current page is plugins.php, false otherwise.
|
||||||
echo '<p>This will clean up your database and remove the error notifications.</p>';
|
*/
|
||||||
echo '</div>';
|
private function is_plugins_page() {
|
||||||
}
|
global $pagenow;
|
||||||
|
// Check if it's an admin page and the filename is plugins.php.
|
||||||
|
return is_admin() && isset( $pagenow ) && 'plugins.php' === $pagenow;
|
||||||
|
}
|
||||||
|
|
||||||
// Show success message
|
/**
|
||||||
if (isset($_GET['reference_removed']) && $_GET['reference_removed'] === '1') {
|
* Get a list of active plugin file paths that do not exist on the filesystem.
|
||||||
echo '<div class="notice notice-success is-dismissible"><p>Plugin reference removed successfully.</p></div>';
|
*
|
||||||
}
|
* Checks both single site and network active plugins based on the context.
|
||||||
|
*
|
||||||
|
* @return array An array of plugin file paths (relative to WP_PLUGIN_DIR) that are missing.
|
||||||
|
*/
|
||||||
|
private function get_invalid_plugins() {
|
||||||
|
$invalid_plugins = array();
|
||||||
|
$active_plugins = array();
|
||||||
|
|
||||||
// Show error message
|
// Determine which option to check based on context (Network Admin or single site).
|
||||||
if (isset($_GET['reference_removal_failed']) && $_GET['reference_removal_failed'] === '1') {
|
if ( is_multisite() && is_network_admin() ) {
|
||||||
echo '<div class="notice notice-error is-dismissible"><p>Failed to remove plugin reference. The plugin may already have been removed.</p></div>';
|
// Network active plugins are stored as keys in an associative array.
|
||||||
}
|
$active_plugins = array_keys( get_site_option( 'active_sitewide_plugins', array() ) );
|
||||||
}
|
} else {
|
||||||
|
// Single site active plugins are stored in a numerically indexed array.
|
||||||
|
$active_plugins = get_option( 'active_plugins', array() );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
// Check if the file exists for each active plugin.
|
||||||
* Check if we're on the plugins page
|
foreach ( $active_plugins as $plugin_file ) {
|
||||||
*/
|
// Construct the full path to the main plugin file.
|
||||||
private function is_plugins_page() {
|
$plugin_path = WP_PLUGIN_DIR . '/' . $plugin_file;
|
||||||
global $pagenow;
|
// Use validate_file to prevent directory traversal issues, although less likely here.
|
||||||
return is_admin() && $pagenow === 'plugins.php';
|
if ( validate_file( $plugin_file ) === 0 && ! file_exists( $plugin_path ) ) {
|
||||||
}
|
$invalid_plugins[] = $plugin_file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
return $invalid_plugins;
|
||||||
* Get a list of invalid plugin references
|
}
|
||||||
*/
|
} // End class Fix_Plugin_Does_Not_Exist_Notices
|
||||||
private function get_invalid_plugins() {
|
|
||||||
$invalid_plugins = array();
|
|
||||||
|
|
||||||
// Get all active plugins
|
// Initialize the plugin class.
|
||||||
if (is_multisite() && is_network_admin()) {
|
new Fix_Plugin_Does_Not_Exist_Notices();
|
||||||
$active_plugins = array_keys(get_site_option('active_sitewide_plugins', array()));
|
|
||||||
} else {
|
|
||||||
$active_plugins = get_option('active_plugins', array());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if each plugin exists
|
// Initialize the updater if composer autoload exists
|
||||||
foreach ($active_plugins as $plugin) {
|
$autoloader = __DIR__ . '/vendor/autoload.php';
|
||||||
$plugin_path = WP_PLUGIN_DIR . '/' . $plugin;
|
if (file_exists($autoloader)) {
|
||||||
if (!file_exists($plugin_path)) {
|
require_once $autoloader;
|
||||||
$invalid_plugins[] = $plugin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $invalid_plugins;
|
// Initialize the updater if the class exists
|
||||||
|
if (class_exists('\WPALLSTARS\FixPluginDoesNotExistNotices\Updater')) {
|
||||||
|
new \WPALLSTARS\FixPluginDoesNotExistNotices\Updater(__FILE__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the plugin
|
|
||||||
new Fix_Plugin_Does_Not_Exist_Notices();
|
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
114
languages/fix-plugin-does-not-exist-notices.pot
Normal file
114
languages/fix-plugin-does-not-exist-notices.pot
Normal file
@ -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.2\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"
|
||||||
|
"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 ""
|
53
readme.txt
53
readme.txt
@ -5,7 +5,7 @@ Tags: plugins, missing plugins, cleanup, error fix, admin tools, plugin file doe
|
|||||||
Requires at least: 5.0
|
Requires at least: 5.0
|
||||||
Tested up to: 6.4
|
Tested up to: 6.4
|
||||||
Requires PHP: 7.0
|
Requires PHP: 7.0
|
||||||
Stable tag: 1.4.1
|
Stable tag: 1.6.3
|
||||||
License: GPL-2.0+
|
License: GPL-2.0+
|
||||||
License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
|
||||||
@ -89,6 +89,42 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are
|
|||||||
|
|
||||||
== Changelog ==
|
== Changelog ==
|
||||||
|
|
||||||
|
= 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
|
||||||
|
|
||||||
= 1.4.1 =
|
= 1.4.1 =
|
||||||
* Added FAQ about keeping the plugin installed after notices are cleared
|
* Added FAQ about keeping the plugin installed after notices are cleared
|
||||||
|
|
||||||
@ -155,6 +191,21 @@ Although this plugin consumes minimal disk space, and doesn't run unless you are
|
|||||||
|
|
||||||
== Upgrade Notice ==
|
== Upgrade Notice ==
|
||||||
|
|
||||||
|
= 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 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!
|
||||||
|
|
||||||
= 1.3.3 =
|
= 1.3.3 =
|
||||||
Major usability improvement with auto-scroll feature to help find missing plugins in your list!
|
Major usability improvement with auto-scroll feature to help find missing plugins in your list!
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user