123 lines
2.7 KiB
PHP
123 lines
2.7 KiB
PHP
<?php
|
|
namespace ElementorPro\Modules\Notes;
|
|
|
|
use ElementorPro\Plugin;
|
|
use ElementorPro\Modules\Notes\Database\Models\Note;
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit; // Exit if accessed directly.
|
|
}
|
|
|
|
class Document_Events {
|
|
|
|
/**
|
|
* Register all the actions
|
|
*/
|
|
public function register() {
|
|
add_action( 'updated_post_meta', function ( $_, $post_id, $meta_key ) {
|
|
$this->clear_after_post_meta_update( $post_id, $meta_key );
|
|
}, 10, 3 );
|
|
|
|
add_action( 'deleted_post_meta', function ( $_, $post_id, $meta_key ) {
|
|
$this->clear_after_post_meta_update( $post_id, $meta_key );
|
|
}, 10, 3 );
|
|
|
|
add_action( 'deleted_post', function ( $post_id ) {
|
|
$this->clear_after_post_deleted( $post_id );
|
|
} );
|
|
|
|
add_action( 'trashed_post', function ( $post_id ) {
|
|
$this->move_to_trash_after_post_trashed( $post_id );
|
|
} );
|
|
|
|
add_action( 'untrashed_post', function ( $post_id ) {
|
|
$this->restore_from_trash_after_post_untrashed( $post_id );
|
|
} );
|
|
}
|
|
|
|
/**
|
|
* Remove all the notes that their elements is not exist in the document anymore.
|
|
*
|
|
* @param $post_id
|
|
* @param $meta_key
|
|
*/
|
|
private function clear_after_post_meta_update( $post_id, $meta_key ) {
|
|
if ( '_elementor_data' !== $meta_key ) {
|
|
return;
|
|
}
|
|
|
|
$document = Plugin::elementor()->documents->get( $post_id );
|
|
|
|
if ( ! $document || $document->is_revision() ) {
|
|
return;
|
|
}
|
|
|
|
$elements_ids = $this->get_elements_ids(
|
|
$document->get_elements_data()
|
|
);
|
|
|
|
Note::query()
|
|
->where( 'post_id', '=', $document->get_id() )
|
|
->where_not_in( 'element_id', $elements_ids )
|
|
->delete( true );
|
|
}
|
|
|
|
/**
|
|
* Remove all the notes that related to the post that was deleted.
|
|
*
|
|
* @param $post_id
|
|
*/
|
|
private function clear_after_post_deleted( $post_id ) {
|
|
Note::query()
|
|
->where( 'post_id', '=', $post_id )
|
|
->delete( true );
|
|
}
|
|
|
|
/**
|
|
* Move notes to trash when their post trashed.
|
|
*
|
|
* @param $post_id
|
|
*/
|
|
private function move_to_trash_after_post_trashed( $post_id ) {
|
|
Note::query()
|
|
->where( 'post_id', '=', $post_id )
|
|
->trash();
|
|
}
|
|
|
|
/**
|
|
* Restore notes when their post untrashed.
|
|
*
|
|
* @param $post_id
|
|
*/
|
|
private function restore_from_trash_after_post_untrashed( $post_id ) {
|
|
Note::query()
|
|
->where( 'post_id', '=', $post_id )
|
|
->restore();
|
|
}
|
|
|
|
/**
|
|
* Get recursively all the ids of the elements.
|
|
*
|
|
* @param $elements
|
|
*
|
|
* @return array
|
|
*/
|
|
private function get_elements_ids( $elements ) {
|
|
if ( empty( $elements ) ) {
|
|
return [];
|
|
}
|
|
|
|
return array_reduce( $elements, function ( $ids, $element ) {
|
|
if ( empty( $element['id'] ) ) {
|
|
return $ids;
|
|
}
|
|
|
|
return array_merge(
|
|
$ids,
|
|
[ $element['id'] ],
|
|
empty( $element['elements'] ) ? [] : $this->get_elements_ids( $element['elements'] )
|
|
);
|
|
}, [] );
|
|
}
|
|
}
|