Как раскрыть сообщение, только если это не проект?

Я знаю, что могу

wp_untrash_post( $post_id ); 

И проверьте статус сообщения с помощью

 $post_status = get_post_status ( $post_id ) 

Я в ситуации, когда я должен раскрыть некоторые сообщения, но только если сам пост не был простым проектом

Возможно ли проверить что-то вроде предыдущего состояния обработанного сообщения?

Solutions Collecting From Web of "Как раскрыть сообщение, только если это не проект?"

Как упоминалось в @cybmeta, информация хранится в метатеге сообщений. Когда мы _wp_trash_meta_status сообщение, тогда _wp_trash_meta_status сообщения _wp_trash_meta_status добавляется со значением предыдущего статуса сообщения ( публикация , ожидание , черновик , …).

В функции wp_trash_post() мы имеем:

 add_post_meta($post_id,'_wp_trash_meta_status', $post['post_status']); add_post_meta($post_id,'_wp_trash_meta_time', time()); 

Поэтому мы можем попытаться:

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

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

Демо-плагин

Вот пример того, как мы можем добавить сортируемый столбец Previous Post Status в представление корзины в таблице списка сообщений в бэкэнд:

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

Затем мы могли бы использовать массовое удаление по мере необходимости.

Вот демо-плагин для его поддержки:

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

Обратите внимание, что здесь мы нацеливаем тип post post.

Надеюсь, вы можете настроить его в соответствии с вашими потребностями, например, добавить фильтрацию статуса сообщения .