web-dev-qa-db-fra.com

Les valeurs de champ personnalisées sont supprimées lors de la suppression du type d'article personnalisé

J'ai créé un type d'article personnalisé auquel sont attachés 2 champs personnalisés ... Lorsque je crée un article de ce type et que je remplis les champs personnalisés, les données sont en fait enregistrées dans la base de données ... Cependant, si J'en ai détruit un, puis les données des champs personnalisés de cet article sont supprimées de la base de données.

Je pensais que la corbeille était juste supposée changer fondamentalement le post_status en "corbeille" afin qu'elle soit invisible, à moins que vous ne la supprimiez réellement de façon permanente?

Si tel est le cas, pourquoi mes données de champs personnalisés sont-elles perdues lorsque je supprime un élément?

Voici tout le code pertinent pour la question ci-dessus:

<?php
add_action('admin_init', 'wpg_add_testimonial_author');
function wpg_add_testimonial_author() {
  add_meta_box('wpg_testimonial_author', __('Author Information', 'quotable'), 'wpg_testimonial_author', 'testimonials', 'side', 'low');
}

function wpg_testimonial_author() {
  global $post;
  $custom = get_post_custom($post->ID);
  $testimonial_author_name = $custom['testimonial_author_name'][0];
  $testimonial_author_link = $custom['testimonial_author_link'][0];
  ?>
  <p>
    <label><?php _e("Author's Name:", 'quotable'); ?></label>
    <input name="testimonial_author_name" value="<?php echo $testimonial_author_name; ?>" />
  </p>
  <p>
    <label><?php _e('Attribution Link:', 'quotable'); ?></label>
    <input name="testimonial_author_link" value="<?php echo $testimonial_author_link; ?>" />
  </p>
  <?php
}

function wpg_save_testimonial_author() {
  global $post;
  if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return $post_id;
  }
  if (defined('DOING_AJAX')) {
    return;
  }
  update_post_meta($post->ID, 'testimonial_author_name', $_POST['testimonial_author_name']);
  update_post_meta($post->ID, 'testimonial_author_link', $_POST['testimonial_author_link']);
}
add_action('save_post', 'wpg_save_testimonial_author');

function wpg_row_actions() {
  global $post;
  if($post->post_type == 'page') {
    if(!current_user_can('edit_page')) {
      return;
    }
  }
  else {
    if(!current_user_can('edit_post')) {
      return;
    }
  }
  if($post->post_status == 'trash') {
    $actionLinks  = '<div class="row-actions"><span class="untrash"><a title="'.__('Restore this item', 'quotable').'" href="'.wp_nonce_url(get_admin_url().'post.php?post='.$post->ID.'&action=untrash', 'untrash-'.$post->post_type.'_'.$post->ID).'">'.__('Restore', 'quotable').'</a> | </span>';
    $actionLinks .= '<span class="trash"><a href="'.wp_nonce_url(get_admin_url().'post.php?post='.$post->ID.'&action=delete', 'delete-'.$post->post_type.'_'.$post->ID).'" title="'.__('Delete this item permanently', 'quotable').'" class="submitdelete">'.__('Delete Permanently', 'quotable').'</a></span>';
  }
  else {
    $actionLinks  = '<div class="row-actions"><span class="edit"><a title="'.__('Edit this item', 'quotable').'" href="'.get_admin_url().'post.php?post='.$post->ID.'&action=edit">'.__('Edit', 'quotable').'</a> | </span>';
    $actionLinks .= '<span class="inline hide-if-no-js"><a title="'.__('Edit this item inline', 'quotable').'" class="editinline" href="#">'.__('Quick Edit', 'quotable').'</a> | </span>';
    $actionLinks .= '<span class="trash"><a href="'.wp_nonce_url(get_admin_url().'post.php?post='.$post->ID.'&action=trash', 'trash-'.$post->post_type.'_'.$post->ID).'" title="'.__('Move this item to the Trash', 'quotable').'" class="submitdelete">'._x('Trash', 'verb (ie. trash this post)', 'quotable').'</a></span>';
  }
  return $actionLinks;
}

function wpg_edit_testimonials_columns($columns) {
  $columns = array(
    'cb' => '<input type="checkbox" />',
    'testimonial_author' => __('Author', 'quotable'),
    'testimonial_text' => __('Testimonial', 'quotable'),
    'attribution_link' => __('Attribution Link', 'quotable'),
    'date' => __('Date Added', 'quotable')
  );
  return $columns;
}

function wpg_manage_testimonials_columns($column, $post_id) {
  global $post;
  $custom = get_post_custom($post->ID);
  $testimonial_author_name = $custom['testimonial_author_name'][0];
  $testimonial_author_link = $custom['testimonial_author_link'][0];

  $wpg_row_actions  = wpg_row_actions();

  switch($column) {
    case 'testimonial_author':
      echo $testimonial_author_name.$wpg_row_actions;
    break;

    case 'testimonial_text':
      echo $post->post_content;
    break;

    case 'attribution_link':
      echo $testimonial_author_link;
    break;

    default :
      break;
    }
  }
  add_filter('manage_edit-testimonials_columns', 'wpg_edit_testimonials_columns');
  add_action('manage_testimonials_posts_custom_column', 'wpg_manage_testimonials_columns', 10, 2);

Le type de publication personnalisé ne prend pas en charge la partie "titre" des publications. Il n'est donc pas inclus dans l'une des colonnes de la page de modification des publications. Par conséquent, je devais pirater ma propre version de la fonction row_actions () pour activer les liens édition/édition rapide/corbeille lorsque chaque publication est survolée.

Toutes les fonctionnalités fonctionnent comme il se doit ... Sauf que les valeurs "auteur du témoignage" et "lien d'attribution" sont supprimées de la base de données lors du déplacement d'une publication vers la corbeille. Aucune idée pourquoi ...

6
Nero_DCLXVI

Il semble que l'action save_post soit déclenchée lors de l'envoi d'une publication dans la corbeille ... Par conséquent, ma fonction de sauvegarde de métadonnées personnalisée était activée sans aucune donnée $ _POST à ​​envoyer.

Pour contourner cela, j'ai fini par ajouter un nonce à la fonction de sauvegarde.

function wpg_testimonial_author() {
  global $post;
  $custom = get_post_custom($post->ID);
  $testimonial_author_name = $custom['testimonial_author_name'][0];
  $testimonial_author_link = $custom['testimonial_author_link'][0];
  ?>
  <p>
    <label><?php _e("Author's Name:", 'quotable'); ?></label>
    <input name="testimonial_author_name" value="<?php echo $testimonial_author_name; ?>" />
  </p>
  <p>
    <label><?php _e('Attribution Link:', 'quotable'); ?></label>
    <input name="testimonial_author_link" value="<?php echo $testimonial_author_link; ?>" />
    <input type="hidden" name="testimonial_author_noncename" id="testimonial_author_noncename" value="<?php echo wp_create_nonce(plugin_basename(__FILE__).$post->ID); ?>" />
  </p>
  <?php
}

function wpg_save_testimonial_author($post_id) {
  global $post;
  if (!wp_verify_nonce($_POST['testimonial_author_noncename'], plugin_basename(__FILE__).$post->ID)) {
    return $post->ID;
  }
  if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return $post_id;
  }
  if(defined('DOING_AJAX')) {
    return;
  }
  if(!current_user_can('edit_post')) {
    return $post->ID;
  }
  if($post->post_type == 'revision') {
    return;
  }
  update_post_meta($post->ID, 'testimonial_author_name', $_POST['testimonial_author_name']);
  update_post_meta($post->ID, 'testimonial_author_link', $_POST['testimonial_author_link']);
}
add_action('save_post', 'wpg_save_testimonial_author');

Espérons que cela pourrait aider quelqu'un d'autre plus tard ...

4
Nero_DCLXVI

Wow merci Nero_DCLXVI. Très utile. Pour les futurs utilisateurs cherchant à implémenter ceci, voici les instructions simplifiées de sa solution:

  1. Ajoutez cette entrée cachée avec vos autres entrées méta personnalisées:

<input type="hidden" name="prevent_delete_meta_movetotrash" id="prevent_delete_meta_movetotrash" value="<?php echo wp_create_nonce(plugin_basename(__FILE__).$post->ID); ?>" />

  1. Ajoutez ceci juste avant vos fonctions update_post_meta ().

if (!wp_verify_nonce($_POST['prevent_delete_meta_movetotrash'], plugin_basename(__FILE__).$post->ID)) { return $post_id; }

2
tbradley22