Practical example 03

フロントエンドフォームで
既存投稿を編集する

ログインユーザーに、管理画面ではなくサイト側のフォームから既存投稿を編集させる実装例です。編集対象は post_id で指定し、投稿タイプと権限をサーバー側で確認します。

01

この実装でできること

  • 既存投稿のCFSフィールドを、フロントエンドフォームで編集する。
  • 編集リンクから post_id を渡し、対象投稿を指定する。
  • 投稿タイプを固定し、別の投稿タイプを編集されないようにする。
  • WordPressの edit_post 権限で保存可否を判定する。
新規投稿とは分けて考えます

新規作成は 新規投稿編 を参照してください。このページでは、既存投稿だけを編集する構成にしています。

02

保存時に編集権限を確認する

テーマの functions.php またはサイト専用プラグインへ追加します。既存投稿の編集では post_id が渡されるため、current_user_can( 'edit_post', $post_id ) で判定します。

functions.php

PHP / 権限
<?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
);
03

フォーム用CSS・JavaScriptを読み込む

フォームを設置する固定ページのスラッグを front-form-edit とした例です。

functions.php

PHP / Assets
<?php
add_action( 'wp_enqueue_scripts', function () {
  if ( is_page( 'front-form-edit' ) && is_user_logged_in() ) {
    CFS()->form->load_assets();
  }
} );
05

ページテンプレートで既存投稿を読み込む

post_id がない場合は編集対象が決まらないため、404または403を返します。投稿タイプと編集権限を確認したうえで、CFS()->form()post_id を渡します。

page-front-form-edit.php

PHP / Template
<?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(); ?>
06

本人の投稿だけに限定する場合

会員投稿のように「自分の投稿だけ編集可能」にしたい場合は、権限確認に加えて投稿者IDも確認します。

投稿者を確認する例

PHP / Owner check
<?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 ) を優先するか、本人だけに限定するかを決めてください。

07

運用前に確認する

  • post_id が空の場合、編集フォームを表示しない。
  • 対象外の投稿タイプを指定すると404になる。
  • 権限のない投稿IDを指定すると403になる。
  • 許可されたユーザーだけが既存投稿を更新できる。
  • 保存後の遷移先が、編集した投稿または完了ページになっている。