Пользовательские значения полей, удаленные при сортировке настраиваемого типа сообщения

Я создал пользовательский тип сообщения с двумя настраиваемыми полями, прикрепленными к нему … Когда я создаю сообщение этого типа и заполняю пользовательские поля, данные фактически сохраняются в db … Однако, если Я удаляю один из них, затем данные настраиваемых полей этого сообщения удаляются из базы данных.

Я думал, что перерыв просто должен был в основном изменить post_status на «мусор», чтобы он был вне поля зрения, если вы фактически не удалили его навсегда?

Если это так, почему я теряю данные пользовательских полей, когда я удаляю элемент?

Вот весь соответствующий код для вышеуказанного вопроса:

<?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); 

Тип персонализированного сообщения не поддерживает часть заголовков «title», поэтому он не включен в качестве одного из столбцов на странице редактирования сообщений. Поэтому мне пришлось взломать собственную версию функции row_actions (), чтобы включить ссылки редактирования / быстрого редактирования / мусора, когда каждый столбец завис.

Вся функциональность работает так, как должна … За исключением того, что значения «автор отзыва» и «атрибуция ссылки» удаляются из базы данных при перемещении сообщения в корзину. Не знаю, почему …

Solutions Collecting From Web of "Пользовательские значения полей, удаленные при сортировке настраиваемого типа сообщения"

Кажется, что действие save_post запускается при отправке сообщения в корзину … Поэтому моя пользовательская функция сохранения метаданных активировалась без каких-либо $ _POST данных для отправки через нее.

Чтобы обойти это, я завершил добавление функции nonce к функции сохранения.

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

Надеюсь, это может помочь кому-то еще …

Ничего себе, спасибо Nero_DCLXVI. Очень полезно. Для будущих людей, желающих реализовать это, упрощенные инструкции по его решению:

  1. Добавьте этот скрытый ввод вместе с другими пользовательскими мета-входами:

<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. Добавьте это прямо перед функциями update_post_meta ().

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