WordPressの有料テーマを購入した方から、親テーマで設定されたカスタム投稿に対して、子テーマではブロックエディタ対応したいというご要望を頂戴することがあります。

regiter_post_type関数で再登録すればよいだけなんじゃないの?と考えていたのですが、それではうまくいきませんでした。今回は子テーマからカスタム投稿をブロックエディタに変更する方法をご紹介します。

カスタム投稿をブロックエディタに対応させるには?

これはググれば結構情報が出てきますが、register_post_type関数でshow_in_restを設定することで対応が可能です。


function create_post_type() {
  register_post_type( 'work', /* 投稿タイプのslug */
    array(
      'labels' => array(
        'name' => __( '導入事例' ) /* 投稿タイプの名前 */
      ),
      'public' => true,
      'has_archive' => true,
      'supports' => array('title','editor','thumbnail'),
      'show_in_rest' => true,
    )
  );
}
add_action( 'init', 'create_post_type' );

親テーマでshow_in_restが設定されていない!子テーマからどうする?

ブロックエディタができるなんて想像していなかった頃に作られたテーマでは、 show_in_rest の設定がされていないものがあります。
子テーマ側でfunctions.phpに register_post_type関数でshow_in_restを再設定してやれば大丈夫なのではと考えたのですが、これではブロックエディタが使用できる状態にはなりません。

試しに親テーマのfunctions.phpを書き直して設定してやるともちろんブロックエディタは使用できるようになります。

今まで方法がわからず、親テーマのアップデート時にはカスタム投稿の設定部分にshow_in_restの設定を追加していたのですが、今回、方法がわかりました。

子テーマから親テーマのカスタム投稿設定を設定する

function ux_portfolio_block_editor( $args, $post_type ) {
    if ( 'featured_item' === $post_type ) {
        // 1. Enable in the REST API.
        $args['show_in_rest'] = true;

        // 2. Add the editor support.
        if ( empty( $args['supports'] ) || ! is_array( $args['supports'] ) ) {
            $args['supports'] = [ 'editor' ];
        } elseif ( ! in_array( 'editor', $args['supports'] ) ) {
            $args['supports'][] = 'editor';
        }
    }
    return $args;
}

引用元:How To Enable Block Editor (Gutenberg) for Existing Post Type via functions.php

カスタム投稿設定時、supportsにeditorを設定していないと、show_in_restを設定しただけでは、ブロックエディタにならないことがあります。このため、supportsについても確認しています。

備忘録でした。

プロフィール

荒岩 理津子
荒岩 理津子株式会社アールジャパン 代表取締役
株式会社東芝にてソフトウェア開発11年、サスペンションメーカーの広報6年、国立大学情報システムセンター非常勤職員、個人事業主を経て、2016年9月に株式会社アールジャパンとして法人化。WordPressに特化したWEBシステムの開発に携わる。Microsoft Visual Basic®のプログラミングに関する著書が9冊、そのうち一部は国立図書館に寄贈されている。色彩検定1級、Shoplifyパートナー。趣味は手芸一般。編み物歴、洋裁歴は四半世紀以上。神奈川県中小企業家同友会 広報委員会副委員長・編集長。