幸运的是,我们可以使用一个钩子自定义用于呈现分类法面板的组件,称为editor.PostTaxonomyType
.
Gutenberg使用名为PostTaxonomies
, 这实际上只是检查分类法是否是继承人,并将道具传递给HierarchicalTermSelector
或FlatTermSelector
相应的组件。通常情况下,这两个组件似乎不会暴露在古腾堡API中,但在editor.PostTaxonomyType
钩子,它将相关组件作为第一个参数传递。
从这里开始,我们所要做的就是扩展组件,覆盖renderTerms
方法更改输入类型checkbox
到radio
, 并覆盖onChange
方法仅返回一个选定的术语。
不幸的是,在钩子中扩展类似乎会导致明显的性能下降,但将扩展类存储在window
似乎缓解了这种情况。
PostTaxonomies
HierarchicalTermSelector
/**
* External dependencies
*/
import { unescape as unescapeString } from \'lodash\';
function customizeTaxonomySelector( OriginalComponent ) {
return function( props ) {
if ( props.slug === \'my_taxonomy\') {
if ( ! window.HierarchicalTermRadioSelector ) {
window.HierarchicalTermRadioSelector = class HierarchicalTermRadioSelector extends OriginalComponent {
// Return only the selected term ID
onChange( event ) {
const { onUpdateTerms, taxonomy } = this.props;
const termId = parseInt( event.target.value, 10 );
onUpdateTerms( [ termId ], taxonomy.rest_base );
}
// Copied from HierarchicalTermSelector, changed input type to radio
renderTerms( renderedTerms ) {
const { terms = [] } = this.props;
return renderedTerms.map( ( term ) => {
const id = `editor-post-taxonomies-hierarchical-term-${ term.id }`;
return (
<div key={ term.id } className="editor-post-taxonomies__hierarchical-terms-choice">
<input
id={ id }
className="editor-post-taxonomies__hierarchical-terms-input"
type="radio"
checked={ terms.indexOf( term.id ) !== -1 }
value={ term.id }
onChange={ this.onChange }
/>
<label htmlFor={ id }>{ unescapeString( term.name ) }</label>
{ !! term.children.length && <div className="editor-post-taxonomies__hierarchical-terms-subchoices">{ this.renderTerms( term.children ) }</div> }
</div>
);
} );
}
};
}
return <window.HierarchicalTermRadioSelector { ...props } />;
}
return <OriginalComponent { ...props } />;
};
}
wp.hooks.addFilter( \'editor.PostTaxonomyType\', \'my-custom-plugin\', customizeTaxonomySelector );