この記事は最後に更新してから1年以上経過しています。

Gutenberg、「新規追加」に難あり

説明

昨日公開した「Gutenberg、初見です」で自作プラグインの「複製」機能が正しく動作していないことについて軽く触れた。該当するプラグインを修正するにしても原因がはっきりしないと手の打ちようがない。そんなわけで、不具合の原因を調べてみた。

'default_content'フィルター

「複製」機能の実装は、管理画面向けのget_default_post_to_edit関数(/wp-admin/includes/post.php)が実行する'default_content'フィルターを利用している。get_default_post_to_edit関数は、名前の通り新規の投稿記事を編集する際のデフォルトの投稿データを用意しその内容を返すものだ。この関数の中では、いくつかのフィルターにより、デフォルトの投稿データが変更可能になっている。

  • 'default_content'フィルター
    デフォルトの投稿本文向け
  • 'default_title'フィルター
    デフォルトの投稿タイトル向け
  • 'default_excerpt'フィルター
    デフォルトの投稿抜粋向け

不具合の原因を絞り込むため、'default_content'フィルターが実行されているかを確認。投稿の「新規追加」は/wp-admin/post-new.phpファイルが実体なので、そのファイル中のget_default_post_to_edit関数の呼び出し直後に取得した$postの内容をダンプしてみた。

$post = get_default_post_to_edit( $post_type, true );

ダンプした内容には'default_content'フィルターで変更した内容が反映されており、フィルター自身が実行されていることが確認できた。

あらためてget_default_post_to_edit関数の処理内容を確認してみると、空の投稿データを登録してから各フィルターで投稿データを変更するようになっている。新しいエディターは編集開始時にREST APIによって編集対象の投稿データを取得していることを思い出し、新しいエディターはフィルターで変更をする前の空の投稿データが表示されているのではと仮説を立てる。そこで仮説を検証するため、get_default_post_to_edit関数で返り値を返す直前で強制的に投稿データを更新し(以下の赤字部分)、新しいエディターの表示が変化するか確認した。

	$post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt, $post );

	$post->post_title = 'Hello';
	$post->post_content = 'World';
	wp_update_post( $post );

	return $post;

この状態で「新規追加」したところ、タイトルは空のままだが、本文には'World'が反映されることがわかった。

タイトルは空のままだが、本文には'World'が反映された

とりあえずチケット発行

タイトルが反映されないのは謎のままだが、不具合なのは確かだと思われる。そんなわけでTracに「Default title and content are not reflected in new editing.」を投稿。この不具合の対応を見てからプラグインを修正しようと思う。

Gutenbergをめぐる旅は次回へ続く。

【追記】11/25 WordPress 5.0 Beta1がリリースされ、こちらの不具合は解決した模様。すばら!


最終更新 : 2018年10月25日 13:00

お勧め

add_shortcode(2018年5月27日 更新)

void add_shortcode( string $tag, mixed $func )
ショートコード(独自タグ)を追加する。ショートコードは、投稿記事内でテキスト内容がない[tag]や、テキストを内包する[tag]テキスト[/tag]の書式で使用できる独自タグのこと。標準の状態では、 the_content関数によって表示する直前のフィルター処理内でパラメータ$funcで指定した関数・メソッドが実行される。

get_user_setting(2022年1月31日 更新)

mixed get_user_setting( string $name [ , string $default = false ] )
ユーザーインターフェイス設定を取得する。

have_posts(2018年5月27日 更新)

bool have_posts( )
次の投稿データが存在するかを調べる。

in_category(2018年5月27日 更新)

bool in_category( mixed $category [ , mixed $post = null ] )
投稿情報が指定したカテゴリーに属しているか調べる。

add_feed(2024年6月24日 更新)

string add_feed( string $feedname, callable $callback )
フィードを追加する。