将古登堡类别复选框更改为无线电

时间:2019-01-15 作者:Samasonj

如何将古腾堡的类别复选框更改为无线电输入?我已尝试使用此插件:Categories Metabox Enhanced.

但它对古腾堡并不完全有效,这意味着我在检查某个术语时显示某个字段的条件不起作用。此外,该插件还添加了一个额外的元框,而不替换Gutenberg的默认类别框。

enter image description here

3 个回复
SO网友:paulthewalton

幸运的是,我们可以使用一个钩子自定义用于呈现分类法面板的组件,称为editor.PostTaxonomyType.

Gutenberg使用名为PostTaxonomies, 这实际上只是检查分类法是否是继承人,并将道具传递给HierarchicalTermSelectorFlatTermSelector 相应的组件。通常情况下,这两个组件似乎不会暴露在古腾堡API中,但在editor.PostTaxonomyType 钩子,它将相关组件作为第一个参数传递。

从这里开始,我们所要做的就是扩展组件,覆盖renderTerms 方法更改输入类型checkboxradio, 并覆盖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 );

SO网友:luckyape

如果有人需要select box版本,您可以尝试以下操作,对@Paul\\u Walton答案稍加修改:

const {
  SelectControl,
} = wp.components;

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(val) {
            console.info(event);
            const {
              onUpdateTerms,
              taxonomy
            } = this.props;
            const termId = parseInt(val, 10);
            onUpdateTerms([termId], taxonomy.rest_base);
          }
          // Copied from HierarchicalTermSelector, changed input type to radio
          renderTerms(renderedTerms) {
            const {
              terms = []
            } = this.props;
            return ( < SelectControl label = {
                __(\'Select some users:\')
              }
              value = {
                terms[0]
              } // e.g: value = [ \'a\', \'c\' ]
              onChange = {
                this.onChange
              }
              options = {
                renderedTerms.map((term) => {
                  return {
                    value: term.id,
                    label: term.name
                  };
                })
              }
              />)
            }
          };
        }
        return <window.HierarchicalTermRadioSelector { ...props
        }
        />;
      }
      return <OriginalComponent { ...props
      }
      />;
    };
  }
  wp.hooks.addFilter(\'editor.PostTaxonomyType\', \'my-plugin\', customizeTaxonomySelector);

SO网友:leymannx

Categories Metabox Enhanced 非常巧妙地添加了自己的自定义元框,显示类别和自定义分类的选项,就像您在插件设置中配置它的方式一样(如复选框、radios或select)。

然后,您还需要确保手动隐藏默认的元框,方法是单击编辑后屏幕顶部的三个小点以“调整显示”并取消选中“类别”和自定义分类。

上述UI设置可能会被其他所有用户覆盖。要以编程方式从Gutenberg中删除默认类别元框,请执行以下操作。资料来源:[GitHub] Custom Taxonomy: Show in REST, Hide default Gutenberg Panel (comment).

/**
 * Disable display of Gutenberg Post Setting UI for a specific
 * taxonomy. While this isn\'t the official API for this need,
 * it works for now because only Gutenberg is dependent on the
 * REST API response.
 */
add_filter(\'rest_prepare_taxonomy\', function ($response, $taxonomy) {
  if (\'category\' === $taxonomy->name) {
    $response->data[\'visibility\'][\'show_ui\'] = FALSE;
  }
  return $response;
}, 10, 2);