Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Force the WordPress importer to update existing posts instead of skipping them
<?php
/**
* When using the WordPress Importer, update existing
* posts instead of skipping them. Updates content according
* to the import file even if the existing post was updated
* more recently.
*
* To use, drop this file into your /mu-plugins/ folder or
* copy this code into your functions.php file.
*/
class WPImporterUpdate {
protected $existing_post;
function __construct() {
add_filter( 'wp_import_existing_post', [ $this, 'wp_import_existing_post' ], 10, 2 );
add_filter( 'wp_import_post_data_processed', [ $this, 'wp_import_post_data_processed' ], 10, 2 );
}
function wp_import_existing_post( $post_id, $post ) {
if ( $this->existing_post = $post_id ) {
$post_id = 0; // force the post to be imported
}
return $post_id;
}
function wp_import_post_data_processed( $postdata, $post ) {
if ( $this->existing_post ) {
// update the existing post
$postdata['ID'] = $this->existing_post;
}
return $postdata;
}
}
new WPImporterUpdate;
@pardocorp

This comment has been minimized.

Copy link

pardocorp commented Jul 27, 2017

great function balbuf just a question, Do you know why the wp:meta_key are not updating?

@brucevdkooij

This comment has been minimized.

Copy link

brucevdkooij commented Apr 12, 2018

@pardocorp I think it might be because wordpress-importer uses add_post_meta instead of update_post_meta, so it's creating new postmeta entries. (see source code L836).

@balbuf

This comment has been minimized.

Copy link
Owner Author

balbuf commented Jun 15, 2018

@brucevdkooij @pardocorp I think that's correct, so assuming the post meta contained in the import file is complete for each post, you'd have to just clear out all existing post meta first (which could be done inside of this if block: https://gist.github.com/balbuf/d232769f1e7d66fe91b8ecd7795ef3cb#file-wordpress-import-update-php-L23-L25). It doesn't look like there is any other way to get the importer to use update_post_meta instead of add_post_meta

@ssuess

This comment has been minimized.

Copy link

ssuess commented Sep 1, 2018

Thanks for this code, it is VERY helpful! I reworked it a bit to delete/replace previous meta, and also to ignore if post_type is attachment (because it is very unlikely that they would have been replaced and it takes way longer to load them). If you are interested, my mods are here: https://gist.github.com/ssuess/09efc6431e91a89895ff6b4adf69e643

@vascofmdc

This comment has been minimized.

Copy link

vascofmdc commented May 30, 2019

Thanks for this. it worked like you said it would.

@ge022

This comment has been minimized.

Copy link

ge022 commented Nov 27, 2019

The post's comments were duplicated, not updated. How can I have the comments update instead of duplicate?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.