@param bool $permanently_delete Whether to permanently delete the copy. Defaults to true.
*
* @return void
*/
public function delete_copy( $copy_id, $post_id = null, $permanently_delete = true ) {
/**
* Fires before deleting a Rewrite & Republish copy.
*
* @param int $copy_id The copy's ID.
* @param int $post_id The original post's ID..
*/
\do_action( 'duplicate_post_after_rewriting', $copy_id, $post_id );
// Delete the copy bypassing the trash so it also deletes the copy post meta.
\wp_delete_post( $copy_id, $permanently_delete );
if ( ! \is_null( $post_id ) ) {
// Delete the meta that marks the original post has having a copy.
\delete_post_meta( $post_id, '_dp_has_rewrite_republish_copy' );
}
}
/**
* Republishes the post elements overwriting the original post.
*
* @param WP_Post $post The post object.
* @param WP_Post $original_post The original post.
*
* @return void
*/
protected function republish_post_elements( $post, $original_post ) {
// Cast to array and not alter the copy's original object.
$post_to_be_rewritten = clone $post;
// Prepare post data for republishing.
$post_to_be_rewritten->ID = $original_post->ID;
$post_to_be_rewritten->post_name = $original_post->post_name;
$post_to_be_rewritten->post_status = $this->determine_post_status( $post, $original_post );
/**
* Yoast SEO and other plugins prevent from accidentally updating another post's
* data (e.g. the Yoast SEO metadata by checking the $_POST data ID with the post object ID.
* We need to overwrite the $_POST data ID to allow updating the original post.
*/
$_POST['ID'] = $original_post->ID;
// Republish the original post.
$rewritten_post_id = \wp_update_post( $post_to_be_rewritten );
if ( $rewritten_post_id === 0 ) {
\wp_die( \esc_html__( 'An error occurred while republishing the post.', 'duplicate-post' ) );
}
}
/**
* Republishes the post taxonomies overwriting the ones of the original post.
*
* @param WP_Post $post The copy's post object.
*
* @return void
*/
protected function republish_post_taxonomies( $post ) {
$original_post_id = Utils::get_original_post_id( $post->ID );
$copy_taxonomies_options = [
'taxonomies_excludelist' => [],
'use_filters' => false,
'copy_format' => true,
];
$this->post_duplicator->copy_post_taxonomies( $original_post_id, $post, $copy_taxonomies_options );
}
/**
* Republishes the post meta overwriting the ones of the original post.
*
* @param WP_Post $post The copy's post object.
*
* @return void
*/
protected function republish_post_meta( $post ) {
$original_post_id = Utils::get_original_post_id( $post->ID );
$copy_meta_options = [
'meta_excludelist' => Utils::get_default_filtered_meta_names(),
'use_filters' => false,
'copy_thumbnail' => true,
'copy_template' => true,
];
$this->post_duplicator->copy_post_meta_info( $original_post_id, $post, $copy_meta_options );
}
/**
* Redirects the user to the original post.
*
* @param int $original_post_id The ID of the original post to redirect to.
* @param int $copy_id The ID of the copy post.
*
* @return void
*/
protected function redirect( $original_post_id, $copy_id ) {
\wp_safe_redirect(
\add_query_arg(
[
'dprepublished' => 1,
'dpcopy' => $copy_id,
'dpnonce' => \wp_create_nonce( 'dp-republish' ),
],
\admin_url( 'post.php?action=edit&post=' . $original_post_id )
)
);
exit();
}
/**
* Determines the post status to use when publishing the Rewrite & Republish copy.
*
* @param WP_Post $post The post object.
* @param WP_Post $original_post The original post object.
*
* @return string The post status to use.
*/
protected function determine_post_status( $post, $original_post ) {
if ( $original_post->post_status === 'trash' ) {
return 'trash';
}
if ( $post->post_status === 'private' ) {
return 'private';
}
return 'publish';
}
/**
* Deletes the original post meta that flags it as having a copy when the copy is manually deleted.
*
* @param int $post_id Post ID of a post that is going to be deleted.
*
* @return void
*/
public function clean_up_when_copy_manually_deleted( $post_id ) {
$post = \get_post( $post_id );
if ( ! $this->permissions_helper->is_rewrite_and_republish_copy( $post ) ) {
return;
}
$original_post_id = Utils::get_original_post_id( $post_id );
\delete_post_meta( $original_post_id, '_dp_has_rewrite_republish_copy' );
}
}