web-dev-qa-db-ja.com

カスタム投稿タイプの必須の抜粋

これは難題であることが証明されています。

抜粋を必須フィールドにしようとしていますが、カスタム投稿タイプで投稿を編集/保存するときだけです。

次のコードでは、すべての投稿に対して抜粋を必須フィールドにしていますが、その影響を単一のカスタム投稿タイプに絞り込むことは考慮されていません。

function mandatory_excerpt($data) {
  $excerpt = $data['post_excerpt'];

  if (empty($excerpt)) {
    if ($data['post_status'] === 'publish') {
      add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
    }

    $data['post_status'] = 'draft';
  }

  return $data;
}

add_filter('wp_insert_post_data', 'mandatory_excerpt');

function excerpt_error_message_redirect($location) {
  remove_filter('redirect_post_location', __FILTER__, '99');
  return add_query_arg('excerpt_required', 1, $location);
}

function excerpt_admin_notice() {
  if (!isset($_GET['excerpt_required'])) return;

  switch (absint($_GET['excerpt_required'])) {
    case 1:
      $message = 'Excerpt is required to publish a post.';
      break;
    default:
      $message = 'Unexpected error';
  }

  echo '<div id="notice" class="error"><p>' . $message . '</p></div>';
}

add_action('admin_notices', 'excerpt_admin_notice');
5
Chris

このコードはwp_insert_post_dataにフィルタを追加します。

add_filter('wp_insert_post_data', 'mandatory_excerpt');

そしてこれがコールバックです。

function mandatory_excerpt($data) {
  $excerpt = $data['post_excerpt'];

  if (empty($excerpt)) {
    if ($data['post_status'] === 'publish') {
      add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
    }

    $data['post_status'] = 'draft';
  }

  return $data;
}

フィルタコールバックは$dataを渡されます。これは Codexに従って に次の投稿データを含みます。

'post_author',
'post_date',
'post_date_gmt',
'post_content',
'post_content_filtered',
'post_title',
'post_excerpt',
'post_status',
'post_type',
'comment_status',
'ping_status',
'post_password',
'post_name',
'to_ping',
'pinged',
'post_modified',
'post_modified_gmt',
'post_parent',
'menu_order',
'guid'

これらのデータには'post_type'が含まれています。つまり、コールバック内でそれを使用できます。

function mandatory_excerpt($data) {
    if ( 'custom-posttype-slug' != $data['post_type'] ) {
        return $data;
    } else {
        $excerpt = $data['post_excerpt'];

        if (empty($excerpt)) {
            if ($data['post_status'] === 'publish') {
                add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
            }     
            $data['post_status'] = 'draft';
        }
    }     
    return $data;
}
5
Chip Bennett

投稿を削除したり公開したりすることができないという問題を解決するには、mandatory_excerpt()関数が$_GET['action']が指定されていない場合にのみ起動するように、追加のチェックを追加します。それ以外の場合、投稿を削除したり公開ステータスを変更したりすると、関数は常にエラーを返します。

そのため、変更された機能は次のようになります。

function mandatory_excerpt($data) {
    if ( 'custom-post-type-here' != $data['post_type'] || $_GET['action'] ) {
        return $data;
    } else {
        $excerpt = $data['post_excerpt'];

        if (empty($excerpt)) {
            if ($data['post_status'] === 'publish') {
                add_filter('redirect_post_location', 'bstcm_excerpt_error_message_redirect', '99');
            }     
            $data['post_status'] = 'draft';
        }
    }     
    return $data;
}
1
Jelle Wielsma

私はこのサイトにコメントするのに十分な評判がありません。

使用しているコードには投稿ステータスの適切なチェックがありません。その結果、あなたの管理ダッシュボードは通常空であるたくさんの自動ドラフトでいっぱいになります。

簡単な解決策は、次のようにすることです。

    function mandatory_excerpt($data) {
            if (empty($data['post_excerpt']) && $data['post_type'] != 'custom-post-type' && !isset($_GET['action'])) {

                    if ($data['post_status'] === 'publish') {
                            add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
                    }

                    if ($data['post_status'] == 'publish' || $data['post_status'] == 'future' || $data['post_status'] == 'pending') {
                            $data['post_status'] = 'draft';
                    }
            }

            return $data;
    }
0
Jamie