Convert code – not work

I changed it a little.

But the code doesn’t work for some reason 🙁

You should explain what exactly happened or did not happen that should have happened, rather than simply saying “doesn’t work”.

But anyway, if the first and fifth lines below were the only changes you applied in the code:

add_action( 'wp_insert_post_data', 'adding_image_dimensions' );

function adding_image_dimensions( $content ) {

$content = $content['post_content'];

Then that indeed would not give you the expected outcome (e.g. no <img> tag would be replaced because the second preg_match_all() call would fail), and here’s why:

  1. The function is now hooked on the wp_insert_post_data filter, so the function should return an array of post data, and yet in your code, the fifth line (i.e. $content = $content['post_content'];) actually changes the return value to a string.

  2. The $content['post_content'] value is slashed (e.g. src="..." becomes src=\"...\"), so you should first unslash the value and then slash it back after the image tags are processed.

How can you fix the issues

To make the adding_image_dimensions() function works with the wp_insert_post_data filter instead, you can try the following:

// 1: Rename the $content to $data
function adding_image_dimensions( $data ) {
    // 2: Unslash the post content.
    $content = wp_unslash( $data['post_content'] );

    preg_match_all( '/<img[^>]+>/i', $content, $images);

    if (count($images) < 1) {
        // 3: Return the $data and not $content.
        return $data;
    }

    foreach ($images[0] as $image) {
        // ... your code here.
    }

    // 4: Slash back the post content.
    $data['post_content'] = wp_slash( $content );

    // 5: Return the $data and not $content.
    return $data;
}

Alternate Solution (without having to “convert” or modify the custom function)

  1. Remove the add_filter( 'the_content', 'adding_image_dimensions' );

  2. Call the original adding_image_dimensions() function in the wp_insert_post_data hook:

    // * use add_filter() and not add_action()
    add_filter( 'wp_insert_post_data', 'my_wp_insert_post_data' );
    
    function my_wp_insert_post_data( $data ) {
        $content = adding_image_dimensions( wp_unslash( $data['post_content'] ) ); // pass an *unslashed* content
        $data['post_content'] = wp_slash( $content ); // then slash back the content
        return $data;
    }
    

tech