Remove assets directory and update references to use .wordpress-org/assets
Some checks failed
ci/woodpecker/push/woodpecker Pipeline is pending
Plugin Asset Update / Push assets to WordPress.org (push) Has been cancelled

This commit is contained in:
2025-04-13 15:17:52 +01:00
parent 717a2721e8
commit 7c0dadac08
9 changed files with 18 additions and 562 deletions

View File

@ -113,10 +113,10 @@ For converting SVG to PNG or creating different sizes of images, you can use:
- **Command Line** (using ImageMagick):
```bash
# For 256x256 icon
convert -background none -size 256x256 assets/icon/icon.svg assets/icon/icon-256x256.png
convert -background none -size 256x256 .wordpress-org/assets/icon.svg .wordpress-org/assets/icon-256x256.png
# For 128x128 icon
convert -background none -size 128x128 assets/icon/icon.svg assets/icon/icon-128x128.png
convert -background none -size 128x128 .wordpress-org/assets/icon.svg .wordpress-org/assets/icon-128x128.png
```
## Resources

View File

@ -30,15 +30,15 @@ This document outlines the requirements for assets when submitting a plugin to t
## Current Status
### Icon
- ✅ SVG source available in `assets/icon/icon.svg`
- ✅ PNG files created in `assets/icon/icon-256x256.png` and `assets/icon/icon-128x128.png`
- ✅ SVG source available in `.wordpress-org/assets/icon.svg`
- ✅ PNG files created in `.wordpress-org/assets/icon-256x256.png` and `.wordpress-org/assets/icon-128x128.png`
### Banner
- ✅ Both sizes available in `assets/banner/`
- ✅ Both sizes available in `.wordpress-org/assets/`
- ✅ Properly named files: `banner-772x250.png` and `banner-1544x500.png`
### Screenshots
- ✅ One screenshot available in `assets/screenshots/screenshot-1.png`
- ✅ One screenshot available in `.wordpress-org/assets/screenshot-1.png`
- ✅ Screenshot description in readme.txt updated to reference only one screenshot
## SVN Directory Structure
@ -68,11 +68,11 @@ When submitting to WordPress.org, your SVN repository will have this structure:
```bash
# Copy assets to WordPress.org SVN assets directory
cp assets/icon/icon-256x256.png /path/to/wordpress-svn/assets/
cp assets/icon/icon-128x128.png /path/to/wordpress-svn/assets/
cp assets/banner/banner-772x250.png /path/to/wordpress-svn/assets/
cp assets/banner/banner-1544x500.png /path/to/wordpress-svn/assets/
cp assets/screenshots/screenshot-1.png /path/to/wordpress-svn/assets/
cp .wordpress-org/assets/icon-256x256.png /path/to/wordpress-svn/assets/
cp .wordpress-org/assets/icon-128x128.png /path/to/wordpress-svn/assets/
cp .wordpress-org/assets/banner-772x250.png /path/to/wordpress-svn/assets/
cp .wordpress-org/assets/banner-1544x500.png /path/to/wordpress-svn/assets/
cp .wordpress-org/assets/screenshot-1.png /path/to/wordpress-svn/assets/
```
## Resources

View File

@ -1,50 +0,0 @@
# Plugin Assets for WordPress.org
This directory contains assets for the WordPress.org plugin repository.
## Directory Structure
- `banner/` - Banner images for the plugin page header
- `banner-772x250.jpg` - Standard banner (772x250px)
- `banner-1544x500.jpg` - Retina banner (1544x500px)
- `icon/` - Plugin icon images
- `icon-128x128.jpg` - Standard icon (128x128px)
- `icon-256x256.jpg` - Retina icon (256x256px)
- `screenshots/` - Screenshots shown on the plugin page
- `screenshot-1.jpg` - Error message with explanation notification
## WordPress.org Requirements
### Required Image Dimensions
- **Banner**: 772x250px with 2x retina version at 1544x500px
- **Icon**: 128x128px with 2x retina version at 256x256px
- **Screenshots**: No specific size requirements, but they should be clear and readable
### Image Formats
- All images should be in JPG or PNG format
- Images should be optimized for web (compressed without losing quality)
### Additional Notes
- Screenshots should be numbered sequentially starting with 1
- They should match the descriptions in the `readme.txt` file
- Right-to-Left (RTL) language versions of banners and icons can be provided by appending `-rtl` to the filename
- There is no official support for dark mode versions of assets in the WordPress.org repository
## Example Filenames
```
assets/
├── banner/
│ ├── banner-772x250.jpg
│ └── banner-1544x500.jpg
├── icon/
│ ├── icon-128x128.jpg
│ └── icon-256x256.jpg
└── screenshots/
├── screenshot-1.jpg
```

View File

@ -1,38 +0,0 @@
.prc-notice {
border-left: 4px solid #ffba00;
background-color: #fff8e5;
padding: 10px 12px;
margin: 5px 0 15px;
font-size: 14px;
position: relative;
width: 100%;
box-sizing: border-box;
max-width: none;
}
.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,
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;
}

View File

@ -1,99 +0,0 @@
/**
* Update Source Selector Styles
*/
#fpden-update-source-modal {
display: none;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
}
#fpden-update-source-modal h2 {
margin-top: 0;
margin-bottom: 15px;
font-size: 1.3em;
font-weight: 600;
}
#fpden-update-source-modal p {
margin-bottom: 20px;
}
#fpden-update-source-form label {
display: block;
margin-bottom: 10px;
padding: 8px;
border-radius: 4px;
cursor: pointer;
}
#fpden-update-source-form label:hover {
background-color: #f0f0f1;
}
#fpden-update-source-form input[type="radio"] {
margin-right: 8px;
}
.fpden-source-description {
display: block;
margin-left: 24px;
font-size: 0.9em;
color: #666;
margin-top: 3px;
}
.fpden-submit-container {
margin-top: 20px;
text-align: right;
}
.fpden-submit-container button {
margin-left: 10px;
}
/* Remove explicit color to inherit from theme */
.fpden-update-source-toggle {
/* color is now inherited from theme */
}
.fpden-update-source-toggle:hover {
/* hover color is now inherited from theme */
}
/* Close button styles */
.fpden-close-modal {
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
font-size: 40px; /* Large size */
color: #666;
line-height: 30px;
text-decoration: none !important;
}
/* Source badges */
.fpden-source-badge {
display: inline-block;
padding: 2px 6px;
border-radius: 3px;
font-size: 0.8em;
margin-left: 5px;
color: white;
font-weight: normal;
}
.fpden-source-badge.wordpress, .fpden-source-badge.wordpress\.org {
background-color: #0073aa;
}
.fpden-source-badge.github {
background-color: #24292e;
}
.fpden-source-badge.gitea {
background-color: #609926;
}
.fpden-source-badge.auto {
background-color: #666;
}

View File

@ -1,131 +0,0 @@
(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, 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')) &&
(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 row showing: plugin-name.php "<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, using the standard WordPress function to update your active plugin options table, to leave 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() {
// 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) {
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, div.error') || node.querySelector('.notice, .error, .updated, div.error'))) {
setTimeout(injectNotice, 50); // Small delay to ensure the DOM is updated
}
});
}
});
});
// 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
});
// Additional attempt after a longer delay to catch late-loading notices
window.addEventListener('load', function() {
setTimeout(injectNotice, 1000); // Longer delay as final attempt
});
})();

View File

@ -1,138 +0,0 @@
/**
* Update Source Selector
*
* Handles the UI for selecting which source to use for plugin updates.
*/
jQuery(document).ready(function($) {
// Open modal when toggle is clicked
$(document).on('click', '.fpden-update-source-toggle', function(e) {
e.preventDefault();
// Add overlay
$('body').append('<div id="fpden-modal-overlay"></div>');
$('#fpden-modal-overlay').css({
'position': 'fixed',
'top': 0,
'left': 0,
'width': '100%',
'height': '100%',
'background-color': 'rgba(0,0,0,0.5)',
'z-index': 100000
});
// Position and show modal
var modal = $('#fpden-update-source-modal');
modal.css({
'position': 'fixed',
'top': '50%',
'left': '50%',
'transform': 'translate(-50%, -50%)',
'background-color': '#fff',
'padding': '20px',
'border-radius': '5px',
'box-shadow': '0 0 10px rgba(0,0,0,0.5)',
'z-index': 100001,
'width': '400px',
'max-width': '90%'
}).show();
// Add close button styles
$('.fpden-close-modal').css({
'position': 'absolute',
'top': '10px',
'right': '10px',
'cursor': 'pointer',
'font-size': '20px',
'color': '#666'
});
});
// Close modal when clicking overlay or close button
$(document).on('click', '#fpden-modal-overlay', function() {
$('#fpden-update-source-modal').hide();
$('#fpden-modal-overlay').remove();
});
// Separate handler for close button to ensure it works
$(document).on('click', '.fpden-close-modal', function(e) {
e.preventDefault();
$('#fpden-update-source-modal').hide();
$('#fpden-modal-overlay').remove();
});
// Prevent clicks inside modal from closing it
$('#fpden-update-source-modal').on('click', function(e) {
e.stopPropagation();
});
// Handle form submission
$('#fpden-update-source-form').on('submit', function(e) {
e.preventDefault();
var source = $('input[name="update_source"]:checked').val();
// Show loading state
var submitButton = $(this).find('button[type="submit"]');
var originalText = submitButton.text();
submitButton.text('Saving...').prop('disabled', true);
// Save via AJAX
$.post(ajaxurl, {
action: 'fpden_save_update_source',
source: source,
nonce: fpdenData.updateSourceNonce
}, function(response) {
submitButton.text(originalText).prop('disabled', false);
if (response.success) {
// Update the badge
var badgeText = source.charAt(0).toUpperCase() + source.slice(1);
if (source === 'wordpress.org') {
badgeText = 'WP.org';
}
// Remove all badge classes and add the new one
var badge = $('.fpden-update-source-toggle .fpden-source-badge');
badge.removeClass('auto wordpress github gitea')
.addClass(source)
.text(badgeText);
// Show success message
var message = $('<div class="fpden-success-message">Update source saved successfully!</div>');
message.css({
'color': 'green',
'margin-top': '10px',
'text-align': 'center'
});
$('#fpden-update-source-form').append(message);
// Hide message and modal after delay
setTimeout(function() {
message.fadeOut(function() {
$(this).remove();
$('#fpden-update-source-modal').hide();
$('#fpden-modal-overlay').remove();
});
}, 1500);
} else {
// Show error message
var message = $('<div class="fpden-error-message">Error saving update source.</div>');
message.css({
'color': 'red',
'margin-top': '10px',
'text-align': 'center'
});
$('#fpden-update-source-form').append(message);
// Hide message after delay
setTimeout(function() {
message.fadeOut(function() {
$(this).remove();
});
}, 3000);
}
});
});
});

View File

@ -1,75 +0,0 @@
/**
* Fix Plugin Version Display
*
* This script directly modifies the plugin details popup to show the correct version
* when the popup is opened for our plugin.
*/
(function($) {
'use strict';
// Current plugin version - this should match the version in the main plugin file
const CURRENT_VERSION = '2.1.1';
// Plugin slugs to check for
const OUR_SLUGS = ['wp-fix-plugin-does-not-exist-notices', 'fix-plugin-does-not-exist-notices'];
// Function to fix the version in the plugin details popup
function fixPluginDetailsVersion() {
// Check if we're on the plugins page
if (window.location.href.indexOf('plugins.php') === -1) {
return;
}
// Wait for the thickbox to be initialized
$(document).on('tb_init', function() {
// Set a timeout to allow the thickbox content to load
setTimeout(function() {
// Get the thickbox iframe
const $iframe = $('#TB_iframeContent');
if (!$iframe.length) return;
// Wait for iframe to load
$iframe.on('load', function() {
try {
const iframeDoc = this.contentDocument || this.contentWindow.document;
// Get the plugin title from the iframe
const $title = $(iframeDoc).find('h2.plugin-title');
if (!$title.length) return;
// Check if this is our plugin
const titleText = $title.text();
if (titleText.indexOf('Fix \'Plugin file does not exist\' Notices') !== -1) {
console.log('Found our plugin in the details popup, fixing version...');
// Find the version element
const $version = $(iframeDoc).find('.plugin-version-author-uri');
if ($version.length) {
// Update the version text
const versionText = $version.text();
const newVersionText = versionText.replace(/Version: [0-9.]+|Version: 0\.0\.0/, 'Version: ' + CURRENT_VERSION);
$version.text(newVersionText);
console.log('Updated version to: ' + CURRENT_VERSION);
}
// Also update the version in the header if it exists
const $versionHeader = $(iframeDoc).find('.wrap h2:contains("Version:")');
if ($versionHeader.length) {
$versionHeader.text('Version: ' + CURRENT_VERSION);
console.log('Updated version header to: ' + CURRENT_VERSION);
}
}
} catch (e) {
console.error('Error updating plugin version:', e);
}
});
}, 500);
});
}
// Initialize when the document is ready
$(document).ready(function() {
fixPluginDetailsVersion();
});
})(jQuery);

View File

@ -38,27 +38,14 @@ cp -r includes/* $BUILD_DIR/includes/
mkdir -p $BUILD_DIR/languages
cp -r languages/* $BUILD_DIR/languages/
# Copy assets
mkdir -p $BUILD_DIR/assets/css
cp -r assets/css/* $BUILD_DIR/assets/css/
mkdir -p $BUILD_DIR/assets/js
cp -r assets/js/* $BUILD_DIR/assets/js/
# Copy admin assets
mkdir -p $BUILD_DIR/admin/css
cp -r admin/css/* $BUILD_DIR/admin/css/
mkdir -p $BUILD_DIR/admin/js
cp -r admin/js/* $BUILD_DIR/admin/js/
# Copy asset source files (PXD)
mkdir -p $BUILD_DIR/assets/banner
cp -r assets/banner/*.pxd $BUILD_DIR/assets/banner/ 2>/dev/null || :
mkdir -p $BUILD_DIR/assets/icon
cp -r assets/icon/*.pxd $BUILD_DIR/assets/icon/ 2>/dev/null || :
mkdir -p $BUILD_DIR/assets/screenshots
cp -r assets/screenshots/*.pxd $BUILD_DIR/assets/screenshots/ 2>/dev/null || :
# Copy README files from assets directories
cp -r assets/README.md $BUILD_DIR/assets/ 2>/dev/null || :
cp -r assets/banner/README.md $BUILD_DIR/assets/banner/ 2>/dev/null || :
cp -r assets/icon/README.md $BUILD_DIR/assets/icon/ 2>/dev/null || :
cp -r assets/screenshots/README.md $BUILD_DIR/assets/screenshots/ 2>/dev/null || :
cp -r assets/WORDPRESS_ORG_ASSETS.md $BUILD_DIR/assets/ 2>/dev/null || :
cp -r assets/WORDPRESS_ORG_SUBMISSION.md $BUILD_DIR/assets/ 2>/dev/null || :
# Create assets directory structure
mkdir -p $BUILD_DIR/assets
# Copy PNG files from .wordpress-org/assets to the build directory
mkdir -p $BUILD_DIR/assets/banner