Within the duplicate_post_copy_post_meta_info function, you've got this:
/**
* Copy the meta information of a post to another post
*/
function duplicate_post_copy_post_meta_info($new_id, $post) {
$post_meta_keys = get_post_custom_keys($post->ID);
if (empty($post_meta_keys)) return;
$meta_blacklist = explode(",",get_option('duplicate_post_blacklist'));
if ($meta_blacklist == "") $meta_blacklist = array();
$meta_keys = array_diff($post_meta_keys, $meta_blacklist);
foreach ($meta_keys as $meta_key) {
$meta_values = get_post_custom_values($meta_key, $post->ID);
foreach ($meta_values as $meta_value) {
$meta_value = maybe_unserialize($meta_value);
add_post_meta($new_id, $meta_key, $meta_value);
}
}
}
Would you be opposed to modifying it to use update_post_meta like this?
/**
* Copy the meta information of a post to another post
*/
function duplicate_post_copy_post_meta_info($new_id, $post) {
$post_meta_keys = get_post_custom_keys($post->ID);
if (empty($post_meta_keys)) return;
$meta_blacklist = explode(",",get_option('duplicate_post_blacklist'));
if ($meta_blacklist == "") $meta_blacklist = array();
$meta_keys = array_diff($post_meta_keys, $meta_blacklist);
foreach ($meta_keys as $meta_key) {
$meta_values = get_post_custom_values($meta_key, $post->ID);
foreach ($meta_values as $meta_value) {
$meta_value = maybe_unserialize($meta_value);
if ( 1 == count( $meta_values ) )
update_post_meta( $new_id, $meta_key, $meta_value );
else
add_post_meta( $new_id, $meta_key, $meta_value );
}
}
}
Or perhaps, just using delete_post_meta for each $meta_key like this?
/**
* Copy the meta information of a post to another post
*/
function duplicate_post_copy_post_meta_info($new_id, $post) {
$post_meta_keys = get_post_custom_keys($post->ID);
if (empty($post_meta_keys)) return;
$meta_blacklist = explode(",",get_option('duplicate_post_blacklist'));
if ($meta_blacklist == "") $meta_blacklist = array();
$meta_keys = array_diff($post_meta_keys, $meta_blacklist);
foreach ($meta_keys as $meta_key) {
delete_post_meta( $post->ID, $meta_key );
$meta_values = get_post_custom_values($meta_key, $post->ID);
foreach ($meta_values as $meta_value) {
$meta_value = maybe_unserialize($meta_value);
add_post_meta($new_id, $meta_key, $meta_value);
}
}
}
By doing either of these (delete_post_meta would probably be preferred), you should be safe from plugin conflicts that hook into save_post to add their own meta, effectively preventing duplicate keys (since this is a straight duplicate of all keys not blacklisted)