web-dev-qa-db-fra.com

Extrait obligatoire pour le type de message personnalisé

Cela s'avère être un défi.

J'essaie de faire de l'extrait un champ obligatoire, mais uniquement lorsque vous modifiez/enregistrez une publication dans un type de publication personnalisé.

Le code suivant fait de l'extrait un champ obligatoire pour toutes les publications, mais ne prend pas en compte le fait de réduire son incidence à un seul type de publication personnalisé.

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

Le code ajoute un filtre à wp_insert_post_data:

add_filter('wp_insert_post_data', 'mandatory_excerpt');

Et voici le rappel:

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

Le rappel de filtre est passé $data, qui conformément au Codex comprend les données de publication suivantes:

'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'

Ces données incluent 'post_type', ce qui signifie que vous pouvez l'utiliser à l'intérieur du rappel:

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

La solution au problème des publications ne pouvant pas être supprimées ni même publiées consiste à ajouter une vérification supplémentaire pour s'assurer que la fonction mandatory_excerpt() ne se déclenche que lorsqu'il n'y a pas de $_GET['action'] fourni. Sinon, la fonction renverra toujours une erreur lors de la suppression d'une publication ou de la modification de son statut de publication.

Donc, la fonction modifiée serait:

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

Je n'ai pas assez de réputation sur ce site pour commenter.

Notez que le code que vous utilisez n'a pas les contrôles appropriés pour le statut de publication. En conséquence, votre tableau de bord d'administration se remplira de nombreux brouillons automatiques, généralement vides, qui ne seront jamais nettoyés.

Une solution simple consiste à faire quelque chose comme:

    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