レガシーウィジェットブロックとの互換性

ウィジェット追加イベント

レガシーウィジェットブロックは、ウィジェットのフォームをカスタマイザーに似た方法で表示し、ほとんどのサードパーティウィジェットと互換性があります。

ウィジェットがそのフォームでJavaScriptを使用している場合、'widget-added' jQueryイベントがdocumentでトリガーされた後にDOMにイベントを追加することが重要です。

例えば、ウィジェットは「パスワード変更」チェックボックスがチェックされているときに「パスワード」フィールドを表示したいかもしれません。

  1. ( function ( $ ) {
  2. $( document ).on( 'widget-added', function ( $event, $control ) {
  3. $control.find( '.change-password' ).on( 'change', function () {
  4. var isChecked = $( this ).prop( 'checked' );
  5. $control.find( '.password' ).toggleClass( 'hidden', ! isChecked );
  6. } );
  7. } );
  8. } )( jQuery );

ウィジェットのすべてのイベントハンドラーは、widget-addedコールバック内で追加されることに注意してください。

「プレビューは利用できません。」の表示

レガシーウィジェットブロックは、レガシーウィジェットブロックが選択されていないときにウィジェットのプレビューを表示します。

ウィジェットのwidget()関数が何もレンダリングしないか、空のHTML要素のみをレンダリングする場合、レガシーウィジェットブロックによって「プレビューは利用できません。」というメッセージが自動的に表示されます。

ウィジェットは、プレビューを表示する必要がない場合にwidget()から早期に戻ることでこれを利用できます。

  1. class ExampleWidget extends WP_Widget {
  2. ...
  3. public function widget( $instance ) {
  4. if ( ! isset( $instance['name'] ) ) {
  5. // Name is required, so display nothing if we don't have it.
  6. return;
  7. }
  8. ?>
  9. <h3>Name: <?php echo esc_html( $instance['name'] ); ?></h3>
  10. ...
  11. <?php
  12. }
  13. ...
  14. }

ブロックへの移行を許可する

特定のウィジェットを含むレガシーウィジェットブロックをブロックまたは複数のブロックに簡単に移行できるようにユーザーに許可できます。これにより、プラグインの著者は、より直感的で多くの場所で使用できるブロックにウィジェットを段階的に廃止することができます。

以下の手順でこれを行う方法を示します。

1) ウィジェットのインスタンスをREST APIに表示する

まず、WordPressにウィジェットのインスタンス配列をREST APIに表示することが許可されていることを伝える必要があります。

これは安全に行うことができます:

  • あなたのウィジェットが$instanceに保存するすべての値がJSONとして表現できることを知っている場合; そして
  • あなたのウィジェットが$instanceにユーザーから隠すべきプライベートデータを保存していないことを知っている場合。

安全であれば、ウィジェットを登録するときにshow_instance_in_restというウィジェットオプションを含め、その値をtrueに設定します。

  1. class ExampleWidget extends WP_Widget {
  2. ...
  3. /**
  4. * Sets up the widget
  5. */
  6. public function __construct() {
  7. $widget_ops = array(
  8. // ...other options here
  9. 'show_instance_in_rest' => true,
  10. // ...other options here
  11. );
  12. parent::__construct( 'example_widget', 'ExampleWidget', $widget_ops );
  13. }
  14. ...
  15. }

これにより、ブロックエディターや他のREST APIクライアントは、REST APIレスポンス内のinstance.rawにアクセスすることでウィジェットのインスタンス配列を見ることができます。

WordPressのバージョン5.8.0以前では、$show_instance_in_resttrueに設定することでこの機能を有効にすることができましたWP_Widgetを拡張するクラス内で。

  1. class ExampleWidget extends WP_Widget {
  2. ...
  3. public $show_instance_in_rest = true;
  4. ...
  5. }

これは、ウィジェットオプションメソッドのために非推奨となりました。

2) ブロック変換を追加する

次に、レガシーウィジェットブロックを含むウィジェットを何に置き換えるかをブロックエディターに指示するブロック変換を定義できます。

これは、ウィジェットの定義にJavaScriptコードを追加することで行います。この例では、IDが'example_widget'のウィジェットを'example/block'という名前のブロックに変換する変換を定義します。

  1. transforms: {
  2. from: [
  3. {
  4. type: 'block',
  5. blocks: [ 'core/legacy-widget' ],
  6. isMatch: ( { idBase, instance } ) => {
  7. if ( ! instance?.raw ) {
  8. // Can't transform if raw instance is not shown in REST API.
  9. return false;
  10. }
  11. return idBase === 'example_widget';
  12. },
  13. transform: ( { instance } ) => {
  14. return createBlock( 'example/block', {
  15. name: instance.raw.name,
  16. } );
  17. },
  18. },
  19. ]
  20. },

3) レガシーウィジェットブロックからウィジェットを隠す

最後の仕上げとして、レガシーウィジェットブロックに「ウィジェットを選択」ドロップダウンとブロックインサータからウィジェットを隠すように指示できます。これにより、ユーザーはウィジェットを置き換えるブロックを使用することが奨励されます。

これはwidget_types_to_hide_from_legacy_widget_blockフィルターを使用して行うことができます。

  1. function hide_example_widget( $widget_types ) {
  2. $widget_types[] = 'example_widget';
  3. return $widget_types;
  4. }
  5. add_filter( 'widget_types_to_hide_from_legacy_widget_block', 'hide_example_widget' );

他のブロックエディターでのレガシーウィジェットブロックの使用(高度な)

オプションで、WordPressの投稿エディターなどの他のブロックエディターでレガシーウィジェットブロックを許可できます。これはデフォルトでは有効になっていません。

まず、レガシーウィジェットが必要とするスタイルとスクリプトがページに読み込まれていることを確認します。これを行う便利な方法は、ユーザーがウィジェットのWP管理画面に移動するときに通常実行されるすべてのフックを手動で実行することです。

  1. add_action( 'admin_print_styles', function() {
  2. if ( get_current_screen()->is_block_editor() ) {
  3. do_action( 'admin_print_styles-widgets.php' );
  4. }
  5. } );
  6. add_action( 'admin_print_scripts', function() {
  7. if ( get_current_screen()->is_block_editor() ) {
  8. do_action( 'load-widgets.php' );
  9. do_action( 'widgets.php' );
  10. do_action( 'sidebar_admin_setup' );
  11. do_action( 'admin_print_scripts-widgets.php' );
  12. }
  13. } );
  14. add_action( 'admin_print_footer_scripts', function() {
  15. if ( get_current_screen()->is_block_editor() ) {
  16. do_action( 'admin_print_footer_scripts-widgets.php' );
  17. }
  18. } );
  19. add_action( 'admin_footer', function() {
  20. if ( get_current_screen()->is_block_editor() ) {
  21. do_action( 'admin_footer-widgets.php' );
  22. }
  23. } );

次に、registerLegacyWidgetBlockを使用してレガシーウィジェットブロックを登録します。これは@wordpress/widgetsパッケージで定義されています。

  1. add_action( 'enqueue_block_editor_assets', function() {
  2. wp_enqueue_script( 'wp-widgets' );
  3. wp_add_inline_script( 'wp-widgets', 'wp.widgets.registerLegacyWidgetBlock()' );
  4. } );