Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add garbage collection cleanup admin and cron job #227

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
c4d2efa
Add garbage collection cleanup admin and cron job
markkelnar Jul 11, 2023
ebe21a2
Delete in smaller batch events instead of all posts
markkelnar Jul 12, 2023
dc3db02
bump some version numbers
markkelnar Jul 14, 2023
63d3716
Add tests for admin settings garbage collection options
markkelnar Jul 14, 2023
81b4885
Add garbage collection unit tests
markkelnar Jul 14, 2023
e9166b8
Merge remote-tracking branch 'origin/main' into feature/garbage-colle…
markkelnar Jul 14, 2023
456d979
Get age from settings value in utils class
markkelnar Jul 14, 2023
9ff1e21
Add admin editor ability to skip garbage collection per query
markkelnar Jul 14, 2023
378ebed
Add tax_query to gargage collection to ignore where docs opt out
markkelnar Jul 18, 2023
1334dfc
Rename garbage collection class
markkelnar Jul 18, 2023
025b7c7
Add groups collection for documents. Refactor garbage collection to i…
markkelnar Jul 20, 2023
f8e6a7a
fix code sniff white space
markkelnar Jul 20, 2023
72dd923
Update gc text in graphql settings to talk about groups
markkelnar Jul 20, 2023
0f7baaa
Add the word "delete" to text
markkelnar Jul 20, 2023
c99ab11
Merge remote-tracking branch 'origin/main' into feature/garbage-colle…
markkelnar Jul 21, 2023
614a874
Use garbage_collect instead of gc
markkelnar Jul 24, 2023
a55d6e9
text description change.
markkelnar Jul 24, 2023
037df6e
snake case function name
markkelnar Jul 24, 2023
5af7178
Merge remote-tracking branch 'me/feature/garbage-collect-aged-queries…
markkelnar Jul 24, 2023
55fc784
fix for consistent names
markkelnar Jul 24, 2023
514894a
enable admin quick-edit for document groups
markkelnar Jul 24, 2023
b65efd9
Merge remote-tracking branch 'origin/main' into feature/garbage-colle…
markkelnar Jul 25, 2023
22cf8f5
Merge commit '9a023bfd9243b02f80861c56fab9c20d04c4a79a' into feature/…
jasonbahl Jul 25, 2023
35168d9
re-add allow-plugin for codesniffer-installer
markkelnar Jul 26, 2023
294bbee
Merge remote-tracking branch 'me/feature/garbage-collect-aged-queries…
markkelnar Jul 26, 2023
19923e0
add filter for garbage collect recurrence
markkelnar Jul 26, 2023
2495e72
merge fixes
markkelnar Jul 28, 2023
3a7f141
composer update
markkelnar Jul 28, 2023
92dbc42
Merge branch 'main' into feature/garbage-collect-aged-queries
jasonbahl Aug 9, 2023
7923d53
fix phpstan suggestions
markkelnar Aug 9, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions src/Admin/Settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,49 @@ function () {
]
);

register_graphql_settings_field(
'graphql_persisted_queries_section',
[
'name' => 'garbage_collection_toggle',
'label' => __( 'Clean Up Queries', 'wp-graphql-smart-cache' ),
'desc' => __( 'Toggle on to enable garbage collection of saved queries older than number of days specified below', 'wp-graphql-smart-cache' ),
'type' => 'checkbox',
'default' => 'off',
'sanitize_callback' => function ( $value ) {
/**
* When enable garbage collection,
* schedule the garbage collection action/event to run once daily.
* Otherwise remove it.
*/
if ( 'on' === $value ) {
if ( ! wp_next_scheduled( 'wp_graphql_smart_cache_query_cleanup' ) ) {
// Add scheduled job to run in one minute
wp_schedule_event( time() + 60, 'daily', 'wp_graphql_smart_cache_query_cleanup' );
}
} else {
wp_clear_scheduled_hook( 'wp_graphql_smart_cache_query_cleanup' );
}
return $value;
},
]
);

register_graphql_settings_field(
'graphql_persisted_queries_section',
[
'name' => 'garbage_collection_age',
'desc' => __( 'Age, in number of days, of saved query when it will be removed', 'wp-graphql-smart-cache' ),
'type' => 'number',
'default' => '30',
'sanitize_callback' => function ( $value ) {
if ( 1 > $value || ! is_numeric( $value ) ) {
return null;
}
return (int) $value;
},
]
);

// Add a tab section to the graphql admin settings page
register_graphql_settings_section(
'graphql_cache_section',
Expand Down
24 changes: 24 additions & 0 deletions src/Utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,30 @@ public static function getPostByTermName( $query_id, $type, $taxonomy ) {
return $post;
}

/**
* @param integer $days_ago Posts older than this many days ago will be deleted.
*
* @return [WP_Post]
*/
public static function getDocumentsBeforeDays( $days_ago = 30 ) {
$wp_query = new \WP_Query(
[
'post_type' => Document::TYPE_NAME,
'post_status' => 'publish',
'posts_per_page' => -1,
markkelnar marked this conversation as resolved.
Show resolved Hide resolved
'fields' => 'ids',
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => $days_ago . ' days ago',
],
],
]
);

return $wp_query->get_posts();
}

/**
* Generate query hash for graphql query string
*
Expand Down
26 changes: 26 additions & 0 deletions wp-graphql-smart-cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -273,3 +273,29 @@ function appsero_init_tracker_wpgraphql_smart_cache() {
}

appsero_init_tracker_wpgraphql_smart_cache();

/**
* When the garbage collection event runs daily, cleanup aged out jobs.
*/
add_action( 'wp_graphql_smart_cache_query_cleanup', function() {
// Check that the clean up toggle is still enabled.
$garbage_toggle = get_graphql_setting( 'garbage_collection_toggle', null, 'graphql_persisted_queries_section' );

// Only run the event when the toggle is enabled.
if ( 'on' !== $garbage_toggle ) {
// Remove the scheduled cron job from firing again if the toggle is not on.
wp_clear_scheduled_hook( 'wp_graphql_smart_cache_query_cleanup' );
return;
}

$age = get_graphql_setting( 'garbage_collection_age', null, 'graphql_persisted_queries_section' );
if ( 1 >= $age || ! is_numeric( $age )) {
markkelnar marked this conversation as resolved.
Show resolved Hide resolved
return;
}

$posts = Utils::getDocumentsBeforeDays( $age );
foreach ( $posts as $post_id ) {
wp_delete_post( $post_id );
}

}, 10);