WordPress / gutenberg

The Block Editor project for WordPress and beyond. Plugin is available from the official repository.
https://wordpress.org/gutenberg/
Other
10.39k stars 4.15k forks source link

Navigation: allow plugins to register icons for custom post type and taxonomy variants #31226

Open Aljullu opened 3 years ago

Aljullu commented 3 years ago

Navigation inner blocks are automatically available for Custom Post Types and taxonomies. That was introduced in #29095 and works great, making plugin authors life much easier. However, it doesn't allow setting a custom icon for those inner blocks.

In the screenshot below, you can see the Product Link, Product Category Link and Product Tag Link blocks added by WooCommerce using the generic icon:

imatge

I anticipate this will be an issue for sites with several plugins installed.

@gwwar do you have any thoughts about whether an interface could be added so plugins can register custom icons for the Navigation inner blocks which are generated automatically?

Step-by-step reproduction instructions

The testing steps from https://github.com/WordPress/gutenberg/pull/29095 showcase the issue.

Expected behaviour

As a plugin author, I would like to be able to set custom icons for the custom post types and taxonomies registered in my plugin.

Actual behaviour

AFAIK, currently there is no API do register icons for CPT and taxonomy link blocks.

getdave commented 3 years ago

@Aljullu I agree we should enable the ability to register custom icons for the core/navigation-link variations (which is what you are referring to as the innerBlocks.

You will also notice that once you insert one of the block variations for a custom post type the name of the block in the block sidebar still reads Post link. That should also be fixed.

I'm currently working on https://github.com/WordPress/gutenberg/pull/31004 which standardizes the serialization of blocks to nav menu items (and vica versa) so that existing menus will translate perfectly over to the new Nav editor screen. I'd love some more πŸ‘€ on that if possible.

gwwar commented 3 years ago

@gwwar do you have any thoughts about whether an interface could be added so plugins can register custom icons for the Navigation inner blocks which are generated automatically?

Yes, I hope we'll have this in the future. The current variations API only allows icons to be set with a JS function. We need to explore if we can set icons as a react component function OR svg string (and still have this work for React Native). Once an icon is serializable, it'll be possible then to update the server API.

The workaround for right now is adding a block filter, which even the core/navigation-link needs to do:

addFilter(
    'blocks.registerBlockType',
    'core/navigation-link',
        ( settings, name ) => {
             if ( settings.variations ) {
        const variations = settings.variations.map( ( variation ) => {
            return {
                ...variation,
                ...( ! variation.icon && {
                    icon: getIcon( variation.name ), //add your custom icon here
                } ),
            };
        } );
        return {
            ...settings,
            variations,
        };
    }
    return settings;
);
gwwar commented 3 years ago

You will also notice that once you insert one of the block variations for a custom post type the name of the block in the block sidebar still reads Post link.

To fix that, when registering the custom post type, add two new labels item_link and item_link_description. New post type labels were added to avoid joining two translated strings.

109557321-cbe93300-7a8c-11eb-87d5-e7c169b88581
Aljullu commented 3 years ago

@getdave

@Aljullu I agree we should enable the ability to register custom icons for the core/navigation-link variations (which is what you are referring to as the innerBlocks.

Thanks for clarifying those concepts to me, I'm still new to all the Gutenberg nomenclature. :slightly_smiling_face:

I'm currently working on https://github.com/WordPress/gutenberg/pull/31004 which standardizes the serialization of blocks to nav menu items (and vica versa) so that existing menus will translate perfectly over to the new Nav editor screen. I'd love some more πŸ‘€ on that if possible.

Will do. Adding this to my todo list for this week. :+1:

Aljullu commented 3 years ago

@gwwar

The workaround for right now is adding a block filter, which even the core/navigation-link needs to do:

That worked great, thanks for pointing me in the right direction! I needed to tweak the code a bit because when calling it from a plugin, variation.icon is already set. Sharing the code here in case it's helpful for other plugin authors:

function replaceIcon( variation ) {
    switch ( variation.name ) {
        case 'my-variation':
            return {
                ...variation,
                icon: <MyIcon />,
            };
        default:
            return variation;
    }
}

addFilter( 'blocks.registerBlockType', 'my-plugin/navigation-link-icons', ( settings ) => {
    if ( settings.variations ) {
        const variations = settings.variations.map( replaceIcon );
        return {
            ...settings,
            variations,
        };
    }
    return settings;
} );
jordesign commented 11 months ago

Hey @getdave - just triaging older issues - and wanted to see if we had inadvertently solved this one in the last 2 years? Or if it still needs working on.

getdave commented 10 months ago

I don't think this has been resolved no.