web-dev-qa-db-fra.com

Comment supprimer un message uniquement s'il ne s'agissait pas d'un brouillon?

Je sais que je peux faire

wp_untrash_post( $post_id );

Et vérifiez le statut de la publication avec

$post_status    = get_post_status ( $post_id )

Je suis dans une situation où je dois extraire certains messages mais uniquement si le message lui-même n'était pas un simple brouillon

Est-il possible de vérifier quelque chose comme un état précédent d'un article mis à la corbeille?

1
realtebo

Comme @cybmeta l'a mentionné, les informations sont stockées dans la table meta. Lorsque nous supprimons un article, la clé de méta _wp_trash_meta_status est ajoutée avec la valeur du statut de l'article précédent ( publish , en attente , brouillon , ...).

Dans la fonction wp_trash_post() , nous avons:

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

Nous pourrions donc essayer:

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

supprimer uniquement une publication si son statut de publication précédente n'était pas un brouillon .

Plugin de démonstration

Voici un exemple de la manière dont nous pouvons ajouter une colonne triable Post Status à la corbeille du tableau de liste des publications dans le backend:

View post status in the trash view

Nous pourrions alors utiliser la suppression en bloc si nécessaire.

Voici un plugin de démonstration pour le supporter:

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

Notez que nous ciblons ici le type de message post.

J'espère que vous pourrez l'adapter à vos besoins, par exemple en ajoutant un filtrage de statut de post .

3
birgire