Skip to content
This repository has been archived by the owner on Dec 27, 2022. It is now read-only.

Cleanup nav menu created posts if its reference doesn't exists #135

Merged
merged 3 commits into from Jun 12, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion dev-lib
62 changes: 62 additions & 0 deletions php/class-customize-snapshot-manager.php
Expand Up @@ -107,6 +107,8 @@ function hooks() {
add_action( 'save_post_' . $this->get_post_type(), array( $this, 'create_initial_changeset_revision' ) );
add_action( 'save_post_' . $this->get_post_type(), array( $this, 'save_customizer_state_query_vars' ) );
add_filter( 'wp_insert_post_data', array( $this, 'prepare_snapshot_post_content_for_publish' ) );
remove_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );
add_action( 'delete_post', array( $this, 'clean_up_nav_menus_created_auto_drafts' ) );
}

/**
Expand Down Expand Up @@ -966,4 +968,64 @@ public function save_customizer_state_query_vars( $post_id ) {

$this->post_type->set_customizer_state_query_vars( $post_id, $original_query_vars );
}

/**
* Clean up auto-draft post created by Nav menus on changeset delete.
*
* @param int $changeset_post_id Deleting changeset post id.
*/
public function clean_up_nav_menus_created_auto_drafts( $changeset_post_id ) {
global $wpdb;
$changeset_post = get_post( $changeset_post_id );

if ( ! ( $changeset_post instanceof \WP_Post ) || $changeset_post->post_type !== $this->get_post_type() ) {
return;
}

$data = json_decode( $changeset_post->post_content, true );
if ( empty( $data['nav_menus_created_posts']['value'] ) ) {
return;
}
remove_action( 'delete_post', array( $this, 'clean_up_nav_menus_created_auto_drafts' ) );
foreach ( $data['nav_menus_created_posts']['value'] as $nav_menu_created_post_id ) {
if ( 'auto-draft' !== get_post_status( $nav_menu_created_post_id ) ) {
continue;
}

/**
* If we have Customize post plugin then it will take care of post delete see: https://github.com/xwp/wp-customize-posts/pull/348
* because it overrides nav_menus_created_posts data.
*
* @See WP_Customize_Posts:filter_out_nav_menus_created_posts_for_customized_posts()
*/
if ( ! class_exists( 'Customize_Posts_Plugin' ) ) {
// If customize post plugin is not installed we search for nav_menus_created_posts and lookup for reference via php code.
// Todo: Improve logic to find reference below.
$query = $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND ID != %d ", $this->get_post_type(), $changeset_post_id );
$query .= $wpdb->prepare( ' AND post_content LIKE %s AND post_content LIKE %s LIMIT 50', '%' . $wpdb->esc_like( '"nav_menus_created_posts":' ) . '%', '%' . $nav_menu_created_post_id . '%' );
$post_ids = $wpdb->get_col( $query ); // WPCS: unprepared SQL ok.
$should_delete = true;
if ( ! empty( $post_ids ) && is_array( $post_ids ) ) {
foreach ( $post_ids as $p_id ) {
$p = get_post( $p_id );
if ( ! ( $p instanceof \WP_Post ) ) {
continue;
}
$content = json_decode( $p->post_content, true );
if ( empty( $content['nav_menus_created_posts']['value'] ) ) {
continue;
}
if ( false !== array_search( $nav_menu_created_post_id, $content['nav_menus_created_posts']['value'] ) ) {
$should_delete = false;
break;
}
}
}
if ( $should_delete ) {
wp_delete_post( $nav_menu_created_post_id, true );
}
}
} // End foreach().
add_action( 'delete_post', array( $this, 'clean_up_nav_menus_created_auto_drafts' ) );
}
}
38 changes: 38 additions & 0 deletions tests/php/test-class-customize-snapshot-manager.php
Expand Up @@ -244,6 +244,7 @@ function test_hooks() {
$this->assertEquals( 10, has_action( 'save_post_' . $manager->get_post_type(), array( $manager, 'create_initial_changeset_revision' ) ) );
$this->assertEquals( 10, has_action( 'save_post_' . $manager->get_post_type(), array( $manager, 'save_customizer_state_query_vars' ) ) );
$this->assertEquals( 10, has_filter( 'wp_insert_post_data', array( $manager, 'prepare_snapshot_post_content_for_publish' ) ) );
$this->assertEquals( 10, has_action( 'delete_post', array( $manager, 'clean_up_nav_menus_created_auto_drafts' ) ) );
}

/**
Expand Down Expand Up @@ -785,4 +786,41 @@ public function test_save_customizer_state_query_vars() {
) );
$this->assertEmpty( $this->manager->post_type->get_customizer_state_query_vars( $post_id ) );
}

/**
* Test clean_up_nav_menus_created_auto_drafts
*
* @convers \CustomizeSnapshots\Customize_Snapshot_Manager::clean_up_nav_menus_created_auto_drafts()
*/
public function test_clean_up_nav_menus_created_auto_drafts() {
$nav_created_post_ids = $this->factory()->post->create_many( 2, array(
'post_status' => 'auto-draft',
) );
$data = array(
'nav_menus_created_posts' => array(
'value' => $nav_created_post_ids,
),
);
wp_set_current_user( self::factory()->user->create( array(
'role' => 'administrator',
) ) );
$post_id = $this->manager->post_type->save( array(
'uuid' => Customize_Snapshot_Manager::generate_uuid(),
'data' => $data,
'status' => 'draft',
) );
$copy_post_id = $this->manager->post_type->save( array(
'uuid' => Customize_Snapshot_Manager::generate_uuid(),
'data' => $data,
'status' => 'draft',
) );
$this->assertInstanceOf( 'WP_Post', get_post( $nav_created_post_ids[0] ) );
$this->assertInstanceOf( 'WP_Post', get_post( $nav_created_post_ids[1] ) );
wp_delete_post( $post_id, true );
$this->assertInstanceOf( 'WP_Post', get_post( $nav_created_post_ids[0] ) );
$this->assertInstanceOf( 'WP_Post', get_post( $nav_created_post_ids[1] ) );
wp_delete_post( $copy_post_id, true );
$this->assertNotInstanceOf( 'WP_Post', get_post( $nav_created_post_ids[0] ) );
$this->assertNotInstanceOf( 'WP_Post', get_post( $nav_created_post_ids[1] ) );
}
}