wishthis/vendor/wp-coding-standards/wpcs/WordPress/Sniffs/WP/DeprecatedClassesSniff.php
2023-09-20 13:52:46 +02:00

142 lines
4.1 KiB
PHP

<?php
/**
* WordPress Coding Standard.
*
* @package WPCS\WordPressCodingStandards
* @link https://github.com/WordPress/WordPress-Coding-Standards
* @license https://opensource.org/licenses/MIT MIT
*/
namespace WordPressCS\WordPress\Sniffs\WP;
use PHPCSUtils\Utils\MessageHelper;
use WordPressCS\WordPress\AbstractClassRestrictionsSniff;
use WordPressCS\WordPress\Helpers\MinimumWPVersionTrait;
/**
* Restricts the use of deprecated WordPress classes and suggests alternatives.
*
* This sniff will throw an error when usage of a deprecated class is detected
* if the class was deprecated before the minimum supported WP version;
* a warning otherwise.
* By default, it is set to presume that a project will support the current
* WP version and up to three releases before.
*
* @since 0.12.0
* @since 0.13.0 Class name changed: this class is now namespaced.
* @since 0.14.0 Now has the ability to handle minimum supported WP version
* being provided via the command-line or as as <config> value
* in a custom ruleset.
*
* @uses \WordPressCS\WordPress\Helpers\MinimumWPVersionTrait::$minimum_wp_version
*/
final class DeprecatedClassesSniff extends AbstractClassRestrictionsSniff {
use MinimumWPVersionTrait;
/**
* List of deprecated classes with alternative when available.
*
* To be updated after every major release.
*
* Version numbers should be fully qualified.
*
* Last update: July 2023 for WP 6.3 at https://github.com/WordPress/wordpress-develop/commit/6281ce432c50345a57768bf53854d9b65b6cdd52
*
* @var array
*/
private $deprecated_classes = array(
// WP 3.1.0.
'WP_User_Search' => array(
'alt' => 'WP_User_Query',
'version' => '3.1.0',
),
// WP 3.7.0.
'WP_HTTP_Fsockopen' => array(
'alt' => 'WP_HTTP::request()',
'version' => '3.7.0',
),
// WP 4.9.0.
'WP_Customize_New_Menu_Section' => array(
'version' => '4.9.0',
),
'WP_Customize_New_Menu_Control' => array(
'version' => '4.9.0',
),
// WP 5.3.0.
'WP_Privacy_Data_Export_Requests_Table' => array(
'alt' => 'WP_Privacy_Data_Export_Requests_List_Table',
'version' => '5.3.0',
),
'WP_Privacy_Data_Removal_Requests_Table' => array(
'alt' => 'WP_Privacy_Data_Removal_Requests_List_Table',
'version' => '5.3.0',
),
'Services_JSON' => array(
'alt' => 'The PHP native JSON extension',
'version' => '5.3.0',
),
'Services_JSON_Error' => array(
'alt' => 'The PHP native JSON extension',
'version' => '5.3.0',
),
);
/**
* Groups of classes to restrict.
*
* @return array
*/
public function getGroups() {
// Make sure all array keys are lowercase.
$this->deprecated_classes = array_change_key_case( $this->deprecated_classes, \CASE_LOWER );
return array(
'deprecated_classes' => array(
'classes' => array_keys( $this->deprecated_classes ),
),
);
}
/**
* Process a matched token.
*
* @param int $stackPtr The position of the current token in the stack.
* @param string $group_name The name of the group which was matched. Will
* always be 'deprecated_classes'.
* @param string $matched_content The token content (class name) which was matched
* in its original case.
*
* @return void
*/
public function process_matched_token( $stackPtr, $group_name, $matched_content ) {
$this->set_minimum_wp_version();
$class_name = ltrim( strtolower( $matched_content ), '\\' );
$message = 'The %s class has been deprecated since WordPress version %s.';
$data = array(
ltrim( $matched_content, '\\' ),
$this->deprecated_classes[ $class_name ]['version'],
);
if ( ! empty( $this->deprecated_classes[ $class_name ]['alt'] ) ) {
$message .= ' Use %s instead.';
$data[] = $this->deprecated_classes[ $class_name ]['alt'];
}
MessageHelper::addMessage(
$this->phpcsFile,
$message,
$stackPtr,
( $this->wp_version_compare( $this->deprecated_classes[ $class_name ]['version'], $this->minimum_wp_version, '<' ) ),
MessageHelper::stringToErrorcode( $class_name . 'Found' ),
$data
);
}
}