-
Notifications
You must be signed in to change notification settings - Fork 4.2k
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
Navigation Link: use get_block_type_variations to register variations #58389
Merged
youknowriad
merged 8 commits into
WordPress:trunk
from
gaambo:try/navigation-link-variations-filter
Feb 9, 2024
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
a0af054
Nav Link: use get_block_type_variations to register variations
gaambo 62491c0
wp <6.5 compat
gaambo a6ebdda
update code comments according to PR feedback
gaambo 641db4e
remove todo
gaambo dd6857c
moved deprecated functions into compat directory
gaambo cca0b01
guard deprecated functions against redeclaration in core
gaambo 573ec7a
Fix typo
getdave d1e9bc4
fix wrong function names
gaambo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
143 changes: 143 additions & 0 deletions
143
lib/compat/wordpress-6.5/navigation-block-variations.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
<?php | ||
|
||
/** | ||
* Workaround for Core versions < 6.5 to register navigation link variations on registration | ||
* | ||
* @param array $args The block type arguments. | ||
* @return array The updated block type arguments. | ||
*/ | ||
function gutenberg_navigation_link_variations_compat( $args ) { | ||
|
||
if ( 'core/navigation-link' !== $args['name'] || ! empty( $args['variation_callback'] ) ) { | ||
return $args; | ||
} | ||
$args['variation_callback'] = 'build_navigation_link_block_variations'; | ||
return $args; | ||
} | ||
|
||
if ( ! method_exists( 'WP_Block_Type', 'get_variations' ) ) { | ||
add_filter( 'register_block_type_args', 'gutenberg_navigation_link_variations_compat', 9 ); | ||
} | ||
|
||
/** | ||
* Registers custom post type variations for navigation link on post type registration | ||
* Handles all post types registered after the block is registered in register_navigation_link_post_type_variations | ||
* | ||
* @since 6.5.0 | ||
* @deprecated 6.5.0 Use WP_Block_Type::get_variations / get_block_type_variations filter instead. | ||
* | ||
* @param string $post_type The post type name passed from registered_post_type action hook. | ||
* @param WP_Post_Type $post_type_object The post type object passed from registered_post_type. | ||
*/ | ||
function gutenberg_block_core_navigation_link_register_post_type_variation( $post_type, $post_type_object ) { | ||
_deprecated_function( __FUNCTION__, '6.5.0', 'WP_Block_Type::get_variations' ); | ||
if ( $post_type_object->show_in_nav_menus ) { | ||
$variation = build_variation_for_navigation_link( $post_type_object, 'post-type' ); | ||
gutenberg_block_core_navigation_link_register_variation( $variation ); | ||
} | ||
} | ||
|
||
/** | ||
* Registers a custom taxonomy variation for navigation link on taxonomy registration | ||
* Handles all taxonomies registered after the block is registered in register_navigation_link_post_type_variations | ||
* | ||
* @since 6.5.0 | ||
* @deprecated 6.5.0 Use WP_Block_Type::get_variations / get_block_type_variations filter instead. | ||
* | ||
* @param string $taxonomy Taxonomy slug. | ||
* @param array|string $object_type Object type or array of object types. | ||
* @param array $args Array of taxonomy registration arguments. | ||
*/ | ||
function gutenberg_block_core_navigation_link_register_taxonomy_variation( $taxonomy, $object_type, $args ) { | ||
_deprecated_function( __FUNCTION__, '6.5.0', 'WP_Block_Type::get_variations' ); | ||
if ( isset( $args['show_in_nav_menus'] ) && $args['show_in_nav_menus'] ) { | ||
$variation = build_variation_for_navigation_link( (object) $args, 'post-type' ); | ||
gutenberg_block_core_navigation_link_register_variation( $variation ); | ||
} | ||
} | ||
|
||
/** | ||
* Unregisters a custom post type variation for navigation link on post type unregistration. | ||
* | ||
* @since 6.5.0 | ||
* @deprecated 6.5.0 Use WP_Block_Type::get_variations / get_block_type_variations filter instead. | ||
* | ||
* @param string $post_type The post type name passed from unregistered_post_type action hook. | ||
*/ | ||
function gutenberg_block_core_navigation_link_unregister_post_type_variation( $post_type ) { | ||
_deprecated_function( __FUNCTION__, '6.5.0', 'WP_Block_Type::get_variations' ); | ||
gutenberg_block_core_navigation_link_unregister_variation( $post_type ); | ||
} | ||
|
||
/** | ||
* Unregisters a custom taxonomy variation for navigation link on taxonomy unregistration. | ||
* | ||
* @since 6.5.0 | ||
* @deprecated 6.5.0 Use WP_Block_Type::get_variations / get_block_type_variations filter instead. | ||
* | ||
* @param string $taxonomy The taxonomy name passed from unregistered_taxonomy action hook. | ||
*/ | ||
function gutenberg_block_core_navigation_link_unregister_taxonomy_variation( $taxonomy ) { | ||
_deprecated_function( __FUNCTION__, '6.5.0', 'WP_Block_Type::get_variations' ); | ||
gutenberg_block_core_navigation_link_unregister_variation( $taxonomy ); | ||
} | ||
|
||
/** | ||
* Registers a variation for a post type / taxonomy for the navigation link block. | ||
* | ||
* @since 6.5.0 | ||
* @deprecated 6.5.0 Use WP_Block_Type::get_variations / get_block_type_variations filter instead. | ||
* | ||
* @param array $variation Variation array from build_variation_for_navigation_link. | ||
*/ | ||
function gutenberg_block_core_navigation_link_register_variation( $variation ) { | ||
_deprecated_function( __FUNCTION__, '6.5.0', 'WP_Block_Type::get_variations' ); | ||
/* | ||
* Directly set the variations on the registered block type | ||
* because there's no server side registration for variations (see #47170). | ||
*/ | ||
$navigation_block_type = WP_Block_Type_Registry::get_instance()->get_registered( 'core/navigation-link' ); | ||
/* | ||
* If the block is not registered yet, bail early. | ||
* Variation will be registered in register_block_core_navigation_link then. | ||
*/ | ||
if ( ! $navigation_block_type ) { | ||
return; | ||
} | ||
|
||
$navigation_block_type->variations = array_merge( | ||
$navigation_block_type->variations, | ||
array( $variation ) | ||
); | ||
} | ||
|
||
/** | ||
* Unregisters a variation for a post type / taxonomy for the navigation link block. | ||
* | ||
* @since 6.5.0 | ||
* @deprecated 6.5.0 Use WP_Block_Type::get_variations / get_block_type_variations filter instead. | ||
* | ||
* @param string $name Name of the post type / taxonomy (which was used as variation name). | ||
*/ | ||
function gutenberg_block_core_navigation_link_unregister_variation( $name ) { | ||
_deprecated_function( __FUNCTION__, '6.5.0', 'WP_Block_Type::get_variations' ); | ||
/* | ||
* Directly get the variations from the registered block type | ||
* because there's no server side (un)registration for variations (see #47170). | ||
*/ | ||
$navigation_block_type = WP_Block_Type_Registry::get_instance()->get_registered( 'core/navigation-link' ); | ||
// If the block is not registered (yet), there's no need to remove a variation. | ||
if ( ! $navigation_block_type || empty( $navigation_block_type->variations ) ) { | ||
return; | ||
} | ||
$variations = $navigation_block_type->variations; | ||
// Search for the variation and remove it from the array. | ||
foreach ( $variations as $i => $variation ) { | ||
if ( $variation['name'] === $name ) { | ||
unset( $variations[ $i ] ); | ||
break; | ||
} | ||
} | ||
// Reindex array after removing one variation. | ||
$navigation_block_type->variations = array_values( $variations ); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
This compat code doesn't work because the
build_navigation_link_block_variations
function does not exist.The consequence is that in WordPress 6.4 the Navigation Link variations for post types (Post Link, Page Link) are not registered, we have only "Custom Link" available in the editor.
I was seeing strange Playwright e2e failures in my PR #59064 and I tracked them down to this. The e2e tests for the
core/navigation
block are failing because they expect "Page Link" components, but they see only "Custom Link" ones. See for example this code:gutenberg/test/e2e/specs/editor/blocks/navigation-list-view.spec.js
Lines 103 to 112 in 237865f
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.
Oh gosh, this PR (or my work on it) seems to be cursed 🙈
You are right, the functions name should be
gutenberg_block_core_navigation_link_build_variations
- since that's the prefixed name after building.If I change it to that and use WP 6.4 locally, I get "Page Link" and "Post Link" variations correctly.
I wonder why no other tests caught that, but since the function is just passed as a callback it's not called directly and therefore doesn't trigger an error - probably that's why.
I've created a PR to fix that here: #59126