この実装でできること
- 既存投稿のCFSフィールドを、フロントエンドフォームで編集する。
- 編集リンクから
post_idを渡し、対象投稿を指定する。 - 投稿タイプを固定し、別の投稿タイプを編集されないようにする。
- WordPressの
edit_post権限で保存可否を判定する。
新規投稿とは分けて考えます
新規作成は 新規投稿編 を参照してください。このページでは、既存投稿だけを編集する構成にしています。
Practical example 03
ログインユーザーに、管理画面ではなくサイト側のフォームから既存投稿を編集させる実装例です。編集対象は post_id で指定し、投稿タイプと権限をサーバー側で確認します。
post_id を渡し、対象投稿を指定する。edit_post 権限で保存可否を判定する。新規作成は 新規投稿編 を参照してください。このページでは、既存投稿だけを編集する構成にしています。
テーマの functions.php またはサイト専用プラグインへ追加します。既存投稿の編集では post_id が渡されるため、current_user_can( 'edit_post', $post_id ) で判定します。
<?php
add_filter(
'cfs_form_can_save',
function ( $can_save, $post_id, $post_data ) {
if ( ! is_user_logged_in() ) {
return false;
}
if ( 0 < $post_id ) {
return current_user_can( 'edit_post', $post_id );
}
return false; // このページでは新規作成を許可しない
},
10,
5
);フォームを設置する固定ページのスラッグを front-form-edit とした例です。
<?php
add_action( 'wp_enqueue_scripts', function () {
if ( is_page( 'front-form-edit' ) && is_user_logged_in() ) {
CFS()->form->load_assets();
}
} );一覧ページやマイページなどから、フォーム用の固定ページへ post_id を付けてリンクします。
<?php
$edit_url = add_query_arg(
array(
'post_id' => get_the_ID(), // 編集したい既存投稿のID
),
home_url( '/front-form-edit/' ) // フォームを設置した固定ページ
);
?>
<a href="<?php echo esc_url( $edit_url ); ?>">この内容を編集</a>post_id がない場合は編集対象が決まらないため、404または403を返します。投稿タイプと編集権限を確認したうえで、CFS()->form() に post_id を渡します。
<?php
/* Template Name: CFS Front-end Edit Form */
if ( ! is_user_logged_in() ) {
auth_redirect();
}
$post_id = absint( $_GET['post_id'] ?? 0 );
$post_type = 'member_entry'; // 編集を許可する投稿タイプ
if ( ! $post_id ) {
wp_die( '編集対象が指定されていません。', '', array(
'response' => 404,
) );
}
// URLで別の投稿タイプを指定されないように確認
if ( $post_type !== get_post_type( $post_id ) ) {
wp_die( '対象外の投稿タイプです。', '', array(
'response' => 404,
) );
}
// ログインユーザーがこの投稿を編集できるか確認
if ( ! current_user_can( 'edit_post', $post_id ) ) {
wp_die( 'この投稿を編集する権限がありません。', '', array(
'response' => 403,
) );
}
get_header();
?>
<main class="front-form">
<h1>内容を編集</h1>
<?php
echo CFS()->form( array(
'post_id' => $post_id, // この既存投稿を更新
'field_groups' => array( 123 ), // 使用するフィールドグループID
'submit_label' => '保存する',
'confirmation_url' => get_permalink( $post_id ),
) );
?>
</main>
<?php get_footer(); ?>会員投稿のように「自分の投稿だけ編集可能」にしたい場合は、権限確認に加えて投稿者IDも確認します。
<?php
$owner_id = (int) get_post_field( 'post_author', $post_id );
if ( get_current_user_id() !== $owner_id ) {
wp_die( 'この投稿を編集する権限がありません。', '', array(
'response' => 403,
) );
}本人チェックだけにすると管理者も弾かれることがあります。運用に合わせて、current_user_can( 'edit_post', $post_id ) を優先するか、本人だけに限定するかを決めてください。
post_id が空の場合、編集フォームを表示しない。