Contact Form 7をREST API 経由でエラー415になった

React からREST API経由でContact Form 7 を利用していたのですが、エラーで415が返ってくるようになりました。

415は、以下のエラーとのこと。

HTTP 415 Unsupported Media Type クライアントエラーレスポンスコードは、ペイロードフォーマットがサポートされていないフォーマットであるため、サーバーがリクエストの受け入れを拒否することを示します

MDN

原因は何だったかと言うとContact Form 7 5.6に「REST API: フィードバック作成リクエストの Content-Type ヘッダーが multipart/form-data ではない場合に 415 HTTP エラーステータスを応答する。」というアップデートがあった為でした。

今までは、Content-Typeは、application/x-www-form-urlencodedとなっていました。ということで、修正後のコードがこちら。

  const handleSubmit = () => {

    const endpoint = process.env.REACT_APP_endpoint_contact
    const params = new FormData()
    params.append('yourName', name)
    params.append('yourEmail', email)
    params.append('yourMessage', message)

    const axiosConfig = {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    }

    axios
      .post(endpoint, params, axiosConfig)
      .then((res) => {
        setResMessage(res.data.message)
        setResStyle(res.data.status)

        if (res.data.status === 'mail_sent') {
          setName('')
          setEmail('')
          setMessage('')
        }
      })
      .catch((error) => {
        console.error(error)
      })
  }

参考ページ

https://reiji1020.hatenablog.com/entry/2018/12/31/113202

WordPress:REST API with Smart Custom Field

REST API

以前は、プラグインが必要だったREST APIですが、現行のWordPress5のcoreには、初めからREST APIが入っているようです。
今回、繰り替えしのフィールドが必要だったため、カスタムフィールドを登録するプラグインはSmart Custom Fieldを使用します。

カスタム投稿タイプとカスタムフィールドをREST APIに出力

カスタム投稿タイプをREST APIに出力するには、カスタム投稿タイプ作成時にREST APIに出力する設定が必要です。

function create_post_type() {
  $supports = [ 
    'title', // title
    'editor', // editor
  ];
  register_post_type( 'fruits', // 例:果物の場合
    array(
      'label' => '果物',
      'public' => true,
      'has_archive' => false,
      'menu_position' => 7,
      'supports' => $supports,
      'show_in_rest' => true, //rest api での取得有効にする
      'rest_base' => 'fruits' // rest api での取得名  /wp-json/wp/v2/fruits
    )
  );
}
add_action( 'init', 'create_post_type' );

REST APIの結果を確認してみましょう。

https://your-domain.com/wp-json/wp/v2/fruits

次にSmart Custom Fieldの値をREST APIに出力する設定を行います。
仮にSmart Custom Fieldに設定した名前が以下とします。

fruits_color テキストが入ります。
fruits_image idが入ります。

functions.phpに以下のコードを入力します。

// rest apiにカスタムフィールドを出力
add_action( 'rest_api_init', 'slug_register_fruits' );
function slug_register_fruits() {
  register_rest_field( 
    'fruits',   //フィールドを追加したいcustom投稿タイプを指定(先ほど登録したカスタム投稿タイプslugを指定)
    'fruits_meta',  // rest-apiに追加するキー
    array(
      'get_callback' => function( $object, $field_name, $request ) {
        // 出力したいカスタムフィールドのキーをここで定義
        $meta_fields = array(
          'fruits_color',
          'fruits_image',
        );
        $meta = array();
        foreach ( $meta_fields as $field ) {
          // バリデーションを一切してないので注意
          $meta[ $field ] = get_post_meta( $object['id'], $field, false ); // 第3引数はfalse、Smart Custom Fieldの繰り替えし機能を使うため
        }
        return $meta;
      },
      'update_callback' => null,
      'schema'          => null,
    )
  );
}

ここで注意して欲しいのが17行目のget_post_meta関数の第3引数です。
Smart Custom Fieldの繰り返しの機能を利用すると、繰り返されたグループの値は、カスタムフィールドに配列で格納されます。
そのため、第3引数にfalseを渡して、値を配列として受け取ります。
第3引数がtrueだと、繰り返されたグループの値が取得できません。

REST APIの出力結果を確認してみましょう。
カスタムフィールドの値が出力されているのが確認できると思います。

https://your-domain.com/wp-json/wp/v2/fruits

参考

wordpress rest-apiでカスタムフィールドを出力する際に処理結果を整形したい
https://qiita.com/kinshist/items/cd9f74af7db7c80746a1

WordPress:条件分岐まとめ

WordPressで利用する条件分岐をこのページで徐々にまとめていきます。 カスタム投稿タイプ 投稿タイプ 特定の投稿タイプかどうか判定します。 if (get_post_type() === ‘投稿タイプ名’) { / … “WordPress:条件分岐まとめ” の続きを読む

WordPressで利用する条件分岐をこのページで徐々にまとめていきます。

カスタム投稿タイプ

投稿タイプ

特定の投稿タイプかどうか判定します。

if (get_post_type() === '投稿タイプ名') {
  //処理
}

アーカイブページ

// 一つの投稿タイプを判定
if( is_post_type_archive( '投稿タイプ名' ) ) {
  // 処理
}

// 複数の投稿タイプを判定(いづれかの投稿タイプのアーカイブページであればtrue)
if( is_post_type_archive( array( '投稿タイプ名 A', '投稿タイプ名 B', '投稿タイプ名 C') ) ) {
  // 処理
}

WordPress:特定の親ページを持っているかどうか判定する

特定の親ページを持っているかどうかを判定したい時には、以下のコードで分岐できます。 <?php if ($post->post_parent) { $post_data = get_post($post-&g … “WordPress:特定の親ページを持っているかどうか判定する” の続きを読む

特定の親ページを持っているかどうかを判定したい時には、以下のコードで分岐できます。

<?php if ($post->post_parent) {

	$post_data = get_post($post->post_parent);
	$parent_slug = $post_data->post_name;

	if ($parent_slug === '判定したい親ページのスラッグ') { ?>
		<!-- ここにtrueの場合の処理 -->
	<?php } else { ?>
		<!-- ここにfalseの場合の処理 -->
	<?php }
} ?>

WordPress:子テーマのディレクトリーURIを取得する

親テーマのディレクトリーURI get_template_directory_uri() 子テーマのディレクトリーのURI get_stylesheet_directory_uri()

親テーマのディレクトリーURI

get_template_directory_uri()

子テーマのディレクトリーのURI

get_stylesheet_directory_uri()

WordPress:複数のカスタムフィールドの値を元に記事を絞り込みたい時の書き方

複数のカスタムフィールドの値を元に記事を絞り込みたい時、’relation’パラメータの’OR’と’AND’を同時に使う書き方です。 以下のコードで … “WordPress:複数のカスタムフィールドの値を元に記事を絞り込みたい時の書き方” の続きを読む

複数のカスタムフィールドの値を元に記事を絞り込みたい時、’relation’パラメータの’OR’と’AND’を同時に使う書き方です。

以下のコードでは、カスタムフィールド’cf_date_01’での絞り込み条件に該当する記事、もしくは、カスタムフィールド’cf_date_02’での絞り込み条件に該当し、かつ、カスタムフィールド’cf_date_03’での絞り込み条件に該当する記事を返します。A もしくは B かつ C という条件です。

When you want to narrow down posts with multiple customfields we can use parameter Relation’s value ‘OR’ and ‘AND’ at the same time.
Code below show you how to use ‘OR’ and ‘AND’ at the same time.
It can be conditions that A or B and C.

$date = date("Y-m-d");

$query = new WP_Query( array(
	'meta_query' => array(
		'relation' => 'OR',
		array(
			'key' => 'cf_date_01',
			'value' => $date,
			'compare' => 'LIKE'
		),
		array(
			'relation' => 'AND',
			array(
				'key' => 'cf_date_02',
				'value' => $date,
				'compare' => '<='
			),
			array(
				'key' => 'cf_date_03',
				'value' => $date,
				'compare' => '>='
			)
		)
	)
));

参考: