You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义Blog文章类型的描述与封面图设为必填字段

自定义文章类型必填字段设置方案

需求说明

已创建名为Blog的自定义文章类型,包含标题、描述(编辑器)和封面图三个字段,需将描述和封面图设为必填项,发布时若缺失则显示错误提示并阻止发布。

实现步骤

  • 编辑器(描述)字段验证:通过后端钩子拦截保存请求,检查内容是否为空,为空则阻止发布并提示错误。
  • 封面图字段验证:同时添加前端提交前检查和后端保存验证,双重保障字段不为空。

修改后的完整代码

add_action('init', 'custom_blog_post_type');

function custom_blog_post_type()
{
  $labels = array(
    'name'          => 'Blogs',
    'singular_name' => 'Blog',
    'menu_name'     => 'Blogs',
    'add_new'       => 'Add New Blog',
    'add_new_item'  => 'Add New Blog Post',
    'edit_item'     => 'Edit Blog Post',
    'all_items'     => 'All Blogs',
  );

  $args = array(
    'labels'            => $labels,
    'public'            => true,
    'has_archive'       => true,
    'show_in_rest'      => true,
    'menu_icon'         => 'dashicons-edit',
    'supports'          => array('title', 'editor'),
  );

  register_post_type('blogs', $args);
}

// 封面图元框
function add_cover_image_meta_box() {
  add_meta_box(
    'cover_image_meta_box',
    'Cover Image',
    'cover_image_meta_box_callback',
    'blogs',
    'side',
    'high'
  );
}
add_action('add_meta_boxes', 'add_cover_image_meta_box');

function cover_image_meta_box_callback($post) {
  // 获取当前图片URL
  $image_url = get_post_meta($post->ID, '_cover_image', true);
?>
  <div>
    <label for="cover_image">Upload a cover image:</label>
    <input type="text" name="cover_image" id="cover_image" placeholder="image url" style="margin-top: 3px;" value="<?php echo esc_attr($image_url); ?>" />
    <button type="button" id="upload_button" style="margin-top: 5px;" class="button upload-image-button">Upload Image</button>
  </div>

  <div id="image_preview" style="margin-top: 10px;">
    <?php if ($image_url) : ?>
      <img src="<?php echo esc_url($image_url); ?>" alt="Cover Image" style="max-width: 100%; height: auto;" />
    <?php endif; ?>
  </div>

  <script>
    jQuery(document).ready(function($) {
      // 媒体上传功能
      $('#upload_button').click(function(e) {
        e.preventDefault();

        var mediaUploader = wp.media({
          title: 'Select Image',
          button: {
            text: 'Use this image'
          },
          multiple: false
        }).open().on('select', function() {
          var uploaded_image = mediaUploader.state().get('selection').first();
          var image_url = uploaded_image.toJSON().url;

          $('#cover_image').val(image_url);
          $('#image_preview').html('<img src="' + image_url + '" alt="Cover Image" style="max-width: 100%; height: auto;" />');
        })
      });

      // 前端发布验证
      $('#publish, #save-post').click(function(e) {
        var coverImage = $('#cover_image').val().trim();
        var editorContent = tinyMCE.activeEditor.getContent().trim();
        
        if (!coverImage || !editorContent) {
          e.preventDefault();
          alert('请填写完整的描述内容和封面图,才能发布文章!');
          return false;
        }
      });
    });
  </script>
<?php
}

// 保存封面图元数据
function save_cover_image_meta($post_id) {
  // 跳过自动保存和修订版本
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  if (wp_is_post_revision($post_id)) return;
  // 检查权限
  if (!current_user_can('edit_post', $post_id)) return;

  if (isset($_POST['cover_image'])) {
    update_post_meta($post_id, '_cover_image', sanitize_text_field($_POST['cover_image']));
  }
}
add_action('save_post', 'save_cover_image_meta');

// 编辑器内容必填验证(后端)
function validate_blog_content($post_data, $postarr) {
  // 仅针对blogs类型的发布操作
  if ($post_data['post_type'] === 'blogs' && $post_data['post_status'] === 'publish') {
    if (empty(trim($post_data['post_content']))) {
      add_settings_error('blog_validation_errors', 'empty_content', '描述内容不能为空!', 'error');
      // 将状态改为草稿,阻止发布
      $post_data['post_status'] = 'draft';
    }
  }
  return $post_data;
}
add_filter('wp_insert_post_data', 'validate_blog_content', 10, 2);

// 封面图必填验证(后端)
function validate_blog_cover_image($post_id, $post, $update) {
  // 跳过自动保存、修订版本,仅处理blogs类型的发布操作
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  if (wp_is_post_revision($post_id)) return;
  if ($post->post_type !== 'blogs' || $post->post_status !== 'publish') return;
  if (!current_user_can('edit_post', $post_id)) return;

  $cover_image = isset($_POST['cover_image']) ? trim($_POST['cover_image']) : '';
  if (empty($cover_image)) {
    add_settings_error('blog_validation_errors', 'empty_cover', '封面图不能为空!', 'error');
    wp_update_post(array('ID' => $post_id, 'post_status' => 'draft'));
  }
}
add_action('save_post', 'validate_blog_cover_image', 10, 3);

// 显示后台错误提示
function display_blog_validation_errors() {
  settings_errors('blog_validation_errors');
}
add_action('admin_notices', 'display_blog_validation_errors');

代码说明

  • 前端验证:点击发布按钮时立即检查字段完整性,弹出提示阻止无效提交。
  • 后端验证:拦截文章保存流程,若字段为空则将文章设为草稿,并在后台顶部显示错误提示。
  • 权限与场景过滤:跳过自动保存、修订版本等非人工操作,只针对真实发布场景做验证。

内容的提问来源于stack exchange,提问作者emad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:34:57