Skip to content

Commit 1d6e09d

Browse files
committed
PHP 8.1 | wp_xmlrpc_server::_insert_post(): fix passing null to non-nullable and more
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()`), but the default/fall-back values used in the function were not in line with the default/fall-back 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 would be `null`, this would overwrite the default value (see: https://3v4l.org/bfVlv ) and will 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. So for this commit, I've: * I've updated the default/fall-back values in the `$defaults` array only for those values where this would not lead to a change in the behaviour of the function. * I've also added 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/fall-back value as defined in `wp_insert_post()`. - or not be set and for those values which don't have a default/fall-back value in `wp_insert_post()`, `wp_insert_post()` 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. Includes 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 ```
1 parent b774a57 commit 1d6e09d

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

src/wp-includes/class-wp-xmlrpc-server.php

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1412,19 +1412,19 @@ protected function _insert_post( $user, $content_struct ) {
14121412
$defaults = array(
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,
14301430
'terms' => null,
@@ -1499,11 +1499,11 @@ protected function _insert_post( $user, $content_struct ) {
14991499
$post_data['post_author'] = $user->ID;
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
}
15091509

@@ -1681,6 +1681,14 @@ protected function _insert_post( $user, $content_struct ) {
16811681
*/
16821682
$post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct );
16831683

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+
);
1691+
16841692
$post_ID = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true );
16851693
if ( is_wp_error( $post_ID ) ) {
16861694
return new IXR_Error( 500, $post_ID->get_error_message() );

tests/phpunit/tests/date/xmlrpc.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,6 @@ public function tear_down() {
2424
* @covers wp_xmlrpc_server::mw_newPost
2525
*/
2626
public function test_date_new_post() {
27-
if ( PHP_VERSION_ID >= 80100 ) {
28-
/*
29-
* For the time being, ignoring PHP 8.1 "null to non-nullable" deprecations coming in
30-
* via hooked in filter functions until a more structural solution to the
31-
* "missing input validation" conundrum has been architected and implemented.
32-
*/
33-
$this->expectDeprecation();
34-
$this->expectDeprecationMessageMatches( '`Passing null to parameter \#[0-9]+ \(\$[^\)]+\) of type [^ ]+ is deprecated`' );
35-
}
36-
3727
$timezone = 'Europe/Helsinki';
3828
update_option( 'timezone_string', $timezone );
3929

0 commit comments

Comments
 (0)