新的Gutenberg编辑器中的布局设置

时间:2020-01-24 作者:Stan Trinh

刚刚将我的Wordpress环境更新到最新版本,并查看了Gutenberg编辑器。这需要进行一些挖掘,但我能够找到古腾堡经典编辑器中使用的几乎所有设置(例如自定义字段),除了布局设置面板中的“自定义正文类”和“自定义帖子类”。附件是我正在寻找的设置的图像。我知道我可以使用钩子将自定义主体类添加到任何页面/贴子函数中。但是这种方法对最终用户并不友好。

目前我能想到的唯一解决方案是安装Classic Editor插件,以便在需要时使用它添加自定义正文/帖子类。但我不想只为那个用例安装插件。到目前为止,我对古腾堡编辑没有意见。我认为,对于不熟悉html/css的最终用户来说,能够自己创建合理的布局将非常有用。我真的只是想能够像以前一样在飞行中设置自定义body/post-class。我在互联网上找不到任何答案。

layout settings panel in old editor

1 个回复
SO网友:Tim Elsass

对于添加文本输入以向页面/帖子添加正文类(如有必要,还可以为帖子类添加第二个字段)的非常基本的实现,您可以执行以下操作:

使用注册自定义字段register_post_meta - 我将使用空字符串作为第一个参数,post_type 所以它适用于所有人。还要注意,我们希望使用REST API,因此该值在Gutenberg中可以通过传递trueshow_in_rest:

// File: themeslug/functions.php
// Register the \'themeslug_add_body_class\' post meta.
add_action( \'after_setup_theme\', function() {
    register_post_meta( \'\', \'themeslug_add_body_class\', array(
        \'show_in_rest\' => true,
        \'single\' => true,
        \'type\' => \'string\',
    ) );
} );
<添加一个名为Layout Settings 使用文本输入控件,该控件链接到themeslug_add_body_class. 我们将此添加到Document Settings 在古腾堡。为此,我们将使用名为PluginDocumentSettingPanel. 我将使用块编辑器手册中的基本示例,因此请参考Tutorials 第节更深入地解释了JS代码中的所有内容都在做什么
// File: themeslug/assets/js/editor.js
( function( wp ) {
    var { registerPlugin } = wp.plugins;
    var { PluginDocumentSettingPanel } = wp.editPost;
    var el = wp.element.createElement;
    var Text = wp.components.TextControl;
    var withSelect = wp.data.withSelect;
    var withDispatch = wp.data.withDispatch;

    var mapSelectToProps = function( select ) {
        return {
            metaFieldValue: select( \'core/editor\' )
                .getEditedPostAttribute( \'meta\' )
                [ \'themeslug_add_body_class\' ],
        }
    }

    var mapDispatchToProps = function( dispatch ) {
        return {
            setMetaFieldValue: function( value ) {
                dispatch( \'core/editor\' ).editPost(
                    { meta: { themeslug_add_body_class: value } }
                );
            }
        }
    }

    var MetaBlockField = function( props ) {
        return el( Text, {
            label: \'Custom Body Classes\',
            value: props.metaFieldValue,
            onChange: function( content ) {
                props.setMetaFieldValue( content );
            },
        } );
    }

    var MetaBlockFieldWithData = withSelect( mapSelectToProps )( MetaBlockField );
    var MetaBlockFieldWithDataAndActions = withDispatch( mapDispatchToProps )( MetaBlockFieldWithData );

    registerPlugin( \'theme-slug-add-body-class\', {
        render: function() {
            return el( PluginDocumentSettingPanel,
                {
                    name: \'theme-slug-add-body-class\',
                    title: \'Layout Settings\',
                    className: "theme-slug-custom-body-class",
                    icon: \'\',
                },
                el( \'div\',
                    { className: \'theme-slug-add-body-class-content\' },
                    el( MetaBlockFieldWithDataAndActions )
                )
            );
        }
    } );
} )( window.wp );
<将JS脚本排队-为此,我们将enqueue_block_editor_assets, 和使用wp_enqueue_script 与任何其他JS文件一样。对于脚本部门,为了简单起见,我将手动列出它们:
// File: themeslug/functions.php
// Enqueue the JS for gutenberg.
add_action( \'enqueue_block_editor_assets\', function() {
    wp_enqueue_script(
        \'themeslug-editor-add-body-class\',
        get_theme_file_uri( \'/assets/js/editor.js\' ),
        [ \'wp-plugins\', \'wp-data\', \'wp-components\', \'wp-edit-post\', \'wp-element\', \'wp-compose\' ],
        \'1.0.0\',
        true
    );
} );
<现在我们已经注册了元,自定义控件/脚本已排队并加载到Gutenberg中,因此在访问编辑器时,我们应该看到Layout Settings 面板已添加到Document Settings 在下面添加了文本字段:

enter image description here

最后一部分是过滤body_class 使用保存在元中的用户输入:

// File: themeslug/functions.php
// Dynamically add body class based on post meta saved.
add_filter( \'body_class\', function( $classes ) {
    $body_classes = get_post_meta( get_the_ID(), \'themeslug_add_body_class\', true );
    if ( \'\' !== $body_classes ) {
        $body_classes = array_map( \'esc_attr\', explode( \' \', $body_classes ) );
        $classes = array_merge( $classes, $body_classes );
    }
    return $classes;
} );
这允许将多个类添加到正文中,这些类是空间分隔的,但您可以根据需要处理逻辑。您可以对此进行扩展,为要添加的自定义类添加第二个字段。而不是过滤body_class 你可以使用post_class 为此。

相关推荐

添加具有wp_EDITOR最低编辑器配置的表控件(‘miny’)

我想添加wp\\u编辑器(tinymce)的表控件,该编辑器由teeny=>true启动。以下是我迄今为止所做的工作(没有成功):<?php $tinymce_options = array(\'plugins\' => \"table\", \'theme_advanced_buttons2\' => \"tablecontrols\"); $editor_config= array(\'teeny\'=>true, \'textarea_rows\'=&g