-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Improve cache and performance of get_user_data_from_wp_global_styles.
#42152
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,6 +16,83 @@ | |
| * @access private | ||
| */ | ||
| class WP_Theme_JSON_Resolver_6_1 extends WP_Theme_JSON_Resolver_6_0 { | ||
| /** | ||
| * Returns the custom post type that contains the user's origin config | ||
| * for the current theme or a void array if none are found. | ||
| * | ||
| * This can also create and return a new draft custom post type. | ||
| * | ||
| * @param WP_Theme $theme The theme object. If empty, it | ||
| * defaults to the current theme. | ||
| * @param bool $create_post Optional. Whether a new custom post | ||
| * type should be created if none are | ||
| * found. False by default. | ||
| * @param array $post_status_filter Filter Optional. custom post type by | ||
| * post status. ['publish'] by default, | ||
| * so it only fetches published posts. | ||
| * @return array Custom Post Type for the user's origin config. | ||
| */ | ||
| public static function get_user_data_from_wp_global_styles( $theme, $create_post = false, $post_status_filter = array( 'publish' ) ) { | ||
| if ( ! $theme instanceof WP_Theme ) { | ||
| $theme = wp_get_theme(); | ||
| } | ||
| $user_cpt = array(); | ||
| $post_type_filter = 'wp_global_styles'; | ||
| $args = array( | ||
| 'posts_per_page' => 1, | ||
| 'orderby' => 'post_date', | ||
| 'order' => 'desc', | ||
| 'post_type' => $post_type_filter, | ||
| 'post_status' => $post_status_filter, | ||
| 'tax_query' => array( | ||
| array( | ||
| 'taxonomy' => 'wp_theme', | ||
| 'field' => 'name', | ||
| 'terms' => $theme->get_stylesheet(), | ||
| ), | ||
| ), | ||
| 'ignore_sticky_posts' => true, | ||
| 'no_found_rows' => true, | ||
| ); | ||
|
|
||
| $cache_key = sprintf( 'wp_global_styles_%s', md5( serialize( $args ) ) ); | ||
| $post_id = (int) get_transient( $cache_key ); | ||
| // Special case: '-1' is a results not found. | ||
| if ( -1 === $post_id && ! $create_post ) { | ||
| return $user_cpt; | ||
| } | ||
|
|
||
| if ( $post_id > 0 && in_array( get_post_status( $post_id ), (array) $post_status_filter, true ) ) { | ||
| return get_post( $post_id, ARRAY_A ); | ||
| } | ||
|
Comment on lines
+65
to
+67
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Improve handling of post status changed. If this post is deleted or changed to draft. |
||
|
|
||
| $gs_query = new WP_Query(); | ||
| $recent_posts = $gs_query->query( $args ); | ||
| if ( count( $recent_posts ) === 1 ) { | ||
| $user_cpt = get_post( $recent_posts[0], ARRAY_A ); | ||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This fixes an issue, where a WP_Post object is returned. |
||
| } elseif ( $create_post ) { | ||
| $cpt_post_id = wp_insert_post( | ||
| array( | ||
| 'post_content' => '{"version": ' . WP_Theme_JSON_Gutenberg::LATEST_SCHEMA . ', "isGlobalStylesUserThemeJSON": true }', | ||
| 'post_status' => 'publish', | ||
| 'post_title' => __( 'Custom Styles', 'default' ), | ||
| 'post_type' => $post_type_filter, | ||
| 'post_name' => 'wp-global-styles-' . urlencode( wp_get_theme()->get_stylesheet() ), | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The addition of |
||
| 'tax_input' => array( | ||
| 'wp_theme' => array( wp_get_theme()->get_stylesheet() ), | ||
| ), | ||
| ), | ||
| true | ||
| ); | ||
| if ( ! is_wp_error( $cpt_post_id ) ) { | ||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This check should always have been here. WP_Insert_post can sometimes return a WP_Error.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What happens if |
||
| $user_cpt = get_post( $cpt_post_id, ARRAY_A ); | ||
| } | ||
| } | ||
| $cache_expiration = $user_cpt ? DAY_IN_SECONDS : HOUR_IN_SECONDS; | ||
| set_transient( $cache_key, $user_cpt ? $user_cpt['ID'] : -1, $cache_expiration ); | ||
|
|
||
| return $user_cpt; | ||
| } | ||
|
|
||
| /** | ||
| * Container for data coming from core. | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use transient is better for performance here. Most sites do not run object caches. Transinets save to options table and will have 3 database queries per page load.