Make WordPress Core


Ignore:
Timestamp:
09/27/2022 02:16:28 AM (4 years ago)
Author:
SergeyBiryukov
Message:

Code Modernization: Fix null to non-nullable deprecations in wp_xmlrpc_server::_insert_post().

The wp_xmlrpc_server::_insert_post() method creates a new post via wp_insert_post() or updates an existing one via wp_update_post(), which subsequently calls wp_insert_post(). However, the default/fallback values used in the function were not in line with the default/fallback values used in the wp_insert_post() function.

The wp_insert_post() function does a wp_parse_args() (array merge) of the received arguments with the defaults. If any of the received arguments are null, this would overwrite the default value, as seen in array_merge() example, and lead to "passing null to non-nullable" deprecation notices on PHP 8.1 for certain arguments.

Unfortunately, the conditional logic within the wp_xmlrpc_server::_insert_post() function itself often uses an isset() to trigger certain code blocks, so syncing the defaults with those used in the wp_insert_post() function was not an option.

This commit:

  • Updates the default/fallback values in the $defaults array only for those values where this would not lead to a change in the behavior of the function.
  • Adds a safeguard function, filtering out all remaining null values from the $post_data array before it is passed on to the wp_insert_post() or wp_update_post() functions. Removing those values is safe as this means that these array keys will now:
    • either be set to the default/fallback value as defined in wp_insert_post().
    • or not be set and for those values which don't have a default/fallback value in wp_insert_post(), the function does an ! empty() or isset() check anyway and those array keys not being defined means that the result of those checks will remain the same.

Includes

  • Removing a couple of conditions which are now redundant.
  • Removing an expectDeprecation() in the Tests_Date_XMLRPC test class, which is now no longer needed.

Fixes various errors along the lines of:

36) Tests_XMLRPC_wp_newPost::test_no_content
json_decode(): Passing null to parameter #1 ($json) of type string is deprecated

/var/www/src/wp-includes/kses.php:2074
/var/www/src/wp-includes/class-wp-hook.php:307
/var/www/src/wp-includes/plugin.php:205
/var/www/src/wp-includes/post.php:2835
/var/www/src/wp-includes/post.php:2720
/var/www/src/wp-includes/post.php:4066
/var/www/src/wp-includes/class-wp-xmlrpc-server.php:1683
/var/www/src/wp-includes/class-wp-xmlrpc-server.php:1347
/var/www/tests/phpunit/tests/xmlrpc/wp/newPost.php:25
/var/www/vendor/bin/phpunit:123

Follow-up to [1563], [4793], [7900], [16824], [19848], [19873], [20632], [40677], [51968], [54320].

Props jrf.
See #55656.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-xmlrpc-server.php

    r54320 r54321  
    14131413                        'post_status'    => 'draft',
    14141414                        'post_type'      => 'post',
    1415                         'post_author'    => null,
    1416                         'post_password'  => null,
    1417                         'post_excerpt'   => null,
    1418                         'post_content'   => null,
    1419                         'post_title'     => null,
    1420                         'post_date'      => null,
    1421                         'post_date_gmt'  => null,
     1415                        'post_author'    => 0,
     1416                        'post_password'  => '',
     1417                        'post_excerpt'   => '',
     1418                        'post_content'   => '',
     1419                        'post_title'     => '',
     1420                        'post_date'      => '',
     1421                        'post_date_gmt'  => '',
    14221422                        'post_format'    => null,
    14231423                        'post_name'      => null,
    14241424                        'post_thumbnail' => null,
    1425                         'post_parent'    => null,
    1426                         'ping_status'    => null,
    1427                         'comment_status' => null,
     1425                        'post_parent'    => 0,
     1426                        'ping_status'    => '',
     1427                        'comment_status' => '',
    14281428                        'custom_fields'  => null,
    14291429                        'terms_names'    => null,
     
    15001500                }
    15011501
    1502                 if ( isset( $post_data['comment_status'] ) && 'open' !== $post_data['comment_status'] && 'closed' !== $post_data['comment_status'] ) {
     1502                if ( 'open' !== $post_data['comment_status'] && 'closed' !== $post_data['comment_status'] ) {
    15031503                        unset( $post_data['comment_status'] );
    15041504                }
    15051505
    1506                 if ( isset( $post_data['ping_status'] ) && 'open' !== $post_data['ping_status'] && 'closed' !== $post_data['ping_status'] ) {
     1506                if ( 'open' !== $post_data['ping_status'] && 'closed' !== $post_data['ping_status'] ) {
    15071507                        unset( $post_data['ping_status'] );
    15081508                }
     
    16811681                 */
    16821682                $post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct );
     1683
     1684                // Remove all null values to allow for using the insert/update post default values for those keys instead.
     1685                $post_data = array_filter(
     1686                        $post_data,
     1687                        static function ( $value ) {
     1688                                return null !== $value;
     1689                        }
     1690                );
    16831691
    16841692                $post_ID = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true );
Note: See TracChangeset for help on using the changeset viewer.