如何在古腾堡的“文档”下添加新面板

更新于 2022年1月22日 wordpress教程

如何在古腾堡的“文档”下添加新面板

我正在尝试在文档选项卡下添加一个新的组件面板,例如类别、特色图像等。

在此处输入图片说明

解决方案

解决方案

他们现在添加了PluginDocumentSettingPanel SlotFill。

const { registerPlugin } = wp.plugins
const { PluginDocumentSettingPanel } = wp.editPost
 
const PluginDocumentSettingPanelDemo = () => (
    <PluginDocumentSettingPanel
        name="custom-panel"
        title="Custom Panel"
        className="custom-panel"
    >
        Custom Panel Contents
    </PluginDocumentSettingPanel>
)
registerPlugin('plugin-document-setting-panel-demo', {
    render: PluginDocumentSettingPanelDemo
})

add_meta_box可以解决问题,但前提是您添加值为'side'context参数:

add_meta_box(
    'box-id-here',
    'Box Title Here',
    'createBoxHtml',
    'post',
    'side' ); // <-- this is important

啊哈,两天一无所获!


旧答案

根据这个教程,我们可以添加自定义侧边栏并使用自定义表单输入填充它。

这是 React JSX 版本中的一个工作示例。 这增加了一个元字段country

const { registerPlugin } = wp.plugins;
const { PluginSidebar } = wp.editPost;
const { TextControl } = wp.components;
const { withSelect, withDispatch } = wp.data;

// Customized TextControl
const CustomMetaField = withDispatch( ( dispatch, props ) => {
    return {
        updateMetaValue: ( v ) => {
            dispatch( 'core/editor' ).editPost( {
                meta: {
                    [ props.metaFieldName ]: v
                }
            });
        }
    };
})( withSelect( ( select, props ) => {
    return {
        [ props.metaFieldName ]: select( 'core/editor' ).getEditedPostAttribute( 'meta' )[ props.metaFieldName ]
    };
} )( ( props ) => (
    <TextControl
        value={props[ props.metaFieldName ] }
        label="Country"
        onChange={( v ) => {
            props.updateMetaValue( v );
        }}
    /> )
) );


// Our custom sidebar
registerPlugin( 'custom-sidebar', {
    render() {
        return (
            <PluginSidebar
                name="project-meta-sidebar"
                title="Project Meta">
                <div className="plugin-sidebar-content">
                    <CustomMetaField metaFieldName="country" />
                </div>
            </PluginSidebar>
        );
    },
} );

在 PHP 中,在init hook 中注册元字段:

register_meta( 'post', 'country', [
    'show_in_rest' => TRUE,
    'single' => TRUE,
    'type' => 'string'
] );

我知道:

这仍然不是必需的解决方案,但差不多。

您可以将此代码添加到您的 function.php。 此代码创建新选项卡并将文本字段添加到此选项卡。 文本字段像 post_meta 表中的自定义字段一样保存到数据库中,您可以像默认 WP po​​st meta 一样输出它。
1. 创建标签。
2.创建自定义文本字段utm_post_class
3. 网站输出使用$utm = get_post_meta( $post->ID, 'utm_post_class', true );

//Article UTM Link
add_action( 'load-post.php', 'utm_post_meta_boxes_setup' );
add_action( 'load-post-new.php', 'utm_post_meta_boxes_setup' );

function utm_post_meta_boxes_setup() {
    add_action( 'add_meta_boxes', 'utm_add_post_meta_boxes' );
    add_action( 'save_post', 'utm_save_post_class_meta', 10, 2 );
}

function utm_add_post_meta_boxes() {
    add_meta_box(
        'utm-post-class',
        'Настройки UTM',
        'utm_post_class_meta_box',
        'post',
        'side',
        'default'
    );
}

function utm_post_class_meta_box( $post ) {
    wp_nonce_field( basename( __FILE__ ), 'utm_post_class_nonce' );?>

    <div class="components-base-control editor-post-excerpt__textarea">
        <div class="components-base-control__field">
            <label class="components-base-control__label" for="utm-post-class">UTM ссылка (необязательно)</label>
            <input type="text" name="utm-post-class" id="utm-post-class" class="edit-post-post-schedule" value="<?php echo esc_attr( get_post_meta( $post->ID, 'utm_post_class', true ) ); ?>">
        </div>
    </div>
<?php }

function utm_save_post_class_meta( $post_id, $post ) {

    if ( !isset( $_POST['utm_post_class_nonce'] ) || !wp_verify_nonce( $_POST['utm_post_class_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    $post_type = get_post_type_object( $post->post_type );
    if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
        return $post_id;

    $new_meta_value = ( isset( $_POST['utm-post-class'] ) ? $_POST['utm-post-class'] : '' );
    $meta_key = 'utm_post_class';
    $meta_value = get_post_meta( $post_id, $meta_key, true );

    if ( $new_meta_value && '' == $meta_value )
        add_post_meta( $post_id, $meta_key, $new_meta_value, true );
    elseif ( $new_meta_value && $new_meta_value != $meta_value )
        update_post_meta( $post_id, $meta_key, $new_meta_value );
    elseif ( '' == $new_meta_value && $meta_value )
        delete_post_meta( $post_id, $meta_key, $meta_value );
}

您现在可以使用较新的useSelectuseDispatch自定义挂钩。 它们类似于withSelectwithDispatch ,但利用 React 16.8 中的自定义钩子来获得更简洁的开发体验:

(此外,使用@wordpress/scripts ,因此导入来自 npm 包而不是直接来自wp对象,但两者都可以。)

import { __ } from '@wordpress/i18n';
import { useSelect, useDispatch } from '@wordpress/data';
import { PluginDocumentSettingPanel } from '@wordpress/edit-post';
import { TextControl } from '@wordpress/components';

const TextController = (props) => {
  const meta = useSelect(
    (select) =>
      select('core/editor').getEditedPostAttribute('meta')['_myprefix_text_metafield']
  );
  const { editPost } = useDispatch('core/editor');
  return (
    <TextControl
      label={__("Text Meta", "textdomain")}
      value={meta}
      onChange={(value) => editPost({ meta: { _myprefix_text_metafield: value } })}
    />
  );
};

const PluginDocumentSettingPanelDemo = () => {
  return (
    <PluginDocumentSettingPanel
      name="custom-panel"
      title="Custom Panel"
      className="custom-panel"
    >
      <TextController />
    </PluginDocumentSettingPanel>
  );
};

export default PluginDocumentSettingPanelDemo;

除了像往常一样注册您的元字段:

function myprefix_register_meta()
{
    register_post_meta('post', '_myprefix_text_metafield', array(
        'show_in_rest' => true,
        'type' => 'string',
        'single' => true,
        'sanitize_callback' => 'sanitize_text_field',
        'auth_callback' => function () {
            return current_user_can('edit_posts');
        }
    ));
}
add_action('init', 'myprefix_register_meta');

并确保如果用于自定义帖子类型,则在supports数组中包含custom-fields

'supports' => array('title', 'editor', 'thumbnail', 'revisions', 'custom-fields'),

希望这有帮助。

你可能还喜欢下面这些文章

wordpress自定义url路由于自定义载入模板wordpress自定义url路由于自定义载入模板

摘要:WordPress通过强大的hook允许自定义路由,修改数据库中的rewrite_rules来实现。在主题或插件激活时设置路由规则,但需注意用户后台修改固定链接会覆盖设置。需使用query_vars过滤器来扩展查询变量,通过templa

站长工具箱发布接口文档站长工具箱发布接口文档

发布文章接口字段类型含义必须例子post_titlestring文章标题是这是一个标题post_contentstring文章内容是这是文章内容post_categorystring文章分类不存在时会自动创建多个用逗号隔开是分类1,分类2po

WordPress 教程适用人群学习前提WordPress 教程适用人群学习前提

手册简介WordPress教程精选建站过程当中的常见问题进行解析,教你手把手建立一个手册说明WordPress是一个开源的内容管理系统(CMS),允许用户构建动态网站和博客。

WordPress站点地图插件 WPSiteMap,速度飞快不耗资源,完美替代默认站点地图WordPress站点地图插件 WPSiteMap,速度飞快不耗资源,完美替代默认站点地图

详细介绍多种自定义选项自定义每张地图的链接数量设置展示排序,可设置最新到最老或最老到最新两种展示方式:不带任何样式或者WordPress内置的站点样式多种资源灵活加入地图内容灵活选择,可控制文章、页面、分类、标签、作者这些类别资源是否加入地图

禁用Wordpress的默认的一些小工具禁用Wordpress的默认的一些小工具

移除之后十分清爽比如我们想要移除RSS小工具,可以在主题的functions.php加入如下代码:如果想移除其他的小工具,可以将下面的小工具类名当参数传递,列表如下:WP_Widget_Pages页面WP_Widget_Calendar日历,

WordPress 自定义主题WordPress 自定义主题

在本部分中,您可以添加要添加到网站中的网站标题和标语。当您点击任何小部件时,系统会显示一个下拉菜单,您可以在其中编辑更多内容或添加更多内容。在此图片中,您可以看到,您可以在“Title"部分中添加您的类别。

违禁词插件支持全局替换啦!违禁词插件支持全局替换啦!

很不巧,他想要替换的内容正是在自定义字段里面​。那些直接读取自定义字段的,并没有hook供开发者​调用。​兼容模式:兼容模式是检测整个网页,不区分标题、正文、评论、自定义字段等。

WordPress如何自定义文章详情页模板WordPress如何自定义文章详情页模板

例如,我们准备让名称为WordPress的分类文章使用有别于其它分类的模板样式,首先在所用主题根目录新建一个名称。single-wordpress.php的模板文件。