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:
-
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. -
The
$content['post_content']
value is slashed (e.g.src="..."
becomessrc=\"...\"
), 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)
-
Remove the
add_filter( 'the_content', 'adding_image_dimensions' );
-
Call the original
adding_image_dimensions()
function in thewp_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; }