使用概要
SlotFillsにアクセスするためには、次の4つのことを行う必要があります:
- 1.
@wordpress/plugins
パッケージからregisterPlugin
メソッドをインポートします。 - 2.
@wordpress/editor'
パッケージから必要なSlotFillをインポートします。 - 3. 変更をレンダリングするコンポーネントを定義します。私たちの変更/追加は、インポートしたSlotFillコンポーネントでラップされます。
- 4. プラグインを登録します。
以下は、PluginPostStatusInfo
slotFillを使用した例です:
import { registerPlugin } from '@wordpress/plugins';
import { PluginPostStatusInfo } from '@wordpress/editor';
const PluginPostStatusInfoTest = () => (
<PluginPostStatusInfo>
<p>Post Status Info SlotFill</p>
</PluginPostStatusInfo>
);
registerPlugin( 'post-status-info-test', { render: PluginPostStatusInfoTest } );
条件付きでSlotFillコンテンツをレンダリングする
MainDashboardButtonを除いて、利用可能なすべてのSlotFillは、Post EditorとSite Editorの両方で公開されており、登録されたFillは両方のコンテキストでレンダリングされます。Fillsを条件付きでレンダリングするために実装できるアプローチはいくつかあります。
Post EditorにFillsを制限する
Fillは、現在の投稿タイプオブジェクトプロパティviewable
がtrue
に設定されているかどうかを確認することで、Post Editorに制限できます。viewable
に設定されていない投稿タイプは、関連する投稿編集画面を持たず、ユーザーがPost Editorにいないことを示す良い指標です。以下の例は、登録された投稿タイプの編集投稿画面でそのコンテンツをレンダリングします。
/**
* WordPress dependencies
*/
import { registerPlugin } from '@wordpress/plugins';
import {
PluginDocumentSettingPanel,
store as editorStore,
} from '@wordpress/editor';
import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
/**
* The component to be rendered as part of the plugin.
*/
const EditPostDocumentSettingPanel = () => {
// Retrieve information about the current post type.
const isViewable = useSelect( ( select ) => {
const postTypeName = select( editorStore ).getCurrentPostType();
const postTypeObject = select( coreStore ).getPostType( postTypeName );
return postTypeObject?.viewable;
}, [] );
// If the post type is not viewable, then do not render my the fill.
if ( ! isViewable ) {
return null;
}
return (
<PluginDocumentSettingPanel
name="custom-panel"
title={ __( 'Post Editor Example' ) }
className="custom-panel"
>
<p>{ __( 'Only appears in the Edit Post screen' ) }</p>
</PluginDocumentSettingPanel>
);
};
registerPlugin( 'example-post-edit-only', {
render: EditPostDocumentSettingPanel,
} );
特定の投稿タイプにFillsを制限する
以下の例は、Fillがレンダリングされる投稿タイプの許可リストを作成することによって、上記の例を拡張します。この場合、Fillはページを編集しているときのみレンダリングされます。
/**
* WordPress dependencies
*/
import { registerPlugin } from '@wordpress/plugins';
import {
PluginDocumentSettingPanel,
store as editorStore,
} from '@wordpress/editor';
import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import { __, sprintf } from '@wordpress/i18n';
/**
* The component to be rendered as part of the plugin.
*/
const RestrictPostTypes = () => {
// Retrieve information about the current post type.
const { isViewable, postTypeName } = useSelect( ( select ) => {
const postType = select( editorStore ).getCurrentPostType();
const postTypeObject = select( coreStore ).getPostType( postType );
return {
isViewable: postTypeObject?.viewable,
postTypeName: postType,
};
}, [] );
// The list of post types that are allowed to render the plugin.
const allowedPostTypes = [ 'page' ];
// If the post type is not viewable or not in the allowed list, do not render the plugin.
if ( ! isViewable || ! allowedPostTypes.includes( postTypeName ) ) {
return null;
}
return (
<PluginDocumentSettingPanel
name="custom-panel"
title={ __( 'Restrict Post Types Example' ) }
className="custom-panel"
>
<p>
{ sprintf(
__(
'Only appears on Post Types that are in the allowed list. %s'
),
allowedPostTypes.join( ', ' )
) }
</p>
</PluginDocumentSettingPanel>
);
};
registerPlugin( 'example-restrict-post-types', {
render: RestrictPostTypes,
} );
Site EditorにFillsを制限する
FillsをSite Editorに制限するには、逆の論理が適用されます。投稿タイプオブジェクトのviewable
プロパティがtrue
に設定されている場合、Fillはレンダリングされるべきではありません。以下の例は、任意のSite Editor画面でそのコンテンツをレンダリングします。
/**
* WordPress dependencies
*/
import { registerPlugin } from '@wordpress/plugins';
import {
PluginDocumentSettingPanel,
store as editorStore,
} from '@wordpress/editor';
import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
/**
* The component to be rendered as part of the plugin.
*/
const SiteEditorDocumentSettingPanel = () => {
// Retrieve information about the current post type.
const isViewable = useSelect( ( select ) => {
const postTypeName = select( editorStore ).getCurrentPostType();
const postTypeObject = select( coreStore ).getPostType( postTypeName );
// A viewable post type is one than can be viewed in the WordPress admin. Internal ones are not set to viewable.
return postTypeObject?.viewable;
}, [] );
// If the post type is viewable, do not render my fill
if ( isViewable ) {
return null;
}
return (
<PluginDocumentSettingPanel
name="custom-panel"
title={ __( 'Site Editor Example' ) }
className="custom-panel"
>
<p>{ __( 'Only appears in the Site Editor' ) }</p>
</PluginDocumentSettingPanel>
);
};
registerPlugin( 'example-site-editor', {
render: SiteEditorDocumentSettingPanel,
} );
Site Editorの特定の画面にFillsを制限する
この例は、Site Editor内でFillがレンダリングできる画面を制御するための許可リストを提供することによって、上記の例を基にしています。
/**
* WordPress dependencies
*/
import { registerPlugin } from '@wordpress/plugins';
import {
PluginDocumentSettingPanel,
store as editorStore,
} from '@wordpress/editor';
import { store as coreStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
import { __, sprintf } from '@wordpress/i18n';
/**
* The component to be rendered as part of the plugin.
*/
const SiteEditorDocumentSettingPanel = () => {
// Allowed areas in the Site Editor.
const allowedSiteEditorScreens = [
'wp_template', // Templates
'wp_block', // Patterns
'wp_template_part', // Template Parts
];
const { isViewable, postType } = useSelect( ( select ) => {
const postTypeName = select( editorStore ).getCurrentPostType();
const postTypeObject = select( coreStore ).getPostType( postTypeName );
return {
// A viewable post type is one than can be viewed in the WordPress admin. Internal ones are not set to viewable.
isViewable: postTypeObject?.viewable,
postType: postTypeName,
};
}, [] );
// If the post type is viewable, do not render my plugin.
if ( isViewable || ! allowedSiteEditorScreens.includes( postType ) ) {
return null;
}
return (
<PluginDocumentSettingPanel
name="custom-panel"
title={ __( 'Restricted to Site Editor screens' ) }
className="custom-panel"
>
<p>
{ sprintf(
__(
'Only appears on Editor Screens that are in the allowed list. %s'
),
allowedSiteEditorScreens.join( ', ' )
) }
</p>
</PluginDocumentSettingPanel>
);
};
registerPlugin( 'example-site-editor-only', {
render: SiteEditorDocumentSettingPanel,
} );
どのように機能するのか?
SlotFillsはcreateSlotFill
を使用して作成されます。これにより、Slot
とFill
の2つのコンポーネントが作成され、次にwp.plugins
グローバルでエクスポートされる新しいコンポーネントを作成するために使用されます。
PluginPostStatusInfo
SlotFillの定義 (コアコードを参照)
/**
* Defines as extensibility slot for the Summary panel.
*/
/**
* WordPress dependencies
*/
import { createSlotFill, PanelRow } from '@wordpress/components';
export const { Fill, Slot } = createSlotFill( 'PluginPostStatusInfo' );
const PluginPostStatusInfo = ( { children, className } ) => (
<Fill>
<PanelRow className={ className }>{ children }</PanelRow>
</Fill>
);
PluginPostStatusInfo.Slot = Slot;
export default PluginPostStatusInfo;
この新しいSlotは、エディタで公開されます。以下の例はコアからのもので、Summaryパネルを表しています。
ご覧のように、<PluginPostStatusInfo.Slot>
はパネルに表示されるすべてのアイテムをラップしています。
SlotFillを介して追加されたアイテム(上記の例を参照)は、fills
パラメータに含まれ、コンポーネントの最後に表示されます。
export default function PostSummary( { onActionPerformed } ) {
const { isRemovedPostStatusPanel } = useSelect( ( select ) => {
// We use isEditorPanelRemoved to hide the panel if it was programmatically removed. We do
// not use isEditorPanelEnabled since this panel should not be disabled through the UI.
const { isEditorPanelRemoved } = select( editorStore );
return {
isRemovedPostStatusPanel: isEditorPanelRemoved( PANEL_NAME ),
};
}, [] );
return (
<PostPanelSection className="editor-post-summary">
<PluginPostStatusInfo.Slot>
{ ( fills ) => (
<>
<VStack spacing={ 4 }>
<PostCardPanel
onActionPerformed={ onActionPerformed }
/>
<PostFeaturedImagePanel withPanelBody={ false } />
<PostExcerptPanel />
<VStack spacing={ 1 }>
<PostContentInformation />
<PostLastEditedPanel />
</VStack>
{ ! isRemovedPostStatusPanel && (
<VStack spacing={ 2 }>
<VStack spacing={ 1 }>
<PostStatusPanel />
<PostSchedulePanel />
<PostURLPanel />
<PostAuthorPanel />
<PostTemplatePanel />
<PostDiscussionPanel />
<PageAttributesPanel />
<PostSyncStatus />
<BlogTitle />
<PostsPerPage />
<SiteDiscussion />
<PostFormatPanel />
<PostStickyPanel />
</VStack>
<TemplateAreas />
{ fills }
</VStack>
) }
</VStack>
</>
) }
</PluginPostStatusInfo.Slot>
</PostPanelSection>
);
}
現在利用可能なSlotFillsと例
以下のSlotFillsは、edit-post
またはeditor
パッケージで利用可能です。使用法と例の詳細については、以下の個別のアイテムを参照してください: