Skip to content

Font Library: unregister font collection - #54701

Merged
matiasbenedetto merged 28 commits into
trunkfrom
try/unregister-font-collection
Jan 8, 2024
Merged

matiasbenedetto merged 28 commits into
trunkfrom
try/unregister-font-collection

Conversation

@matiasbenedetto

@matiasbenedetto matiasbenedetto commented Sep 21, 2023 •

Copy link
Copy Markdown
Contributor

Closes #54697

What?

Adds a function that enable extenders to unregister a font collection from the library.

Why?

There could be cases where extenders need to make a font collection unavailable.

How?

By implementing the function wp_unregister_font_collection( $id ), extenders can make a particular font collection not loaded.

Testing instructions

Try disabling the default font collection by adding this in a plugin code or in your block theme functions.php:

wp_unregister_font_collection ( 'default-font-collection' );

Expected result:

The default font collection (Google Fonts) should not load in the frontend:

Before After
image image

@matiasbenedetto
matiasbenedetto marked this pull request as draft September 21, 2023 17:07
@github-actions

github-actions Bot commented Sep 21, 2023 •

Copy link
Copy Markdown

This pull request has changed or added PHP files. Please confirm whether these changes need to be synced to WordPress Core, and therefore featured in the next release of WordPress.

If so, it is recommended to create a new Trac ticket and submit a pull request to the WordPress Core Github repository soon after this pull request is merged.

If you're unsure, you can always ask for help in the #core-editor channel in WordPress Slack.

Thank you! ❤️

View changed files
❔ phpunit/tests/fonts/font-library/wpFontLibrary/base.php
❔ phpunit/tests/fonts/font-library/wpFontLibrary/unregisterFontCollection.php
❔ lib/experimental/fonts/font-library/class-wp-font-library.php
❔ lib/experimental/fonts/font-library/font-library.php
❔ phpunit/tests/fonts/font-library/wpFontLibrary/getFontCollection.php
❔ phpunit/tests/fonts/font-library/wpFontLibrary/getFontCollections.php
❔ phpunit/tests/fonts/font-library/wpFontLibrary/getFontsDir.php
❔ phpunit/tests/fonts/font-library/wpFontLibrary/getMimeTypes.php
❔ phpunit/tests/fonts/font-library/wpFontLibrary/registerFontCollection.php
❔ phpunit/tests/fonts/font-library/wpFontLibrary/setUploadDir.php

@matiasbenedetto
matiasbenedetto marked this pull request as ready for review September 21, 2023 19:25
@pbking

pbking commented Sep 21, 2023

Copy link
Copy Markdown
Contributor

This didn't seem to work as I expected and I'm not sure why.

The UI changed as desired. I no longer saw the 'Install Fonts' tab as expected. But only if I ran the code early enough (I tried putting it in an 'init' function and it didn't change, but putting it outside of any functions made it work as expected).

However, if I called WP_Font_Library::get_font_collections() immediately after I still got that collection from the list.

@mikachan mikachan added [Feature] Typography Font and typography-related issues and PRs Needs PHP backport Needs PHP backport to Core [Type] Enhancement A suggestion for improvement. labels Sep 22, 2023
Comment thread lib/experimental/fonts/font-library/class-wp-font-library.php Outdated
Comment thread lib/experimental/fonts/font-library/class-wp-font-library.php Outdated
Comment thread lib/experimental/fonts/font-library/font-library.php Outdated
Comment thread lib/experimental/fonts/font-library/font-library.php Outdated
*/
function wp_unregister_font_collection( $collection_id ) {
add_action(
'init',

@costdev costdev Oct 5, 2023 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Curious about why this needs to be done in an init action within the function. Is this to ensure that WP_Font_Family is initialized beforehand? If so, it might be better that the docs just let extenders know this must occur in the init action or later, or even a _doing_it_wrong() if ! did_action( 'init' ) && ! doing_action( 'init' ).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's because we would need to be sure that all the font collections registered to call wp_register_font_collection() were already registered so we can unregister them using wp_unregister_font_collection(). Is there a better way to be sure that all the font collections are already registered?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the latest commit, I removed the reliance on the hooks by keeping track of the unregistered font collection using an array of collection IDs.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on the @spacedmonkey comments, I changed the approach following this example.

@matiasbenedetto

matiasbenedetto commented Oct 11, 2023 •

Copy link
Copy Markdown
Contributor Author

This didn't seem to work as I expected and I'm not sure why.
The UI changed as desired. I no longer saw the 'Install Fonts' tab as expected. But only if I ran the code early enough (I tried putting it in an 'init' function and it didn't change, but putting it outside of any functions made it work as expected).
However, if I called WP_Font_Library::get_font_collections() immediately after I still got that collection from the list.

Thanks for the review!

The latest changes should fix this. I removed the reliance on the init hook by keeping track of the unregistered font collection using an array of collection IDs. b7c9113

@spacedmonkey

Copy link
Copy Markdown
Member

What happens if there are no collections registered? How is this handled? Can we have unit tests for that?

Comment on lines +92 to +94
public static function unregister_font_collection( $collection_id ) {
self::$unregistered_collection_ids[] = $collection_id;
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feels like a weird pattern. Could we not just unset the value in self::$collections?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the example. Very useful. I implemented that in the latest commits.

@matiasbenedetto

Copy link
Copy Markdown
Contributor Author

What happens if there are no collections registered? How is this handled? Can we have unit tests for that?

When no collections are registered, get_font_collections() returns an empty array. This is the unit test:

public function test_should_get_an_empty_list() {
$font_collections = WP_Font_Library::get_font_collections();
$this->assertEmpty( $font_collections, 'Should return an empty array.' );
}

Comment thread lib/experimental/fonts/font-library/class-wp-font-library.php Outdated
Comment thread lib/experimental/fonts/font-library/class-wp-font-library.php Outdated
Comment thread lib/experimental/fonts/font-library/font-library.php Outdated
Comment thread lib/experimental/fonts/font-library/class-wp-font-library.php Outdated
Co-authored-by: Vicente Canales <1157901+vcanales@users.noreply.github.com>
Comment thread lib/experimental/fonts/font-library/class-wp-font-library.php Outdated
Co-authored-by: Grant Kinney <creativecoder@users.noreply.github.com>

@creativecoder creativecoder left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks to be working well for me

  • ✅ I can unregister the default collection with wp_unregister_font_collection ( 'default-font-collection' );
    • The "Install Fonts" tab no longer displays in the Fonts modal
    • WP_Font_Library::get_font_collections() returns an empty array
  • ✅ If I try to unregister a non-existent collection, I see a notice in the PHP error log
  • ✅ If I try to register a collection with an existing id, I see a notice in the PHP error log

I left some suggestions for the tests, otherwise I think this is good to go.

Comment thread phpunit/tests/fonts/font-library/wpFontLibrary/getFontCollections.php Outdated
@matiasbenedetto

Copy link
Copy Markdown
Contributor Author

The PR seems ready to go, please could you give it another review?

@jffng jffng left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified:

  • Unregister an existing collection
  • Warnings are thrown when attempting to register an existing collection or unregister a non-existing collection
  • Unit tests incorporate the feedback

@matiasbenedetto
matiasbenedetto merged commit 302c148 into trunk Jan 8, 2024
@matiasbenedetto
matiasbenedetto deleted the try/unregister-font-collection branch January 8, 2024 13:31
@github-actions github-actions Bot added this to the Gutenberg 17.5 milestone Jan 8, 2024
@bph bph added the Needs Dev Note Requires a developer note for a major WordPress release cycle label Jan 16, 2024
@youknowriad youknowriad added Backported to WP Core Pull request that has been successfully merged into WP Core and removed Needs PHP backport Needs PHP backport to Core labels Feb 9, 2024
@Leonardus-Nugraha Leonardus-Nugraha mentioned this pull request Feb 18, 2024
32 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backported to WP Core Pull request that has been successfully merged into WP Core [Feature] Typography Font and typography-related issues and PRs Needs Dev Note Requires a developer note for a major WordPress release cycle [Type] Enhancement A suggestion for improvement.

Projects

No open projects
Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

Font Library: unregister font collection

10 participants