142 lines
3.8 KiB
PHP
142 lines
3.8 KiB
PHP
<?php
|
|
|
|
trait Brizy_Editor_AutoSaveAware {
|
|
|
|
/**
|
|
* @param WP_Post $post
|
|
* @param $callaback
|
|
*
|
|
* @return bool|WP_Error
|
|
*/
|
|
public function auto_save_post( \WP_Post $post, $callaback ) {
|
|
try {
|
|
$user_id = get_current_user_id();
|
|
$postParentId = $post->post_parent;
|
|
$old_autosave = $this->getLastAutosave( $postParentId?$postParentId:$post->ID, $user_id );
|
|
$post_data = get_object_vars( $post );
|
|
$post_data['post_content'] .= "\n<!-- " . time() . "-->";
|
|
$autosavePost = null;
|
|
|
|
if ( $old_autosave ) {
|
|
$autosavePost = self::get( $old_autosave );
|
|
}
|
|
|
|
if ( $old_autosave ) {
|
|
$new_autosave = _wp_post_revision_data( $post_data, true );
|
|
$new_autosave['ID'] = $old_autosave;
|
|
$new_autosave['post_author'] = $user_id;
|
|
|
|
// If the new autosave has the same content as the post, delete the autosave.
|
|
$autosave_is_different = false;
|
|
|
|
foreach ( array_intersect( array_keys( $new_autosave ), array_keys( _wp_post_revision_fields( $post ) ) ) as $field ) {
|
|
if ( normalize_whitespace( $new_autosave[ $field ] ) != normalize_whitespace( $post->$field ) ) {
|
|
$autosave_is_different = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( ! $autosave_is_different ) {
|
|
wp_delete_post_revision( $old_autosave );
|
|
|
|
return new WP_Error( 'rest_autosave_no_changes', __( 'There is nothing to save. The autosave and the post content are the same.' ), array( 'status' => 400 ) );
|
|
}
|
|
|
|
/**
|
|
* This filter is documented in wp-admin/post.php.
|
|
*/
|
|
do_action( 'wp_creating_autosave', $new_autosave );
|
|
|
|
// wp_update_post expects escaped array.
|
|
wp_update_post( wp_slash( $new_autosave ) );
|
|
|
|
} else {
|
|
// Create the new autosave as a special post revision.
|
|
$revId = _wp_put_post_revision( $post_data, true );
|
|
$autosavePost = self::get( $revId );
|
|
}
|
|
|
|
$callaback( $autosavePost );
|
|
|
|
} catch ( Exception $exception ) {
|
|
Brizy_Logger::instance()->exception( $exception );
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $postId
|
|
* @param $userId
|
|
*
|
|
* @return int|void|null
|
|
* @throws Exception
|
|
*/
|
|
public static function getAutoSavePost( $postId, $userId ) {
|
|
$postParentId = wp_get_post_parent_id( $postId );
|
|
$autosave = wp_get_post_autosave( $postParentId ?$postParentId:$postId, $userId );
|
|
|
|
if ( ! $autosave ) {
|
|
return;
|
|
}
|
|
|
|
$post = get_post( $postId );
|
|
|
|
$postDate = new DateTime( $post->post_modified );
|
|
$autosaveDate = new DateTime( $autosave->post_modified );
|
|
|
|
if ( $postDate > $autosaveDate ) {
|
|
return null;
|
|
}
|
|
|
|
return $autosave->ID;
|
|
}
|
|
|
|
/**
|
|
* @param int $postParentId
|
|
*/
|
|
private function deleteOldAutoSaves( $postParentId ) {
|
|
global $wpdb;
|
|
$user_id = get_current_user_id();
|
|
|
|
$wpdb->query( $wpdb->prepare( "
|
|
DELETE p, pm FROM {$wpdb->posts} p
|
|
INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.id
|
|
WHERE p.post_author = %d and
|
|
p.post_parent = %d and
|
|
p.post_type = 'revision' and
|
|
p.post_name LIKE %s", $user_id, $postParentId, "{$postParentId}-autosave%" ) );
|
|
}
|
|
|
|
/**
|
|
* @param int $postParentId
|
|
* @param int $user_id
|
|
*
|
|
* @return int
|
|
*/
|
|
protected function getLastAutosave( $postParentId, $user_id ) {
|
|
global $wpdb;
|
|
|
|
$postParentId = (int) $postParentId;
|
|
$user_id = (int) $user_id;
|
|
|
|
$query = sprintf( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_type= 'revision' AND post_status= 'inherit'AND post_name LIKE '%d-autosave%%'", $postParentId, $postParentId );
|
|
|
|
if ( is_integer( $user_id ) ) {
|
|
$query .= " AND post_author={$user_id}";
|
|
}
|
|
|
|
$query .= " ORDER BY post_date DESC";
|
|
|
|
return (int) $wpdb->get_var( $query );
|
|
|
|
}
|
|
|
|
/**
|
|
* @return mixed
|
|
*/
|
|
abstract protected function populateAutoSavedData( $autosave );
|
|
|
|
}
|