NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #1059 most downloaded on Packagist
PHP_CodeSniffer rules (sniffs) to enforce WordPress VIP minimum coding conventions
Last release 2 months ago
27 Jul 2026
Release timing varies
gaps range from 9 days to 2.2 years
Nearly every release is documented
notes for 19 of 20 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
20 releases · first in 2017
The minimum WordPressCS requirement is raised to 3.4.1 (from 3.2.0) — a security release which also brings numerous accuracy improvements to sniffs th…
This release raises the minimum requirements and reworks a large number of the VIPCS sniffs.
The minimum WordPressCS requirement is raised to 3.4.1 (from 3.2.0) — a security release which also brings numerous accuracy improvements to sniffs that VIPCS bundles — along with PHP_CodeSniffer 3.13.5, PHPCSUtils 1.2.3, PHPCSExtra 1.5.1 and VariableAnalysis 2.13.0. The minimum PHP version is now 7.4. Many sniffs have been reworked to fix false positives, add support for modern PHP syntaxes and adopt PHPCSUtils. The JavaScript-specific sniffs and the DynamicCalls sniff have been hard-deprecated ahead of their removal in 4.0.0, and the unused Security.Twig sniff has been removed.
Please ensure you run composer update automattic/vipwpcs --with-dependencies to benefit from this.
posts_per_page and numberposts set to -1 (WordPress' "no limit" value), which previously slipped past the WPCS > 100 check.exit, die or throw in a filter callback now raises a dedicated TerminatingInsteadOfReturn warning, instead of the generic MissingReturnStatement error.WordPressVIPMinimum ruleset.WordPress.Security.EscapeOutput.ExceptionNotEscaped in the WordPressVIPMinimum ruleset, as throwing an exception with a translated message triggered it and the check is considered controversial.strip_tags(), as the function should never be used on the VIP platform.WordPress.DB.DirectDatabaseQuery: recognises more caching functions (such as the wp_cache_*_multiple() and wp_cache_*_salted() functions), and has fewer false positives when caching functions are called using a non-canonical function name.WordPress.DB.PreparedSQL: fewer false positives for correctly escaped SQL called using a non-canonical function name, and for static method calls to a non-global class named wpdb.WordPress.Security.EscapeOutput: adds support for attributes on anonymous classes (PHP 8.0), readonly anonymous classes (PHP 8.3) and exit as a function call (PHP 8.4); expands *::class false-positive protection; fixes false positives/negatives for get_search_query() and _deprecated_file() used with non-standard casing; and no longer treats wp_kses_allowed_html() as an escaping function, which may surface a new warning where that function's return value was being output directly.WordPress.Security.NonceVerification: fewer false positives when the nonce-checking function is called using a non-canonical function name.WordPress.Security.ValidatedSanitizedInput: clearer error message for the InputNotValidated error code.WordPress.WP.AlternativeFunctions: fixes a false negative when class members share a name with select global WP functions/constants, and a false positive for the fully qualified stream constants \STDIN, \STDOUT and \STDERR.WordPress.WP.CronInterval: fixes a false positive when the callback reference used a different case to the function declaration.WordPressVIPMinimum.JS.*). They are excluded from the rulesets and will be removed in VIPCS 4.0.0.WordPressVIPMinimum.Functions.DynamicCalls sniff. It is excluded from the rulesets and will be removed in VIPCS 4.0.0.WordPressVIPMinimum.Security.Twig sniff.str_replace() by extending the WordPressCS AbstractFunctionParameterSniff; method calls, namespaced calls, first-class callables and argument unpacking are no longer flagged.define()/defined() by extending AbstractFunctionParameterSniff, and clarify the error message.AbstractFunctionParameterSniff.esc_*()/wp_kses*() calls by extending AbstractFunctionParameterSniff; safeguard argument unpacking, attributes and first-class callables.add_action() as an alias, disregard comments in parameters, and no longer treat a CSS file as PHP; plus PHP 8.0+ function-call and 8.1+ first-class-callable support.AbstractFunctionParameterSniff and add PHP 8.0+ function-call and nullsafe-operator support.WordPress.WP.EnqueuedResourceParameters sniff whereby running it over untrusted code could lead to arbitrary command execution on the scanning host. The VIPCS rulesets do not enable that sniff, so VIPCS' own behaviour is unaffected, but raising the minimum WordPressCS version removes the affected releases from the dependency tree and protects users who additionally run the WordPress or WordPress-Extra standards.composer.lock file from being created.@since tags which relate to WordPressCS.extends keyword, significantly improving performance, and add tests.is_targetted_token() method.FilePath utility.Full Changelog: 3.0.1...3.1.0
One column per quarter.
Increases requirements for PHPCS from 3.7.2 to 3.9.2 for improved PHP 8.2 and PHP 8.3 support. Please ensure you run composer update automattic/vipwpc
Increases requirements for PHPCS from 3.7.2 to 3.9.2 for improved PHP 8.2 and PHP 8.3 support. Please ensure you run composer update automattic/vipwpcs --with-dependencies to benefit from this.
Full Changelog: 3.0.0...3.0.1
Props: @GaryJones, @jrnfl, @terriann, @rebeccahum
Increases requirements for PHPCS from 3.7.2 to 3.9.2 for improved PHP 8.2 and PHP 8.3 support. Please ensure you run composer update automattic/vipwpcs --with-dependencies to benefit from this.
This release requires WordPressCS 3.0.0 . It is not compatible with WordPressCS 2.x. Users should read the WordPressCS 3.0 upgrade guide for end-users
Props: @GaryJones, @jrfnl
This release requires WordPressCS 3.0.0. It is not compatible with WordPressCS 2.x. Users should read the WordPressCS 3.0 upgrade guide for end-users.
Increases requirements for PHPCS from 3.7.1 to 3.7.2.
The tagged releases branch is now main instead of master.
WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn is now WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in.WordPressVIPMinimum.Performance.WPQueryParams.SuppressFiltersTrue is now WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters.'exclude' with get_users().@package tags.master to main.CONTRIBUTING.md.Props: @kshaner , @GaryJones , @jrfnl , @yolih
Props: @kshaner, @GaryJones, @jrfnl, @yolih
Increases requirements for PHPCS from 3.5.5+ to 3.7.1.
get_theme_file_path() to list of allowed include functions.#768: DeclarationCompatibility: performance improvement.
Rulesets:
Composer:
Tests:
Coding Standards
CI:
set-output.Docs:
Props: @gudmdharalds , @jrfnl , @BrookeDot , @rebeccahum
Props: @gudmdharalds, @jrfnl , @BrookeDot, @rebeccahum
Props: @jrfnl Fixed #681 : ProperEscapingFunction: improve attribute matching accuracy for notAttrEscAttr.
Props: jrfnl
Props: @jrfnl Fixed #668 : ProperEscapingFunction: fix overreach of comma usage in non-echo expressions for notAttrEscAttr. #670 : ProperEscapingFunct
Props: @jrfnl
$url_attrs and $attr_endings are deprecated along with the public methods is_html_attr() and attr_expects_url().There is a minor breaking change in the ProperEscapingFunction sniff from PR #624 . The escaping_function property can no longer be overruled via cust…
Props: @jrfnl, @rebeccahum, @kevinfodness, @GaryJones.
** There is a minor breaking change in the ProperEscapingFunction sniff from PR #624. The escaping_function property can no longer be overruled via custom rulesets. Please remove any usages of the property in custom rulesets.
** Composer now requires the phpcodesniffer-composer-installer plugin per #583. Note: If you either include it in the "require-dev" of your composer.json, use another Composer PHPCS plugin, or run bash commands to register PHPCS standards, please remove it from those sources to prevent interferences or version constraint conflicts.
esc_attr() usage in non-HTML attributes.$allowedKeywords for allowing custom partial keywords in constants to reduce false positives._.escape()-ed.$escaping_functions public property.Technically, there's a breaking change due to the use of the VariableAnalysis package over the previous sniff. If you have WordPressVIPMinimum.Variabl…
Props: @GaryJones, @jrfnl, @rebeccahum.
Technically, there's a breaking change due to the use of the VariableAnalysis package over the previous sniff. If you have WordPressVIPMinimum.Variables.Variables references in your PHPCS config file or in inline ignore comments, then these will need to be updated to VariableAnalysis.CodeAnalysis.VariableAnalysis.
.gitattributes file.CODEOWNERS file.CONTRIBUTING.md.Walker::walk().isEarlyMainQueryCheck() method.config_settings would never match.isset().Use new WordPress.DateTime.RestrictedFunctions sniff instead of deprecated WordPress.WP.TimezoneChange .
Bumps requirements to PHPCS 3.5.5+ and WPCS 2.3.0+.
get_page_by_path() restricted function warning, to suggest wpcom_vip_get_page_by_path() function.stats_get_csv() restricted function error, since this is a Jetpack-only function.after, appendTo, before, insertAfter, insertBefore, prepend, prependTo, replaceAll and replaceWith.wp_remote_get() usage.append() usage violation from Error to Warning for VIP Go, to be consistent with the other HTMLExecutingFunctions.get_parent_theme_file_path() to safelist of path functions for WordPressVIPMinimum.Files.IncludingFile sniff.WordPress.DateTime.RestrictedFunctions sniff instead of deprecated WordPress.WP.TimezoneChange.get_super_admins() restricted function rule for VIP Go.WordPressVIPMinimum.VersionControl.MergeConflict sniff in favour of Generic.VersionControl.GitMergeConflict.This release switches from having WPCS 1.* as a dependency, to WPCS 2.*. It is not compatible with WPCS 1.*.
This release switches from having WPCS 1.* as a dependency, to WPCS 2.*. It is not compatible with WPCS 1.*.
The sniffs in WPCS 2.* are more accurate, so you may see new violations there weren't being reported before, and a reduction in violations for false positives.
Props: GaryJones, hanifn, paulscreiber, rebeccahum, tomjn.
2.*.
PHPAliases.php.1.*'s WordPress.VIP references from rulesets.WordPress.PHP.IniSet sniff.DiscouragedPHPFunctions group exclusion in WordPressVIPMinimum ruleset.deletefile_put_contentsflockfputcsvfputsfwriteftruncateis_writableis_writeablelinkrenamesymlinktempnamtouchunlinkfclosefopenfile_get_contentsvip.wordpress.com to wpvip.com.git-flow workflow.| WordPressVIPMinimum.JS.StrippingTags.VulnerableTagStripping | No change |
This release contains many breaking changes.
It requires PHP >= 5.6, PHPCS 3.2.3+, and WPCS 1.*. It does not work with WPCS 2.*.
Props: GaryJones, rebeccahum, whyisjake, WPprodigy.
The sniffs in VIPCS have been reorganised into different categories, with new sniff names and new violation codes. The changes are detailed in the table below. If you reference any of the old violations in your custom ruleset (to change severity, type, or message), or with // phpcs:ignore or // phpcs:disable, you will need to updates these references to the new violation codes.
| Original Violation | New Violation |
|---|---|
WordPressVIPMinimum.Actions.PreGetPostSniff.PreGetPosts |
WordPressVIPMinimum.Hooks.PreGetPosts.PreGetPosts |
WordPressVIPMinimum.Cache.BatcacheWhitelistedParams.strippedGetParam |
WordPressVIPMinimum.Performance.BatcacheWhitelistedParams.StrippedGetParam |
WordPressVIPMinimum.Cache.CacheValueOverride.CacheValueOverride |
WordPressVIPMinimum.Performance.CacheValueOverride.CacheValueOverride |
WordPressVIPMinimum.Cache.LowExpiryCacheTime.LowCacheTime |
WordPressVIPMinimum.Performance.LowExpiryCacheTime.LowCacheTime |
WordPressVIPMinimum.Classes.DeclarationCompatibility.DeclarationCompatibility |
No change |
WordPressVIPMinimum.Classes.RestrictedExtendClasses.wp_cli_wp_cli_command |
WordPressVIPMinimum.Classes.RestrictedExtendClasses.wp_cli |
WordPressVIPMinimum.Constants.ConstantsRestrictions.ConstantRestrictions |
WordPressVIPMinimum.Constants.RestrictedConstants.DefiningRestrictedConstant<br>WordPressVIPMinimum.Constants.RestrictedConstants.UsingRestrictedConstant |
WordPressVIPMinimum.Constants.ConstantString.NotCheckingConstantName |
No change |
WordPressVIPMinimum.Files.IncludingFile.IncludingFile |
WordPressVIPMinimum.Files.IncludingFile.UsingVariable<br>WordPressVIPMinimum.Files.IncludingFile.UsingCustomConstant<br>WordPressVIPMinimum.Files.IncludingFile.UsingCustomFunction<br>WordPressVIPMinimum.Files.IncludingFile.NotAbsolutePath<br>WordPressVIPMinimum.Files.IncludingFile.ExternalURL<br>WordPressVIPMinimum.Files.IncludingFile.RestrictedConstant |
WordPressVIPMinimum.Files.IncludingNonPHPFile.IncludingSVGCSSFile |
WordPressVIPMinimum.Files.IncludingNonPHPFile.IncludingSVGCSSFile |
WordPressVIPMinimum.Files.IncludingNonPHPFile.IncludingNonPHPFile |
WordPressVIPMinimum.Files.IncludingNonPHPFile.IncludingNonPHPFile |
WordPressVIPMinimum.Filters.AlwaysReturn.voidReturn |
WordPressVIPMinimum.Hooks.AlwaysReturnInFilter.VoidReturn |
WordPressVIPMinimum.Filters.AlwaysReturn.missingReturnStatement |
WordPressVIPMinimum.Hooks.AlwaysReturnInFilter.MissingReturnStatement |
WordPressVIPMinimum.Filters.RestrictedHook.UploadMimes |
WordPressVIPMinimum.Hooks.RestrictedHooks.upload_mimes_upload_mimes |
WordPressVIPMinimum.Filters.RestrictedHook.HighTimeout |
WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_http_request_args<br>WordPressVIPMinimum.Hooks.RestrictedHooks.http_request_http_request_timeout |
WordPressVIPMinimum.Functions.CheckReturnValue.CheckReturnValue |
WordPressVIPMinimum.Functions.CheckReturnValue.DirectFunctionCall<br>WordPressVIPMinimum.Functions.CheckReturnValue.NonCheckedVariable |
WordPressVIPMinimum.Functions.CreateFunction.CreateFunction |
WordPressVIPMinimum.Functions.RestrictedFunctions.create_function_create_function |
WordPressVIPMinimum.Functions.DynamicCalls.DynamicCalls |
No change |
WordPressVIPMinimum.Functions.StripTags.StripTagsOneParameter |
No change |
WordPressVIPMinimum.Functions.StripTags.StripTagsTwoParameters |
No change |
WordPressVIPMinimum.JS.DangerouslySetInnerHTML.dangerouslySetInnerHTML |
WordPressVIPMinimum.JS.DangerouslySetInnerHTML.Found |
WordPressVIPMinimum.JS.HTMLExecutingFunctions.html |
No change |
WordPressVIPMinimum.JS.HTMLExecutingFunctions.append |
No change |
WordPressVIPMinimum.JS.HTMLExecutingFunctions.write |
No change |
WordPressVIPMinimum.JS.HTMLExecutingFunctions.writeln |
No change |
WordPressVIPMinimum.JS.InnerHTML.innerHTML |
WordPressVIPMinimum.JS.InnerHTML.Found |
WordPressVIPMinimum.JS.StringConcat.StringConcatNext |
WordPressVIPMinimum.JS.StringConcat.Found |
WordPressVIPMinimum.JS.StrippingTags.VulnerableTagStripping |
No change |
WordPressVIPMinimum.JS.Window.VarAssignment |
No change |
WordPressVIPMinimum.JS.Window.location |
No change |
WordPressVIPMinimum.JS.Window.name |
No change |
WordPressVIPMinimum.JS.Window.status |
No change |
WordPressVIPMinimum.Plugins.Zoninator.Zoninator |
WordPressVIPMinimum.Compatibility.Zoninator.RequiresRESTAPI |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputMustache.{{{ |
WordPressVIPMinimum.Security.Mustache.OutputNotation |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputMustache.{{& |
WordPressVIPMinimum.Security.Mustache.VariableNotation |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputMustache.delimeterChange |
WordPressVIPMinimum.Security.Mustache.DelimiterChange |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputMustache.SafeString |
WordPressVIPMinimum.Security.Mustache.SafeString |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputTwig.autoescape false |
WordPressVIPMinimum.Security.Twig.AutoescapeFalse |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputTwig.raw |
WordPressVIPMinimum.Security.Twig.RawFound |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputUnderscorejs.<%= |
WordPressVIPMinimum.Security.Underscorejs.OutputNotation |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputUnderscorejs.interpolate |
WordPressVIPMinimum.Security.Underscorejs.InterpolateFound |
WordPressVIPMinimum.TemplatingEngines.UnescapedOutputVuejs.v-html |
WordPressVIPMinimum.Security.Vuejs.Found |
WordPressVIPMinimum.Variables.ServerVariables.BasicAuthentication |
No change |
WordPressVIPMinimum.Variables.ServerVariables.UserControlledHeaders |
No change |
WordPressVIPMinimum.Variables.VariableAnalysis.VariableRedeclaration |
No change |
WordPressVIPMinimum.Variables.VariableAnalysis.UndefinedVariables |
WordPressVIPMinimum.Variables.VariableAnalysis.UndefinedVariable |
WordPressVIPMinimum.Variables.VariableAnalysis.$... |
WordPressVIPMinimum.Variables.VariableAnalysis.SelfInsideClosure<br>WordPressVIPMinimum.Variables.VariableAnalysis.SelfOutsideClass<br>WordPressVIPMinimum.Variables.VariableAnalysis.StaticInsideClosure<br>WordPressVIPMinimum.Variables.VariableAnalysis.StaticOutsideClass |
WordPressVIPMinimum.Variables.VariableAnalysis.UnusedVariable |
No change |
WordPressVIPMinimum.VIP.ErrorControl.ErrorControl |
Replaced with Generic.PHP.NoSilencedErrors |
WordPressVIPMinimum.VIP.EscapingVoidReturnFunctions.escapingVoidReturningFunction |
WordPressVIPMinimum.Security.EscapingVoidReturnFunctions.Found |
WordPressVIPMinimum.VIP.ExitAfterRedirect.NoExitInConditional |
WordPressVIPMinimum.Security.ExitAfterRedirect.NoExitInConditional |
WordPressVIPMinimum.VIP.ExitAfterRedirect.NoExit |
WordPressVIPMinimum.Security.ExitAfterRedirect.NoExit |
WordPressVIPMinimum.VIP.FetchingRemoteData.fileGetContentsUknown |
WordPressVIPMinimum.Performance.FetchingRemoteData.FileGetContentsUnknown |
WordPressVIPMinimum.VIP.FetchingRemoteData.fileGetContentsRemoteFile |
WordPressVIPMinimum.Performance.FetchingRemoteData.FileGetContentsRemoteFile |
WordPressVIPMinimum.VIP.FlushRewriteRules.FlushRewriteRules |
Replaced with WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules and WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules |
WordPressVIPMinimum.VIP.MergeConflict.HEAD |
WordPressVIPMinimum.MergeConflict.MergeConflict.Start |
WordPressVIPMinimum.VIP.MergeConflict.DELIMITER |
WordPressVIPMinimum.MergeConflict.MergeConflict.End<br>WordPressVIPMinimum.MergeConflict.MergeConflict.Separator |
WordPressVIPMinimum.VIP.PHPFilterFunctions.MissingThirdParameter |
WordPressVIPMinimum.Security.PHPFilterFunctions.MissingThirdParameter |
WordPressVIPMinimum.VIP.PHPFilterFunctions.RestrictedFilter |
WordPressVIPMinimum.Security.PHPFilterFunctions.RestrictedFilter |
WordPressVIPMinimum.VIP.PHPFilterFunctions.MissingSecondParameter |
WordPressVIPMinimum.Security.PHPFilterFunctions.MissingSecondParameter |
WordPressVIPMinimum.VIP.ProperEscapingFunction.hrefSrcEscUrl |
WordPressVIPMinimum.Security.ProperEscapingFunction.hrefSrcEscUrl |
WordPressVIPMinimum.VIP.ProperEscapingFunction.htmlAttrNotByEscHTML |
WordPressVIPMinimum.Security.ProperEscapingFunction.htmlAttrNotByEscHTML |
WordPressVIPMinimum.VIP.RegexpCompare.compare_compare |
WordPressVIPMinimum.Performance.RegexCompare.compare_compare |
WordPressVIPMinimum.VIP.RegexpCompare.compare_meta_compare |
WordPressVIPMinimum.Performance.RegexCompare.compare_meta_compare |
WordPressVIPMinimum.VIP.RemoteRequestTimeout.timeout_timeout |
WordPressVIPMinimum.Performance.RemoteRequestTimeout.timeout_timeout |
WordPressVIPMinimum.VIP.RestrictedFunctions.wp_cache_get_multi.wp_cache_get_multi |
WordPressVIPMinimum.Functions.RestrictedFunctions.wp_cache_get_multi_wp_cache_get_multi |
WordPressVIPMinimum.VIP.RestrictedFunctions.opcache_opcache_reset |
WordPressVIPMinimum.Functions.RestrictedFunctions.opcache_opcache_reset |
WordPressVIPMinimum.VIP.RestrictedFunctions.opcache_opcache_invalidate |
WordPressVIPMinimum.Functions.RestrictedFunctions.opcache_opcache_invalidate |
WordPressVIPMinimum.VIP.RestrictedFunctions.opcache_opcache_compile_file |
WordPressVIPMinimum.Functions.RestrictedFunctions.opcache_opcache_compile_file |
WordPressVIPMinimum.VIP.RestrictedFunctions.config_settings_opcache_is_script_cached |
WordPressVIPMinimum.Functions.RestrictedFunctions.config_settings_opcache_is_script_cached |
WordPressVIPMinimum.VIP.RestrictedFunctions.config_settings_opcache_get_status |
WordPressVIPMinimum.Functions.RestrictedFunctions.config_settings_opcache_get_status |
WordPressVIPMinimum.VIP.RestrictedFunctions.config_settings_opcache_get_configuration |
WordPressVIPMinimum.Functions.RestrictedFunctions.config_settings_opcache_get_configuration |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_super_admins_get_super_admins |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_super_admins_get_super_admins |
WordPressVIPMinimum.VIP.RestrictedFunctions.internal_wpcom_vip_irc |
WordPressVIPMinimum.Functions.RestrictedFunctions.internal_wpcom_vip_irc |
WordPressVIPMinimum.VIP.RestrictedFunctions.rewrite_rules_flush_rewrite_rules |
WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules |
WordPressVIPMinimum.VIP.RestrictedFunctions.attachment_url_to_postid_attachment_url_to_postid |
WordPressVIPMinimum.Functions.RestrictedFunctions.attachment_url_to_postid_attachment_url_to_postid |
WordPressVIPMinimum.VIP.RestrictedFunctions.dbDelta_dbDelta |
WordPressVIPMinimum.Functions.RestrictedFunctions.dbDelta_dbDelta |
WordPressVIPMinimum.VIP.RestrictedFunctions.switch_to_blog_switch_to_blog |
WordPressVIPMinimum.Functions.RestrictedFunctions.switch_to_blog_switch_to_blog |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_page_by_title_get_page_by_title |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_page_by_title_get_page_by_title |
WordPressVIPMinimum.VIP.RestrictedFunctions.url_to_postid_url_to_postid |
WordPressVIPMinimum.Functions.RestrictedFunctions.url_to_postid_url_to_postid |
WordPressVIPMinimum.VIP.RestrictedFunctions.url_to_postid_url_to_post_id |
Removed |
WordPressVIPMinimum.VIP.RestrictedFunctions.custom_role_add_role |
WordPressVIPMinimum.Functions.RestrictedFunctions.custom_role_add_role |
WordPressVIPMinimum.VIP.RestrictedFunctions.user_meta_get_user_meta |
WordPressVIPMinimum.Functions.RestrictedFunctions.user_meta_get_user_meta |
WordPressVIPMinimum.VIP.RestrictedFunctions.user_meta_update_user_meta |
WordPressVIPMinimum.Functions.RestrictedFunctions.user_meta_update_user_meta |
WordPressVIPMinimum.VIP.RestrictedFunctions.user_meta_delete_user_meta |
WordPressVIPMinimum.Functions.RestrictedFunctions.user_meta_delete_user_meta |
WordPressVIPMinimum.VIP.RestrictedFunctions.user_meta_add_user_meta |
WordPressVIPMinimum.Functions.RestrictedFunctions.user_meta_add_user_meta |
WordPressVIPMinimum.VIP.RestrictedFunctions.term_exists_term_exists |
WordPressVIPMinimum.Functions.RestrictedFunctions.term_exists_term_exists |
WordPressVIPMinimum.VIP.RestrictedFunctions.count_user_posts_count_user_posts |
WordPressVIPMinimum.Functions.RestrictedFunctions.count_user_posts_count_user_posts |
WordPressVIPMinimum.VIP.RestrictedFunctions.wp_old_slug_redirect_wp_old_slug_redirect |
WordPressVIPMinimum.Functions.RestrictedFunctions.wp_old_slug_redirect_wp_old_slug_redirect |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_adjacent_post_get_adjacent_post |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_adjacent_post |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_adjacent_post_get_previous_post |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_previous_post |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_adjacent_post_get_previous_post_link |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_previous_post_link |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_adjacent_post_get_next_post |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_next_post |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_adjacent_post_get_next_post_link |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_adjacent_post_get_next_post_link |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_intermediate_image_sizes_get_intermediate_image_sizes |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_intermediate_image_sizes_get_intermediate_image_sizes |
WordPressVIPMinimum.VIP.RestrictedFunctions.wp_is_mobile_wp_is_mobile |
WordPressVIPMinimum.Functions.RestrictedFunctions.wp_is_mobile_wp_is_mobile |
WordPressVIPMinimum.VIP.RestrictedFunctions.wp_mail_wp_mail |
WordPressVIPMinimum.Functions.RestrictedFunctions.wp_mail_wp_mail |
WordPressVIPMinimum.VIP.RestrictedFunctions.wp_mail_mail |
WordPressVIPMinimum.Functions.RestrictedFunctions.wp_mail_mail |
WordPressVIPMinimum.VIP.RestrictedFunctions.is_multi_author_is_multi_author |
WordPressVIPMinimum.Functions.RestrictedFunctions.is_multi_author_is_multi_author |
WordPressVIPMinimum.VIP.RestrictedFunctions.advanced_custom_fields_the_sub_field |
WordPressVIPMinimum.Functions.RestrictedFunctions.advanced_custom_fields_the_sub_field |
WordPressVIPMinimum.VIP.RestrictedFunctions.advanced_custom_fields_the_field |
WordPressVIPMinimum.Functions.RestrictedFunctions.advanced_custom_fields_the_field |
WordPressVIPMinimum.VIP.RestrictedFunctions.wp_remote_get_wp_remote_get |
WordPressVIPMinimum.Functions.RestrictedFunctions.wp_remote_get_wp_remote_get |
WordPressVIPMinimum.VIP.RestrictedFunctions.cookies_setcookie |
WordPressVIPMinimum.Functions.RestrictedFunctions.cookies_setcookie |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_posts_get_posts |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_posts_get_posts |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_posts_wp_get_recent_posts |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_posts_wp_get_recent_posts |
WordPressVIPMinimum.VIP.RestrictedFunctions.get_posts_get_children |
WordPressVIPMinimum.Functions.RestrictedFunctions.get_posts_get_children |
WordPressVIPMinimum.VIP.RestrictedFunctions.wpcom_vip_get_term_link_wpcom_vip_get_term_link |
WordPressVIPMinimum.Functions.RestrictedFunctions.wpcom_vip_get_term_link_wpcom_vip_get_term_link |
WordPressVIPMinimum.VIP.RestrictedFunctions.wpcom_vip_get_term_by_wpcom_vip_get_term_by |
WordPressVIPMinimum.Functions.RestrictedFunctions.wpcom_vip_get_term_by_wpcom_vip_get_term_by |
WordPressVIPMinimum.VIP.RestrictedFunctions.wpcom_vip_get_category_by_slug_wpcom_vip_get_category_by_slug |
WordPressVIPMinimum.Functions.RestrictedFunctions.wpcom_vip_get_category_by_slug_wpcom_vip_get_category_by_slug |
WordPressVIPMinimum.VIP.Robotstxt.RobotstxtSniff |
WordPressVIPMinimum.Hooks.RestrictedHooks.robotstxt_do_robotstxt<br>WordPressVIPMinimum.Hooks.RestrictedHooks.robotstxt_robots_txt |
WordPressVIPMinimum.VIP.StaticStrreplace.StaticStrreplace |
WordPressVIPMinimum.Security.StaticStrreplace.StaticStrreplace |
WordPressVIPMinimum.VIP.TaxonomyMetaInOptions.PossibleTermMetaInOptions |
WordPressVIPMinimum.Performance.TaxonomyMetaInOptions.PossibleTermMetaInOptions |
WordPressVIPMinimum.VIP.WPQueryParams.suppressFiltersTrue |
WordPressVIPMinimum.Performance.WPQueryParams.SuppressFiltersTrue |
WordPressVIPMinimum.VIP.WPQueryParams.post__not_in |
WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn |
WordPressVIPMinimum.Functions.RestrictedFunctions.chmod_chgrpWordPressVIPMinimum.Functions.RestrictedFunctions.chmod_chownWordPressVIPMinimum.Functions.RestrictedFunctions.chmod_chmodWordPressVIPMinimum.Functions.RestrictedFunctions.chmod_lchgrpWordPressVIPMinimum.Functions.RestrictedFunctions.chmod_lchownWordPressVIPMinimum.Functions.RestrictedFunctions.directory_mkdirWordPressVIPMinimum.Functions.RestrictedFunctions.directory_rmdirWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_deleteWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_file_put_contentsWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_flockWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fputcsvWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fputsWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_ftruncateWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_fwriteWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_is_writableWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_is_writeableWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_linkWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_renameWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_symlinkWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_tempnamWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_touchWordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_unlinkWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_abortWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_cache_expireWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_cache_limiterWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_commitWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_create_idWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_decodeWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_destroyWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_encodeWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_gcWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_get_cookie_paramsWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_idWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_is_registeredWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_module_nameWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_nameWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_regenerate_idWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_register_shutdownWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_registerWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_resetWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_save_pathWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_set_cookie_paramsWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_set_save_handlerWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_startWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_statusWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_unregisterWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_unsetWordPressVIPMinimum.Functions.RestrictedFunctions.session_session_write_closeWordPressVIPMinimum.Functions.RestrictedFunctions.site_option_add_site_optionWordPressVIPMinimum.Functions.RestrictedFunctions.site_option_delete_site_optionWordPressVIPMinimum.Functions.RestrictedFunctions.site_option_update_site_optionWordPressVIPMinimum.Performance.NoPaging.nopaging_nopagingWordPressVIPMinimum.Performance.OrderByRand.orderby_orderbyWordPressVIPMinimum.UserExperience.AdminBarRemoval.HidingDetectedWordPressVIPMinimum.UserExperience.AdminBarRemoval.RemovalDetectedWordPressVIPMinimum.Variables.RestrictedVariables.user_meta__wpdb__usersWordPressVIPMinimum.Variables.RestrictedVariables.user_meta__wpdb__usermetaWordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___COOKIEWordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___SERVER__HTTP_USER_AGENT__WordPressVIPMinimum.Variables.RestrictedVariables.cache_constraints___SERVER__REMOTE_ADDR__WordPressVIPMinimum.Variables.RestrictedVariables.session___sessionWordPress-VIP-Go ruleset test.phpcodesniffer-composer-installer plugin.has_html_open_tag() from WPCS.AbstractVariableRestrictionsSniff from WPCS.VIPCS\Sniff, which is an extension of WordPress\Sniff.isset() callsif()’s__DIR__strpos() instead of substr()else / elseif workflows for lower complexity and more comprehensionarray_push()array_values()in_array()returncontinuenull to class propertiesPHPCS_Ruleset_Test classes into new RulesetTest class.run() to passes().$expected to $this->expected. Somehow, this was still working regardless.// XSS OK comments in this files with // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped comments.addError() and addWarning() callsGeneric.NamingConventions.ConstructorName.OldStyle from WordPress-VIP-Go ruleset7.4snapshot instead of nightly, switch from Trusty to Xenial, remove sudo: false.EscapingVoidReturnFunctions: Fix docs and improve logicAlwaysReturnSniff: trigger errors instead of warnings, don't give violation for when callback args is passed by referenceexec() and shell_exec() to be flagged as Error.WordPress.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition exclusion in the PHPCS config for VIPCS itself.testVersion to match PHP requirement.Generic.PHP.DisallowShortOpenTag.EchoFound for WordPress-VIP-Go ruleset: <?= is no longer reported.WordPress.WP.AlternativeFunctions.file_system_read_fwrite and WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents since we have WordPressVIPMinimum.Functions.RestrictedFunctions.file_ops_*.WordPress-VIP-Go.This release contains breaking changes.
This release contains breaking changes.
Props: GaryJones, nickdaugherty, rebeccahum, tomjn.
WordPressVIPMinimum.Cache.LowExpiryCacheTime sniff.WordPressVIPMinimum.Classes.RestrictedExtendedClasses sniff, for WP_CLI_Command.WordPressVIPMinimum.Filters.RestrictedHooks sniff, for upload_mimes, as well as http_request_timeout and http_request_args filters which change timeouts, as we typically don't recommend anything above 3s.WordPressVIPMinimum.Functions.StripTags sniff.WordPressVIPMinimum.JS.DangerouslySetInnerHTML sniff.WordPressVIPMinimum.JS.Window sniff.WordPressVIPMinimum.VIP.PHPFilterFunctions sniff.opcache_*() functions to list of restricted functions..editorconfig to repo.Generic.PHP.Syntax to WordPressVIPMinimum ruleset.$e when catching exceptions.WordPressVIPMinimum.Files.IncludingFileWordPressVIPMinimum.VIP.RestrictedFunctions sniff.WordPressVIPMinimum.VIP.WPQueryParams.post__not_in.composer.json.WordPress.CodeAnalysis.AssignmentInCondition.Found to 1 instead of removing it.WordPressVIPMinimum.Cache.BatcacheWhitelistedParams for VIP Go ruleset.WordPressVIPMinimum.VIP.FetchingRemoteDataSniff.WordPressVIPMinimum.Filters.AlwaysReturnSniff not reporting filter callbacks that don't return anywhere inside the function body.WordPressVIPMinimum.Variables.VariableAnalysis sniff since they are passed in as a string.WordPressVIPMinimum.Variables.ServerVariables, add additional server variables and update unit tests.WordPressVIPMinimum.Files.IncludingNonPHPFile messages, switching get_file_contents to file_get_contents.WordPressVIPMinimum.Filters.AlwaysReturn.voidReturn message.WordPressVIPMinimum.VIP.WPQueryParameters.suppressFiltersTrue, switching probihted to prohibited.WordPressVIPMinimum.SVG.HTMLCodeSniff (SVG support), since it was not working well. You should remove any reference to this in your custom ruleset.var_dump from WordPressVIPMinimum ruleset since it should be the same type as var_exportwpcom_vip_get_page_by_path from WordPressVIPMinimum.VIP.RestrictedFunctionsWordPressVIPMinimum.Variables.VariableAnalysis unit test since tests are not failing anymore.Props: emrikol, GaryJones, gudmdharalds, mikeyarce, nickdaugherty, paulschreiber, rebeccahum, sboisvert, tomjn.
Originally tagged as 0.2.5.
Props: emrikol, GaryJones, gudmdharalds, mikeyarce, nickdaugherty, paulschreiber, rebeccahum, sboisvert, tomjn.
Props: BrookeDot, david-binda, GaryJones, gudmdharalds, rebeccahum, sboisvert, tomjn, uxcitizen.
Props: BrookeDot, david-binda, GaryJones, gudmdharalds, rebeccahum, sboisvert, tomjn, uxcitizen.
Nothing published for this version
Props: david-binda, sboisvert, tessneedham, trepmal.
Props: david-binda, sboisvert, tessneedham, trepmal.
Props: david-binda, jacklenox, pyronaur, sboisvert, trepmal, vaurdan.
Props: david-binda, jacklenox, pyronaur, sboisvert, trepmal, vaurdan.
Props: david-binda.
Props: david-binda.
Props: david-binda, philipjohn, tomjn.
Props: david-binda, philipjohn, tomjn.
Your coding agent can read these notes before it upgrades. Set up the MCP server →