web-dev-qa-db-fra.com

Comment empêcher un utilisateur de mettre à jour la date de publication

J'ai un rôle personnalisé, appelé "dealer". Une fois qu'ils ont posté un nouveau message, ils ne peuvent plus le supprimer. Il est important qu'ils ne puissent pas mettre à jour la date non plus, et je suis un peu coincé sur la façon de procéder. Il semble que l'ancien D/M/Y soit conservé dans le répertoire global $ _POST. Je pensais donc écrire de nouveau toutes les informations mises à jour pour la date. Regarde mon code;

function rd_dealer_save_post($post_id)
{
$post_author_id = $_POST['post_author'];
//print_r($_POST);
//test if this author is a dealer based on the caps
if(!current_user_can('delete_published_posts'. $post_author_id))
{
    $_POST['mm'] = $_POST['hidden_mm'];
    $_POST['jj'] = $_POST['hidden_jj'];
    $_POST['aa'] = $_POST['hidden_aa'];
    $_POST['hh'] = $_POST['hidden_hh'];
    $_POST['mn'] = $_POST['hidden_mn']; 
} 
print_r($_POST);
//die();
}
add_action('save_post', 'rd_dealer_save_post');

Est-ce que mon action est correcte? Toute pensée comme cela ne semble pas fonctionner ...

Merci Dan.

3
Dan

Comme @ tf a souligné dans son commentaire à la question, vous avez une erreur lors de la vérification de la capacité de l'utilisateur actuel: 'delete_published_posts'. $post_author_id simplement n'existe pas .

Après cela, pour votre portée, le filtre wp_insert_post_data remplacera probablement mieux que l'action save_post: car celle-ci est exécutée lorsque la publication a déjà été enregistrée/mise à jour. Si quelque chose ne va pas, vous devez modifier et mettre à jour à nouveau.

Avec le filtre wp_insert_post_data accroché, vous pouvez modifier les données en cours de mise à jour avant que la mise à jour ne soit exécutée, ce qui améliorera les performances.

add_filter('wp_insert_post_data', 'prevent_post_change', 20, 2);

function prevent_post_change( $data, $postarr ) {
  if ( ! isset($postarr['ID']) || ! $postarr['ID'] || current_user_can('delete_published_posts') )
    return $data;
  $old = get_post($postarr['ID']); // old post
  // prevent changing date
  $data['post_date'] =  $old->post_date 
  $data['post_date_gmt'] =  $old->post_date_gmt 
  // prevent sent to trash
  if ( $data['post_status'] == 'trash' ) $data['post_status'] = $old->post_status;
  return $data;
}
3
gmazzap