使用概要

SlotFillsにアクセスするためには、次の4つのことを行う必要があります:

  • 1. @wordpress/pluginsパッケージからregisterPluginメソッドをインポートします。
  • 2. @wordpress/editor'パッケージから必要なSlotFillをインポートします。
  • 3. 変更をレンダリングするコンポーネントを定義します。私たちの変更/追加は、インポートしたSlotFillコンポーネントでラップされます。
  • 4. プラグインを登録します。

以下は、PluginPostStatusInfo slotFillを使用した例です:

  1. import { registerPlugin } from '@wordpress/plugins';
  2. import { PluginPostStatusInfo } from '@wordpress/editor';
  3. const PluginPostStatusInfoTest = () => (
  4. <PluginPostStatusInfo>
  5. <p>Post Status Info SlotFill</p>
  6. </PluginPostStatusInfo>
  7. );
  8. registerPlugin( 'post-status-info-test', { render: PluginPostStatusInfoTest } );

条件付きでSlotFillコンテンツをレンダリングする

MainDashboardButtonを除いて、利用可能なすべてのSlotFillは、Post EditorとSite Editorの両方で公開されており、登録されたFillは両方のコンテキストでレンダリングされます。Fillsを条件付きでレンダリングするために実装できるアプローチはいくつかあります。

Post EditorにFillsを制限する

Fillは、現在の投稿タイプオブジェクトプロパティviewabletrueに設定されているかどうかを確認することで、Post Editorに制限できます。viewableに設定されていない投稿タイプは、関連する投稿編集画面を持たず、ユーザーがPost Editorにいないことを示す良い指標です。以下の例は、登録された投稿タイプの編集投稿画面でそのコンテンツをレンダリングします。

  1. /**
  2. * WordPress dependencies
  3. */
  4. import { registerPlugin } from '@wordpress/plugins';
  5. import {
  6. PluginDocumentSettingPanel,
  7. store as editorStore,
  8. } from '@wordpress/editor';
  9. import { store as coreStore } from '@wordpress/core-data';
  10. import { useSelect } from '@wordpress/data';
  11. import { __ } from '@wordpress/i18n';
  12. /**
  13. * The component to be rendered as part of the plugin.
  14. */
  15. const EditPostDocumentSettingPanel = () => {
  16. // Retrieve information about the current post type.
  17. const isViewable = useSelect( ( select ) => {
  18. const postTypeName = select( editorStore ).getCurrentPostType();
  19. const postTypeObject = select( coreStore ).getPostType( postTypeName );
  20. return postTypeObject?.viewable;
  21. }, [] );
  22. // If the post type is not viewable, then do not render my the fill.
  23. if ( ! isViewable ) {
  24. return null;
  25. }
  26. return (
  27. <PluginDocumentSettingPanel
  28. name="custom-panel"
  29. title={ __( 'Post Editor Example' ) }
  30. className="custom-panel"
  31. >
  32. <p>{ __( 'Only appears in the Edit Post screen' ) }</p>
  33. </PluginDocumentSettingPanel>
  34. );
  35. };
  36. registerPlugin( 'example-post-edit-only', {
  37. render: EditPostDocumentSettingPanel,
  38. } );

特定の投稿タイプにFillsを制限する

以下の例は、Fillがレンダリングされる投稿タイプの許可リストを作成することによって、上記の例を拡張します。この場合、Fillはページを編集しているときのみレンダリングされます。

  1. /**
  2. * WordPress dependencies
  3. */
  4. import { registerPlugin } from '@wordpress/plugins';
  5. import {
  6. PluginDocumentSettingPanel,
  7. store as editorStore,
  8. } from '@wordpress/editor';
  9. import { store as coreStore } from '@wordpress/core-data';
  10. import { useSelect } from '@wordpress/data';
  11. import { __, sprintf } from '@wordpress/i18n';
  12. /**
  13. * The component to be rendered as part of the plugin.
  14. */
  15. const RestrictPostTypes = () => {
  16. // Retrieve information about the current post type.
  17. const { isViewable, postTypeName } = useSelect( ( select ) => {
  18. const postType = select( editorStore ).getCurrentPostType();
  19. const postTypeObject = select( coreStore ).getPostType( postType );
  20. return {
  21. isViewable: postTypeObject?.viewable,
  22. postTypeName: postType,
  23. };
  24. }, [] );
  25. // The list of post types that are allowed to render the plugin.
  26. const allowedPostTypes = [ 'page' ];
  27. // If the post type is not viewable or not in the allowed list, do not render the plugin.
  28. if ( ! isViewable || ! allowedPostTypes.includes( postTypeName ) ) {
  29. return null;
  30. }
  31. return (
  32. <PluginDocumentSettingPanel
  33. name="custom-panel"
  34. title={ __( 'Restrict Post Types Example' ) }
  35. className="custom-panel"
  36. >
  37. <p>
  38. { sprintf(
  39. __(
  40. 'Only appears on Post Types that are in the allowed list. %s'
  41. ),
  42. allowedPostTypes.join( ', ' )
  43. ) }
  44. </p>
  45. </PluginDocumentSettingPanel>
  46. );
  47. };
  48. registerPlugin( 'example-restrict-post-types', {
  49. render: RestrictPostTypes,
  50. } );

Site EditorにFillsを制限する

FillsをSite Editorに制限するには、逆の論理が適用されます。投稿タイプオブジェクトのviewableプロパティがtrueに設定されている場合、Fillはレンダリングされるべきではありません。以下の例は、任意のSite Editor画面でそのコンテンツをレンダリングします。

  1. /**
  2. * WordPress dependencies
  3. */
  4. import { registerPlugin } from '@wordpress/plugins';
  5. import {
  6. PluginDocumentSettingPanel,
  7. store as editorStore,
  8. } from '@wordpress/editor';
  9. import { store as coreStore } from '@wordpress/core-data';
  10. import { useSelect } from '@wordpress/data';
  11. import { __ } from '@wordpress/i18n';
  12. /**
  13. * The component to be rendered as part of the plugin.
  14. */
  15. const SiteEditorDocumentSettingPanel = () => {
  16. // Retrieve information about the current post type.
  17. const isViewable = useSelect( ( select ) => {
  18. const postTypeName = select( editorStore ).getCurrentPostType();
  19. const postTypeObject = select( coreStore ).getPostType( postTypeName );
  20. // A viewable post type is one than can be viewed in the WordPress admin. Internal ones are not set to viewable.
  21. return postTypeObject?.viewable;
  22. }, [] );
  23. // If the post type is viewable, do not render my fill
  24. if ( isViewable ) {
  25. return null;
  26. }
  27. return (
  28. <PluginDocumentSettingPanel
  29. name="custom-panel"
  30. title={ __( 'Site Editor Example' ) }
  31. className="custom-panel"
  32. >
  33. <p>{ __( 'Only appears in the Site Editor' ) }</p>
  34. </PluginDocumentSettingPanel>
  35. );
  36. };
  37. registerPlugin( 'example-site-editor', {
  38. render: SiteEditorDocumentSettingPanel,
  39. } );

Site Editorの特定の画面にFillsを制限する

この例は、Site Editor内でFillがレンダリングできる画面を制御するための許可リストを提供することによって、上記の例を基にしています。

  1. /**
  2. * WordPress dependencies
  3. */
  4. import { registerPlugin } from '@wordpress/plugins';
  5. import {
  6. PluginDocumentSettingPanel,
  7. store as editorStore,
  8. } from '@wordpress/editor';
  9. import { store as coreStore } from '@wordpress/core-data';
  10. import { useSelect } from '@wordpress/data';
  11. import { __, sprintf } from '@wordpress/i18n';
  12. /**
  13. * The component to be rendered as part of the plugin.
  14. */
  15. const SiteEditorDocumentSettingPanel = () => {
  16. // Allowed areas in the Site Editor.
  17. const allowedSiteEditorScreens = [
  18. 'wp_template', // Templates
  19. 'wp_block', // Patterns
  20. 'wp_template_part', // Template Parts
  21. ];
  22. const { isViewable, postType } = useSelect( ( select ) => {
  23. const postTypeName = select( editorStore ).getCurrentPostType();
  24. const postTypeObject = select( coreStore ).getPostType( postTypeName );
  25. return {
  26. // A viewable post type is one than can be viewed in the WordPress admin. Internal ones are not set to viewable.
  27. isViewable: postTypeObject?.viewable,
  28. postType: postTypeName,
  29. };
  30. }, [] );
  31. // If the post type is viewable, do not render my plugin.
  32. if ( isViewable || ! allowedSiteEditorScreens.includes( postType ) ) {
  33. return null;
  34. }
  35. return (
  36. <PluginDocumentSettingPanel
  37. name="custom-panel"
  38. title={ __( 'Restricted to Site Editor screens' ) }
  39. className="custom-panel"
  40. >
  41. <p>
  42. { sprintf(
  43. __(
  44. 'Only appears on Editor Screens that are in the allowed list. %s'
  45. ),
  46. allowedSiteEditorScreens.join( ', ' )
  47. ) }
  48. </p>
  49. </PluginDocumentSettingPanel>
  50. );
  51. };
  52. registerPlugin( 'example-site-editor-only', {
  53. render: SiteEditorDocumentSettingPanel,
  54. } );

どのように機能するのか?

SlotFillsはcreateSlotFillを使用して作成されます。これにより、SlotFillの2つのコンポーネントが作成され、次にwp.pluginsグローバルでエクスポートされる新しいコンポーネントを作成するために使用されます。

PluginPostStatusInfo SlotFillの定義 (コアコードを参照)

  1. /**
  2. * Defines as extensibility slot for the Summary panel.
  3. */
  4. /**
  5. * WordPress dependencies
  6. */
  7. import { createSlotFill, PanelRow } from '@wordpress/components';
  8. export const { Fill, Slot } = createSlotFill( 'PluginPostStatusInfo' );
  9. const PluginPostStatusInfo = ( { children, className } ) => (
  10. <Fill>
  11. <PanelRow className={ className }>{ children }</PanelRow>
  12. </Fill>
  13. );
  14. PluginPostStatusInfo.Slot = Slot;
  15. export default PluginPostStatusInfo;

この新しいSlotは、エディタで公開されます。以下の例はコアからのもので、Summaryパネルを表しています。

ご覧のように、<PluginPostStatusInfo.Slot>はパネルに表示されるすべてのアイテムをラップしています。

SlotFillを介して追加されたアイテム(上記の例を参照)は、fillsパラメータに含まれ、コンポーネントの最後に表示されます。

コアコードを参照

  1. export default function PostSummary( { onActionPerformed } ) {
  2. const { isRemovedPostStatusPanel } = useSelect( ( select ) => {
  3. // We use isEditorPanelRemoved to hide the panel if it was programmatically removed. We do
  4. // not use isEditorPanelEnabled since this panel should not be disabled through the UI.
  5. const { isEditorPanelRemoved } = select( editorStore );
  6. return {
  7. isRemovedPostStatusPanel: isEditorPanelRemoved( PANEL_NAME ),
  8. };
  9. }, [] );
  10. return (
  11. <PostPanelSection className="editor-post-summary">
  12. <PluginPostStatusInfo.Slot>
  13. { ( fills ) => (
  14. <>
  15. <VStack spacing={ 4 }>
  16. <PostCardPanel
  17. onActionPerformed={ onActionPerformed }
  18. />
  19. <PostFeaturedImagePanel withPanelBody={ false } />
  20. <PostExcerptPanel />
  21. <VStack spacing={ 1 }>
  22. <PostContentInformation />
  23. <PostLastEditedPanel />
  24. </VStack>
  25. { ! isRemovedPostStatusPanel && (
  26. <VStack spacing={ 2 }>
  27. <VStack spacing={ 1 }>
  28. <PostStatusPanel />
  29. <PostSchedulePanel />
  30. <PostURLPanel />
  31. <PostAuthorPanel />
  32. <PostTemplatePanel />
  33. <PostDiscussionPanel />
  34. <PageAttributesPanel />
  35. <PostSyncStatus />
  36. <BlogTitle />
  37. <PostsPerPage />
  38. <SiteDiscussion />
  39. <PostFormatPanel />
  40. <PostStickyPanel />
  41. </VStack>
  42. <TemplateAreas />
  43. { fills }
  44. </VStack>
  45. ) }
  46. </VStack>
  47. </>
  48. ) }
  49. </PluginPostStatusInfo.Slot>
  50. </PostPanelSection>
  51. );
  52. }

現在利用可能なSlotFillsと例

以下のSlotFillsは、edit-postまたはeditorパッケージで利用可能です。使用法と例の詳細については、以下の個別のアイテムを参照してください: