<?xml version="1.0"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHPCompatibilityWP" xsi:noNamespaceSchemaLocation="https://schema.phpcodesniffer.com/phpcs.xsd">

    <description>WordPress specific ruleset which checks for PHP cross version compatibility.</description>

    <!--
    The WordPress minimum PHP requirement was 5.2.4 up to WP 5.1.
    As of WP 5.2, the new minimum PHP requirement is PHP 5.6.20.
    As of WP 6.3, the new minimum PHP requirement is PHP 7.0.0.
    As of WP 6.6, the new minimum PHP requirement is PHP 7.2.24.
    Add the following in your project PHP_CodeSniffer ruleset to enforce this:
    <config name="testVersion" value="7.2-"/>

    This directive is not included in this ruleset as individual projects may use
    a different (higher) minimum PHP version.
    -->

    <rule ref="PHPCompatibility">
        <!--
        Contained in /wp-includes/compat.php.

        History of the polyfills in WP:
        * hash_hmac(): since WP 3.2.0.
        * json_encode() and json_decode(): since unknown.
        * hash_equals(): since WP 3.9.2.
        * JSON_PRETTY_PRINT: since WP 4.1.0.
        * json_last_error_msg(): since WP 4.4.0.
        * JsonSerializable: since WP 4.4.0.
        * array_replace_recursive(): since WP 4.5.3 up to 5.2.x. The polyfill was removed in WP 5.3.
        * is_iterable(): since WP 4.9.6
        * is_countable(): since WP 4.9.6
        * IMAGETYPE_WEBP and IMG_WEBP: since WP 5.8.0.
        * array_key_first(): since WP 5.9.0
        * array_key_last(): since WP 5.9.0
        * str_contains(): since WP 5.9.0
        * str_starts_with(): since WP 5.9.0
        * str_ends_with(): since WP 5.9.0
        * array_is_list(): since WP 6.5.0
        -->
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.hash_hmacFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.json_encodeFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.json_decodeFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.hash_equalsFound"/>
        <exclude name="PHPCompatibility.Constants.NewConstants.json_pretty_printFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.json_last_error_msgFound"/>
        <exclude name="PHPCompatibility.Interfaces.NewInterfaces.jsonserializableFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_replace_recursiveFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.is_iterableFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.is_countableFound"/>
        <exclude name="PHPCompatibility.Constants.NewConstants.imagetype_webpFound"/>
        <exclude name="PHPCompatibility.Constants.NewConstants.img_webpFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_key_firstFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_key_lastFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.str_containsFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.str_starts_withFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.str_ends_withFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.array_is_listFound"/>

        <!--
        Contained in /wp-includes/spl-autoload-compat.php.

        History of the polyfills in WP:
        * spl_autoload_register(), spl_autoload_unregister() and spl_autoload_functions() were
          introduced in WP 4.6.0 and available up to WP 5.2.x. The polyfills were removed in WP 5.3.
        -->
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.spl_autoload_registerFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.spl_autoload_unregisterFound"/>
        <exclude name="PHPCompatibility.FunctionUse.NewFunctions.spl_autoload_functionsFound"/>
    </rule>

    <!--
    The ParagonieSodiumCompat ruleset includes the ParagonieRandomCompat ruleset.

    RandomCompat is contained in /wp-includes/random_compat/ since WP 4.4.0 and removed in WP 6.3.0
    SodiumCompat is contained in /wp-includes/sodium_compat/ since WP 5.2.0
    -->
    <rule ref="PHPCompatibilityParagonieSodiumCompat"/>

    <!-- Whitelist the WP Core mysql_to_rfc3339() function. -->
    <rule ref="PHPCompatibility.Extensions.RemovedExtensions">
        <properties>
            <!-- Contained in /wp-includes/functions.php. -->
            <property name="functionWhitelist" type="array">
                <element value="mysql_to_rfc3339"/>
            </property>
        </properties>
    </rule>

</ruleset>
