Just as @cybmeta mentioned, the info is stored in the post meta table. When we trash a post then the post meta key _wp_trash_meta_status
is added with the value of the previous post status (publish, pending, draft, … ).
Within the wp_trash_post()
function, we have:
add_post_meta($post_id,'_wp_trash_meta_status', $post['post_status']);
add_post_meta($post_id,'_wp_trash_meta_time', time());
We might therefore try:
// Get previous post status
$status = get_post_meta( $post_id, '_wp_trash_meta_status', true );
// Only untrash if the previous status wasn't a 'draft'
if( 'draft' !== $status )
wp_untrash_post( $post_id );
to only untrash a post if it’s previous post status wasn’t a draft.
Demo Plugin
Here’s an example how we can add a sortable Previous Post Status column to the trash view in the post list table in the backend:
We could then use the bulk delete as needed.
Here’s a demo plugin to support it:
<?php
/**
* Plugin Name: Demo Plugin
* Description: Adds the 'Previous Post Status' Column in the 'trash' post table view
* Plugin URI: http://wordpress.stackexchange.com/a/244261/26350
*/
namespace WPSE\Q244254;
add_action( 'admin_head', function()
{
// Only target the trash view on the edit.php page
if( 'trash' !== get_query_var( 'post_status' ) || ! did_action( 'load-edit.php' ) )
return;
// Let's start it here
$o = new Main;
$o->init( $GLOBALS['wpdb'] );
} );
class Main
{
private $db;
public function init( \wpdb $db )
{
$this->db = $db;
add_filter( 'manage_post_posts_columns', [ $this, 'columns'] );
add_filter( 'manage_edit-post_sortable_columns', [ $this, 'sortable_columns' ] );
add_filter( 'posts_orderby', [ $this, 'orderby' ], 10, 2 );
add_action( 'manage_post_posts_custom_column', [ $this, 'custom_column' ], 10, 2 );
}
public function columns ( $columns )
{
// Place our new custom column right after the 'title' column
$_columns = [];
foreach( (array) $columns as $key => $label )
{
$_columns[$key] = $label;
if( 'title' === $key )
$_columns['wpse_prev_post_status'] = esc_html__( 'Previous Post Status', 'mydomain' );
}
return $_columns;
}
public function custom_column( $column_name, $post_id )
{
// Display the previous post status
if ( $column_name == 'wpse_prev_post_status' )
echo get_post_meta( $post_id, '_wp_trash_meta_status', true );
}
public function sortable_columns( $columns )
{
// Make our new column sortable
$columns['wpse_prev_post_status'] = 'wpse_prev_post_status';
return $columns;
}
public function orderby( $orderby, \WP_Query $q )
{
// Implement the orderby support to our custom column
$_orderby = $q->get( 'orderby' );
$_order="ASC" === strtoupper( $q->get( 'order' ) ) ? 'ASC' : 'DESC';
if(
is_admin()
&& $q->is_main_query()
&& 'wpse_prev_post_status' === $_orderby
)
$orderby .= $this->db->prepare( "{$this->db->posts}.post_status %s", $_order );
return $orderby;
}
} // end class
Note that here we target the post
post type.
Hopefully you can adjust it further to your needs, like adding a post status filtering.