Skip to content
Open
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php
namespace WordPressdotorg\Plugin_Directory\Shortcodes;
use WordPressdotorg\Plugin_Directory\Template;
use function WordPressdotorg\MainTheme\_esc_html_e;
use function WordPressdotorg\Two_Factor\get_onboarding_account_url;

class Upload {
Expand Down Expand Up @@ -140,13 +141,13 @@ public static function display() {
<p>
<?php
if ( 1 === (int) $plugins->new ) {
esc_html_e( 'Currently there is 1 plugin awaiting review.', 'wporg-plugins' );
esc_html_e( 'Currently there is 1 plugin awaiting its first review.', 'wporg-plugins' );
} else {
printf(
/* translators: %s: Amount of plugins awaiting review. */
esc_html( _n(
'Currently there is %s plugin awaiting review.',
'Currently there are %s plugins awaiting review.',
'Currently there is %s plugin awaiting their first review.',
'Currently there are %s plugins awaiting their first review.',
$plugins->new,
'wporg-plugins'
) ),
Expand All @@ -159,7 +160,7 @@ public static function display() {
printf(
/* translators: %s: Date of the oldest new plugin in the queue, with a 36 hours offset. */
esc_html( __(
'All plugins that have been submitted before %s have received an initial response by email to their submission.',
'All new submissions received before %s have been sent an initial response by email.',
'wporg-plugins'
) ),
'<strong>' . esc_html( $queue_oldest_new_plugin_date_with_offset ) . '</strong>'
Expand Down Expand Up @@ -449,70 +450,101 @@ public static function display() {
<?php wp_nonce_field( 'wporg-plugins-upload' ); ?>
<input type="hidden" name="action" value="upload"/>

<h3><?php esc_html_e( 'Please, read and check the following before uploading your plugin', 'wporg-plugins' ); ?></h3>

<p>
<label>
<input type="checkbox" name="requirements[faq]" required="required">
<?php
printf(
__( 'I have read the <a href="%s">Frequently Asked Questions</a>.', 'wporg-plugins' ),
'https://developer.wordpress.org/plugins/wordpress-org/plugin-developer-faq/'
);
?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[guidelines]" required="required">
<?php
printf(
__( 'This plugin complies with all of the <a href="%s">Plugin Developer Guidelines</a>.', 'wporg-plugins' ),
'https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/'
);
?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[author]" required="required">
<?php _e( 'I have permission to upload this plugin to WordPress.org for others to use and share.', 'wporg-plugins' ); ?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[license]" required="required">
<?php _e( 'This plugin, all included libraries, and any other included assets are licenced as GPL or are under a GPL compatible license.', 'wporg-plugins' ); ?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[plugin-check]" required="required" />
<?php
printf(
/* Translators: URL to plugin-check plugin */
__( 'I confirm that the plugin has been tested with the <a href="%s">Plugin Check</a> plugin, and all indicated issues resolved (apart from what I believe to be false-positives).', 'wporg-plugins' ),
home_url( '/plugin-check/' )
);
?>
</label>
</p>

<h3><?php esc_html_e( 'Plugin Naming', 'wporg-plugins' ); ?></h3>
<p><?php echo wp_kses_post( __( '<strong>Generic names</strong> that <strong>resemble existing plugins in the directory</strong> (e.g., “AI Writer”, “Image Optimization”) won’t be accepted, even if the slug is available.', 'wporg-plugins' ) ); ?></p>
<p><?php echo wp_kses_post( __( 'Instead, please <strong>start your plugin name with a unique or coined term</strong>, such as your brand, alias, or organization name (e.g., “Acme AI Writer”, “WriteralAI - AI Writter”, “Acme Image Optimization”, “Imageralia - Image Optimization”).', 'wporg-plugins' ) ); ?></p>
<h2><?php esc_html_e( 'Step 1: Before you submit', 'wporg-plugins' ); ?></h2>
<p><?php esc_html_e( 'Please, read and confirm the following.', 'wporg-plugins' ); ?></p>
<label>
<input type="checkbox" name="requirements[faq]" required="required">
<?php
printf( wp_kses_post( __( 'I have read the <a href="%s">Frequently Asked Questions</a>.', 'wporg-plugins' ) ), 'https://developer.wordpress.org/plugins/wordpress-org/plugin-developer-faq/' );
?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[guidelines]" required="required">
<?php
printf( wp_kses_post( __( 'I have read and make sure that this plugin complies with <strong>all</strong> of the <a href="%s">Plugins Directory Guidelines</a>.', 'wporg-plugins' ) ), 'https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/' );
?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[plugin-check]" required="required" />
<?php
printf(
/* Translators: URL to plugin-check plugin */
wp_kses_post( __( 'I confirm that the plugin has been tested with the <a href="%s">Plugin Check</a> plugin, and all indicated issues resolved (apart from what I believe to be false-positives).', 'wporg-plugins' )),
esc_url( home_url( '/plugin-check/' ) )
);
?>
</label>

<h3><?php esc_html_e( 'Plugin Ownership', 'wporg-plugins' ); ?></h3>
<h2><?php esc_html_e( 'Step 2: Common reasons plugins are rejected', 'wporg-plugins' ); ?></h2>
<h3>🏷️
<?php
esc_html_e( 'Naming and ownership', 'wporg-plugins' );
echo ' - <i>'.esc_html( 'Guideline 17', 'wporg-plugins' ).'</i>';
?>
</h3>
<p><?php echo wp_kses_post( __( 'Plugin names must be <strong>distinctive</strong> and should not be <strong>confusingly similar</strong> to existing plugins, projects, products, organizations, or trademarks that are not owned by you.', 'wporg-plugins' ) ); ?></p>
<p><?php echo wp_kses_post( __( '<strong>Choosing a distinctive name</strong>: Generic names such as "AI Writer" or "Image Optimization" and/or names similar to existing plugins are unlikely to be accepted, even if the plugin slug is available. Make your plugin stand out by using a unique identifier such as your name, brand, organization, or project name (e.g., “<u>Acme</u> AI Writer”, “<u>WriteralAI</u> – AI Writter”)', 'wporg-plugins' ) ); ?></p>
<p><?php printf(
/* translators: 1: User profile URL. */
wp_kses_post(
__( 'Names that <strong>begin</strong> with a project, organization, or trademark are <strong>only accepted if submitted by the verified owner</strong>. Ownership can be <strong>confirmed through the email domain in your <a href="%1$s" target="_blank">user profile</a></strong> - update it before submitting.', 'wporg-plugins' )
__( '<strong>Demonstrating ownership</strong>: Names that begin with a company, project, organization, or trademark name may only be submitted by the verified owner. Ownership is typically verified using the <a href="%1$s" target="_blank">email address associated with your WordPress.org account</a>. If necessary, update your profile before submitting.', 'wporg-plugins' )
),
esc_url( 'https://profiles.wordpress.org/profile/edit' )
); ?>
<br>
<?php echo wp_kses_post( __( '<i>For example, use an official Acme email domain (e.g., “john@acme.example”) for a plugin named “Acme AI Writer”.</i>', 'wporg-plugins' ) ); ?>
</p>
<p><?php echo wp_kses_post( __( '<strong>If you don’t own the entity, don’t imply affiliation</strong>. Place their name <strong>at the end</strong> and <strong>make the distinction clear</strong>.', 'wporg-plugins' ) ); ?>
<p><?php echo wp_kses_post( __( '<strong>If you are not the owner</strong>: Simply do not imply affiliation with a company, project, or trademark that you do not own. You can do so placing their name at the end and making the distinction clear (e.g., “WriteralAI – AI Writer <u>for Acme</u>”)', 'wporg-plugins' ) ); ?></p>
<label>
<input type="checkbox" name="requirements[naming]" required="required">
<?php esc_html_e( 'I have chosen a plugin name that is not confusingly similar to existing plugins, projects, organizations, or trademarks. I searched on internet for similar names and found nothing similar.', 'wporg-plugins' ); ?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[author]" required="required">
<?php
printf(
/* translators: %s: Current user's email address. */
wp_kses_post( __( 'I have permission to upload this plugin to WordPress.org for others to use and share and I am using a WordPress.org account that accurately represents the plugin owner: %s.', 'wporg-plugins' )),
'<strong>' . esc_html( wp_get_current_user()->user_email ) . '</strong>'
);
?>
</label>

<h3>🔓
<?php
esc_html_e( 'Trialware', 'wporg-plugins' );
echo ' - <i>'.esc_html( 'Guidelines 5 and 6', 'wporg-plugins' ).'</i>';
?>
</h3>
<p><?php echo wp_kses_post( __( 'Plugins hosted in the WordPress.org Plugin Directory <strong>may not artificially restrict functionality that is included in the plugin itself</strong>.', 'wporg-plugins' ) ); ?></p>
<p><?php echo wp_kses_post( __( 'This includes but is not limited to: paywalls, license/feature gating, time-limited trials, usage cutoffs, or any other mechanism that restricts, disables, or conditions access to <u>features implemented in the plugin code and/or that the plugin itself can do</u>.', 'wporg-plugins' ) ); ?></p>
<p><?php echo wp_kses_post( __( 'Please bear in mind that this is an <strong>open source directory for free to use plugins</strong>. Building a business around your plugin is fine, and there are compliant ways of doing so; artificial limitations in built-in code are not one of them.', 'wporg-plugins' ) ); ?></p>
<label>
<input type="checkbox" name="requirements[trialware]" required="required">
<?php esc_html_e( 'I confirm that my plugin code does not include artificial limitations to the included functionality. I acknowledge that I must comply with this in future, and that my plugin and account could be suspended indefinitely if I fail to do so.', 'wporg-plugins' ); ?>
</label>

<h3>🚫 <?php esc_html_e( 'Not accepted plugins', 'wporg-plugins' ); ?></h3>
<p><?php esc_html_e( 'There are some kind of plugins that aren\'t accepted in the directory, please do not submit them.', 'wporg-plugins' ); ?></p>
<ul>
<li><?php echo wp_kses_post( __( 'Plugins that allow arbitrary code insertion/execution are no longer accepted. This includes but is not limited to: PHP, JavaScript editors, File Managers, and AI tools creating code that is executed on the site. HTML is fine as long as it is escaped correctly. <i>Reason: Security</i>.', 'wporg-plugins' ) ); ?></li>
<li><?php echo wp_kses_post( __( 'Plugins downloading executable code from external sources. <i>Reasons: Security and Guideline 8</i>.', 'wporg-plugins' ) ); ?></li>
<li><?php echo wp_kses_post( __( 'Plugins whose functionality is already well represented in the directory, with hundreds of comparable plugins available, and that do not provide meaningful differentiation or introduce substantial innovation. <i>Reason: Guideline 18</i>.', 'wporg-plugins' ) ); ?></li>
</ul>

<h2><?php esc_html_e( 'Step 3: Submission acknowledgement', 'wporg-plugins' ); ?></h2>
<p><?php esc_html_e( 'Please confirm that you understand the following:', 'wporg-plugins' ); ?></p>
<label>
<input type="checkbox" name="requirements[confirmation1]" required="required">
<?php esc_html_e( 'I understand that submissions that do not follow the Plugin Directory Guidelines may be rejected. Repeated or serious violations may result in further restrictions', 'wporg-plugins' ); ?>
</label>
<br>
<label>
<input type="checkbox" name="requirements[confirmation3]" required="required">
<?php esc_html_e( 'I understand that hosting in the WordPress.org Plugin Directory is provided subject to continued compliance with the Plugin Directory Guidelines.', 'wporg-plugins' ); ?>
</label>
<br>
<?php echo wp_kses_post( __( '<i>For example, if you don’t own “Acme” use a structure like: “{your-distinguible-plugin-name} for Acme” (e.g., “WriteralAI – AI Writer for Acme”).</i>', 'wporg-plugins' ) ); ?>
</p>

<h3><?php esc_html_e( 'Are you ready? Upload the .zip file for your plugin', 'wporg-plugins' ); ?></h3>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
?>
</p>

<h3><?php _e( 'How can I expedite my plugin review?', 'wporg-plugins' ); ?></h3>
<h3><?php esc_html_e( 'How can I expedite my plugin review?', 'wporg-plugins' ); ?></h3>
<p>
<?php
printf(
Expand All @@ -63,11 +63,12 @@
);
?>
</p>
<p><?php _e( 'Our three most common reasons for not approving a plugin are:', 'wporg-plugins' ); ?></p>
<p><?php esc_html_e( 'Our four most common reasons for not approving a plugin are:', 'wporg-plugins' ); ?></p>
<ul>
<li><?php printf( __( 'The plugin contains unescaped output: <a href="%s">Learn about Escaping Data</a>', 'wporg-plugins' ), 'https://developer.wordpress.org/apis/security/escaping/' ); ?></li>
<li><?php printf( __( 'The plugin accepts unsanitized data: <a href="%s">Learn about Sanitizing Data</a>', 'wporg-plugins' ), 'https://developer.wordpress.org/apis/security/sanitizing/' ); ?></li>
<li><?php printf( __( 'The plugin processes form data without a nonce: <a href="%s">Learn about Nonces</a>', 'wporg-plugins' ), 'https://developer.wordpress.org/apis/security/nonces/' ); ?></li>
<li><?php printf( wp_kses_post( __( 'The plugin contains unescaped output: <a href="%s">Learn about Escaping Data</a>', 'wporg-plugins' ) ), esc_url( 'https://developer.wordpress.org/apis/security/escaping/' ) ); ?></li>
<li><?php printf( wp_kses_post( __( 'The plugin accepts unsanitized data: <a href="%s">Learn about Sanitizing Data</a>', 'wporg-plugins' ) ), esc_url( 'https://developer.wordpress.org/apis/security/sanitizing/' ) ); ?></li>
<li><?php printf( wp_kses_post( __( 'The plugin processes form data without a nonce: <a href="%s">Learn about Nonces</a>', 'wporg-plugins' ) ), esc_url( 'https://developer.wordpress.org/apis/security/nonces/' ) ); ?></li>
<li><?php printf( wp_kses_post( __( 'The plugin does not comply with the guidelines: <a href="%s">Check out the guidelines</a>', 'wporg-plugins' ) ), esc_url( 'https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/' ) ); ?></li>
</ul>
<p><?php _e( 'If the code in your plugin falls into one of the above categories, <strong>your plugin will not be approved</strong>. The Plugins Team will refer you back to these Handbook pages, adding further delay to the review process.', 'wporg-plugins' ); ?></p>

Expand All @@ -76,16 +77,17 @@
<p><?php echo wp_kses_post( __( 'Once your plugin is approved, it <em>cannot</em> be renamed.', 'wporg-plugins' ) ); ?></p>

<h3><?php esc_html_e( 'I made a mistake in my plugin name. Should I update it?', 'wporg-plugins' ); ?></h3>
<p><?php echo wp_kses_post( __( 'It depends on what you want to change. If you want to change the plugin <strong>display name</strong> you can update that by updating your plugin files in this page. If what you want to change is the <strong>permalink / slug</strong> of your plugin, you can do that ONCE before we begin with the review (if that&#8217;s available you&#8217;ll see a link to change it on this page).', 'wporg-plugins' ) ); ?></p>
<p><?php
printf(
/* translators: %s: Email address */
__( 'It depends on what you want to change. If you want to change the plugin <strong>display name</strong> you can update that by updating your plugin files in this page. If what you want to change is the <strong>permalink / slug</strong> of your plugin, you can do that ONCE before we begin with the review (if that&#8217;s available you&#8217;ll see a link to change it on this page). If this is not possible, you will need to contact us at %s, we can change it as long as the plugin has not yet been approved.', 'wporg-plugins' ),
wp_kses_post( __( 'If you can no longer change the slug from this page, please contact us. If your plugin is already under review, <strong>simply reply to the review email</strong>. Otherwise, email us at %s. We can make the change as long as the plugin has not yet been approved.', 'wporg-plugins' ) ),
'<code>plugins@wordpress.org</code>'
);
?></p>

<h3><?php esc_html_e( 'Why can&#8217;t I submit a plugin with certain display names?', 'wporg-plugins' ); ?></h3>
<p><?php echo wp_kses_post( __( 'Certain plugin names are prohibited due to trademark abuse. Similarly, we prevent their use in plugin slugs entirely for your protection.', 'wporg-plugins' ) ); ?></p>
<p><?php echo wp_kses_post( __( 'Certain plugin names are prohibited due to trademark abuse and to avoid confusion with other project names or plugins. Similarly, we prevent their use in plugin slugs entirely for your protection.', 'wporg-plugins' ) ); ?></p>
</div>
</section>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,13 @@
<li>
<?php
/* translators: URL to licence list. */
printf( wp_kses_post( __( 'Your plugin must be compatible with the <a href="%s">GNU General Public License v2</a>, or any later version. We strongly recommend using the same license as WordPress — &#8220;GPLv2 or later.&#8221;', 'wporg-plugins' ) ), esc_url( 'https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses' ) );
printf( wp_kses_post( __( 'Your plugin must be compatible with the <a href="%s">GNU General Public License v2</a>, or any later version. The plugin should either include its source code or provide a clear link to it. We strongly recommend using the same license as WordPress — &#8220;GPLv2 or later.&#8221;', 'wporg-plugins' ) ), esc_url( 'https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses' ) );
?>
</li>
<li>
<?php
/* translators: URL to guidelines. */
printf( wp_kses_post( __( 'The plugin <a href="%s" target="_blank">must not impose artificial restrictions on its built-in functionality</a>. This includes license gates, paywalls, time-limited trials, usage quotas, or any other mechanism that limits features included in the plugin code and/or that the plugin code can do.', 'wporg-plugins' ) ), esc_url( 'https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/#5-trialware-is-not-permitted' ) );
?>
</li>
<li><?php esc_html_e( 'The plugin must not do anything illegal or be morally offensive (that&#8217;s subjective, we know).', 'wporg-plugins' ); ?></li>
Expand Down
Loading