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

Patterns: rename sync_status and move to top level field on rest return instead of a meta field #52146

Merged
merged 14 commits into from
Jul 5, 2023
Merged
28 changes: 28 additions & 0 deletions lib/blocks.php
Original file line number Diff line number Diff line change
Expand Up @@ -372,3 +372,31 @@ function gutenberg_register_legacy_social_link_blocks() {
}

add_action( 'init', 'gutenberg_register_legacy_social_link_blocks' );

/**
* Migrate the legacy `sync_status` meta key (added 16.1) to the new `wp_pattern_sync_status` meta key (16.1.1).
*
* This filter is INTENTIONALLY left out of core as the meta key was fist introduced to core in 6.3 as `wp_pattern_sync_status`.
* see https://github.com/WordPress/gutenberg/pull/52232
*
* @param mixed $value The value to return, either a single metadata value or an array of values depending on the value of $single.
* @param int $object_id ID of the object metadata is for.
* @param string $meta_key Metadata key.
* @param bool $single Whether to return only the first value of the specified $meta_key.
*/
function gutenberg_legacy_wp_block_post_meta( $value, $object_id, $meta_key, $single ) {
if ( 'wp_pattern_sync_status' !== $meta_key ) {
return $value;
}

$sync_status = get_post_meta( $object_id, 'sync_status', $single );

if ( $single && 'unsynced' === $sync_status ) {
return $sync_status;
} elseif ( isset( $sync_status[0] ) && 'unsynced' === $sync_status[0] ) {
return $sync_status;
}

return $value;
}
add_filter( 'default_post_metadata', 'gutenberg_legacy_wp_block_post_meta', 10, 4 );
29 changes: 6 additions & 23 deletions lib/compat/wordpress-6.3/blocks.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ function gutenberg_rename_reusable_block_cpt_to_pattern( $args, $post_type ) {
$args['labels']['item_reverted_to_draft'] = __( 'Pattern reverted to draft.' );
$args['labels']['item_scheduled'] = __( 'Pattern scheduled.' );
$args['labels']['item_updated'] = __( 'Pattern updated.' );
$args['rest_controller_class'] = 'Gutenberg_REST_Blocks_Controller';
}

return $args;
Expand Down Expand Up @@ -89,7 +90,7 @@ function gutenberg_add_custom_fields_to_wp_block( $args, $post_type ) {
add_filter( 'register_post_type_args', 'gutenberg_add_custom_fields_to_wp_block', 10, 2 );

/**
* Adds sync_status meta fields to the wp_block post type so an unsynced option can be added.
* Adds wp_pattern_sync_status meta fields to the wp_block post type so an unsynced option can be added.
*
* Note: This should be removed when the minimum required WP version is >= 6.3.
*
Expand All @@ -101,39 +102,21 @@ function gutenberg_wp_block_register_post_meta() {
$post_type = 'wp_block';
register_post_meta(
$post_type,
'sync_status',
'wp_pattern_sync_status',
array(
'auth_callback' => function() {
return current_user_can( 'edit_posts' );
},
'sanitize_callback' => 'gutenberg_wp_block_sanitize_post_meta',
'sanitize_callback' => 'sanitize_text_field',
'single' => true,
'type' => 'string',
'show_in_rest' => array(
'schema' => array(
'type' => 'string',
'properties' => array(
'sync_status' => array(
'type' => 'string',
),
),
'type' => 'string',
'enum' => array( 'partial', 'unsynced' ),
),
),
)
);
}
/**
* Sanitizes the array of wp_block post meta sync_status string.
*
* Note: This should be removed when the minimum required WP version is >= 6.3.
*
* @see https://github.com/WordPress/gutenberg/pull/51144
*
* @param array $meta_value String to sanitize.
*
* @return array Sanitized string.
*/
function gutenberg_wp_block_sanitize_post_meta( $meta_value ) {
return sanitize_text_field( $meta_value );
}
add_action( 'init', 'gutenberg_wp_block_register_post_meta' );
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php
/**
* Reusable blocks REST API: WP_REST_Blocks_Controller class
*
* @package WordPress
* @subpackage REST_API
* @since 5.0.0
*/

/**
* Controller which provides a REST endpoint for the editor to read, create,
* edit and delete reusable blocks. Blocks are stored as posts with the wp_block
* post type.
*
* @since 5.0.0
*
* @see WP_REST_Posts_Controller
* @see WP_REST_Controller
*/
class Gutenberg_REST_Blocks_Controller extends WP_REST_Blocks_Controller {
/**
* Filters a response based on the context defined in the schema.
*
* @since 5.0.0
* @since 6.3 Adds the `wp_pattern_sync_status` property to the response.
*
* @param array $data Response data to filter.
* @param string $context Context defined in the schema.
* @return array Filtered response.
*/
public function filter_response_by_context( $data, $context ) {
$data = parent::filter_response_by_context( $data, $context );

/*
* Remove `title.rendered` and `content.rendered` from the response. It
* doesn't make sense for a reusable block to have rendered content on its
* own, since rendering a block requires it to be inside a post or a page.
*/
unset( $data['title']['rendered'] );
unset( $data['content']['rendered'] );

// Add the core wp_pattern_sync_status meta as top level property to the response.
$data['wp_pattern_sync_status'] = $data['meta']['wp_pattern_sync_status'];
unset( $data['meta']['wp_pattern_sync_status'] );
aaronrobertshaw marked this conversation as resolved.
Show resolved Hide resolved
return $data;
}
}
1 change: 1 addition & 0 deletions lib/load.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ function gutenberg_is_experiment_enabled( $name ) {
require_once __DIR__ . '/compat/wordpress-6.3/navigation-block-preloading.php';
require_once __DIR__ . '/compat/wordpress-6.3/link-template.php';
require_once __DIR__ . '/compat/wordpress-6.3/block-patterns.php';
require_once __DIR__ . '/compat/wordpress-6.3/class-gutenberg-rest-blocks-controller.php';

// Experimental.
if ( ! class_exists( 'WP_Rest_Customizer_Nonces' ) ) {
Expand Down
10 changes: 4 additions & 6 deletions packages/block-editor/src/store/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -2034,11 +2034,8 @@ export const getInserterItems = createSelector(
? getReusableBlocks( state )
.filter(
( reusableBlock ) =>
// Filter to either fully synced patterns (sync_status === 'fully'),
// or old school reusable blocks (sync_status === '').
reusableBlock.meta?.sync_status === 'fully' ||
reusableBlock.meta?.sync_status === '' ||
! reusableBlock.meta?.sync_status
reusableBlock.wp_pattern_sync_status === '' ||
! reusableBlock.wp_pattern_sync_status
aaronrobertshaw marked this conversation as resolved.
Show resolved Hide resolved
)
.map( buildReusableBlockInserterItem )
: [];
Expand Down Expand Up @@ -2313,7 +2310,8 @@ function getUnsyncedPatterns( state ) {

return reusableBlocks
.filter(
( reusableBlock ) => reusableBlock.meta?.sync_status === 'unsynced'
( reusableBlock ) =>
reusableBlock.wp_pattern_sync_status === 'unsynced'
)
.map( ( reusableBlock ) => {
return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export default function CreatePatternModal( {
status: 'publish',
meta:
syncType === SYNC_TYPES.unsynced
? { sync_status: syncType }
? { wp_pattern_sync_status: syncType }
: undefined,
},
{ throwOnError: true }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ const reusableBlockToPattern = ( reusableBlock ) => ( {
categories: reusableBlock.wp_pattern,
id: reusableBlock.id,
name: reusableBlock.slug,
syncStatus: reusableBlock.meta?.sync_status || SYNC_TYPES.full,
syncStatus: reusableBlock.wp_pattern_sync_status || SYNC_TYPES.full,
title: reusableBlock.title.raw,
type: reusableBlock.type,
reusableBlock,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export default function usePatternDetails( postType, postId ) {
details.push( {
label: __( 'Syncing' ),
value:
record.meta?.sync_status === 'unsynced'
record.wp_pattern_sync_status === 'unsynced'
? __( 'Not synced' )
: __( 'Fully synced' ),
} );
Expand Down
6 changes: 3 additions & 3 deletions packages/editor/src/components/post-sync-status/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@ import { PanelRow } from '@wordpress/components';
import { store as editorStore } from '../../store';

export default function PostSyncStatus() {
const { meta, postType } = useSelect( ( select ) => {
const { syncStatus, postType } = useSelect( ( select ) => {
const { getEditedPostAttribute } = select( editorStore );
return {
meta: getEditedPostAttribute( 'meta' ),
syncStatus: getEditedPostAttribute( 'wp_pattern_sync_status' ),
postType: getEditedPostAttribute( 'type' ),
};
}, [] );
if ( postType !== 'wp_block' ) {
return null;
}
const syncStatus = meta?.sync_status;

const isFullySynced = ! syncStatus;

return (
Expand Down
2 changes: 1 addition & 1 deletion packages/reusable-blocks/src/store/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export const __experimentalConvertBlocksToReusable =
const meta =
syncType === 'unsynced'
? {
sync_status: syncType,
wp_pattern_sync_status: syncType,
}
: undefined;

Expand Down