自定义帖子类型必选

时间:2013-11-25 作者:Chris

事实证明,这是一个挑战。

我试图将摘录设置为必填字段,但仅在编辑/保存自定义帖子类型的帖子时。

以下代码使摘录成为所有帖子的必填字段,但没有考虑将其影响缩小到单个自定义帖子类型。

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\');

4 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

代码将过滤器添加到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, 哪一个as per the Codex 包括以下post数据:

\'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;
}

SO网友:Jelle Wielsma

对于无法删除甚至发布帖子的问题,解决方案是添加一个额外的检查,以确保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;
}

SO网友:Jamie

我在这个网站上没有足够的声誉来评论。

请注意,您使用的代码没有对post状态进行适当的检查。因此,您的管理仪表板将充满许多自动草稿,这些草稿通常是空的,永远不会被清理。

一个简单的修复方法是执行以下操作:

    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;
    }

SO网友:Cypher

似乎上述解决方案对我来说效果不太好(正如前面提到的@slowaways,使用WordPress 5+)。所以我想出了一个新的解决方案。因为我使用的是ACF,所以我创建了一个新的“简短描述”字段(“extrait”),并将其设置为必填字段。因此,我可以使用ACF的验证功能,并动态更新摘录值:

/**
 * Set excerpt from ACF field
 */
add_action(\'acf/save_post\', function($post_id) {

  $post_excerpt   = get_field( \'extrait\', $post_id );

  if ( ( !empty( $post_id ) ) AND ( $post_excerpt ) ) {

    // Update post options array
    $update_post_excerpt_args = array(
      \'ID\'          => $post_id,
      \'post_excerpt\'    => $post_excerpt,
    );

    wp_update_post( $update_post_excerpt_args );

  }

}, 50);
为了在到期时给予信用,我在此处找到了以下代码:https://gist.github.com/MWDelaney/fd0bed89b891e3ff0850428703786397

希望这有帮助。

结束

相关推荐

Remove Ellipses from Excerpt

我对摘录使用了两个自定义函数,第一个函数修改摘录的长度,第二个函数允许我以两种方式使用\\u摘录-带有“阅读更多”链接,只要调用\\u摘录时包含适当的代码,就不必使用(see here).当我使用传统的the\\u摘录时,它会在其后的括号中生成三个省略号[…]-如何删除这些括号和省略号,以便在帖子中调用时只显示\\u摘录本身,而不显示任何链接,但仍使用下面的代码在其他地方创建“阅读更多”链接?// Excerpt // Changing excerpt length fun