この実装でできること
- 設定画面で作成したフィールドグループをフロントエンドへ表示する。
- 投稿タイプを指定し、ログインユーザーが新しい下書きを作成する。
- タブ、アコーディオン、条件分岐、繰り返しフィールドを同じフォーム内で利用する。
利用するAPI
CFS()->form() が入力欄、nonce、フォームセッション、保存処理をまとめて提供します。
Practical example 02
atshift Fieldsで作成したフィールドグループを、ログインユーザー向けの入力フォームとしてWebサイト側へ表示し、指定した投稿タイプへ新規投稿を作成する実装例です。
CFS()->form() が入力欄、nonce、フォームセッション、保存処理をまとめて提供します。
post=123 の数値から、フィールドグループIDを確認します。以下のコードにある 123 は、実際のフィールドグループIDへ置き換えてください。
テーマの functions.php またはサイト専用プラグインへ追加します。新規投稿は投稿タイプの create_posts 権限で判定します。
<?php
add_filter(
'cfs_form_can_save',
function ( $can_save, $post_id, $post_data ) {
if ( ! is_user_logged_in() ) {
return false;
}
$post_type = sanitize_key( $post_data['post_type'] ?? 'post' );
$object = get_post_type_object( $post_type );
return $object
&& current_user_can( $object->cap->create_posts );
},
10,
5
);フォームを設置する固定ページのスラッグを front-form とした例です。wp_head() より前に登録されるよう、wp_enqueue_scripts から読み込みます。
<?php
add_action( 'wp_enqueue_scripts', function () {
if ( is_page( 'front-form' ) && is_user_logged_in() ) {
CFS()->form->load_assets();
}
} );フォームを設置した固定ページから、member_entry 投稿タイプの下書きを新規作成します。
このテンプレートを設定した固定ページ自体へ値を保存するわけではありません。post_type に post を指定すれば通常の投稿へ、カスタム投稿タイプ名を指定すればその投稿タイプへ保存されます。
<?php
/* Template Name: CFS Front-end Form */
if ( ! is_user_logged_in() ) {
auth_redirect();
}
$post_type = 'member_entry'; // 保存先のカスタム投稿タイプを指定
get_header();
?>
<main class="front-form">
<h1>新しく登録</h1>
<?php
echo CFS()->form( array(
'post_id' => false, // falseなら新規作成
'field_groups' => array( 123 ), // 使用するフィールドグループID
'post_type' => $post_type, // 保存先のカスタム投稿タイプ
'post_status' => 'draft', // 新規投稿は下書きで保存
'post_title' => 'タイトル',
'submit_label' => '保存する',
'confirmation_url' => home_url( '/front-form/?saved=1' ),
) );
?>
</main>
<?php get_footer(); ?>既存投稿の更新は、既存投稿編集編で post_id を使う方法を紹介しています。
公開フォームとして運用する場合は、ログイン限定とは別の設計が必要です。
esc_html()、esc_url()、wp_kses_post() などを使う。公開する理由がなければ、非ログインユーザーはサーバー側で拒否するのが最も確実です。