web-dev-qa-db-fra.com

Comment organiser les messages par taille dans le tableau de bord WordPress?

C'est peut-être une question boiteuse, mais je ne trouve pas de réponse à cette question.

Supposons que vous souhaitiez supprimer une tonne de publications vides. Évidemment, ceux qui ont du contenu auront plus de taille.

Existe-t-il une option pour trier les messages par taille dans le tableau de bord WordPress?

Mieux encore, existe-t-il une option pour empêcher automatiquement les publications d'être publiées sans contenu? À travers fuctions.php peut-être?

J'apprécierais votre aide!

4
RaymondM

Tri par taille

L'ajout de colonne personnalisée et le tri par longueur de post_content est possible. Je crains que cela ne soit pas très efficace.

D'abord, vous devrez ajouter votre colonne personnalisée et afficher la longueur du contenu. J'ai supposé que le contenu découpé vous intéressait (donc '' est toujours vide).

Ensuite, vous devrez rendre cette colonne triable et écrire votre code personnalisé pour trier les articles.

/* Add custom column to post list */
function add_content_size_column( $columns ) {
    return array_merge( $columns, array( 'content_size' => __( 'Size', 'your_text_domain' ) ) );
}
add_filter( 'manage_posts_columns' , 'add_content_size_column' );


/* Display custom column */
function display_posts_content_size( $column, $post_id ) {
    if ( 'content_size' == $column ) {
        echo mb_strlen( trim( get_post_field( 'post_content', $post_id ) ) );
    }
}
add_action( 'manage_posts_custom_column' , 'display_posts_content_size', 10, 2 );

/* Set custom column as sortable */
function set_content_size_column_as_sortable( $columns ) {
    $columns['content_size'] = 'content_size';

    return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'set_content_size_column_as_sortable' );


function my_content_size_orderby( $orderby ) {
    global $wpdb;

    // Run this filter only once, when needed (it will be added by pre_get_posts)
    remove_filter( 'posts_orderby', 'my_content_size_orderby' );

    $orderby = str_replace( "{$wpdb->posts}.post_date ", "CHAR_LENGTH( TRIM({$wpdb->posts}.post_content) ) ", $orderby );

    return $orderby;
}

function my_content_size_modify_orderby( $query ) {
    if ( ! is_admin() ) return;

    if ( 'content_size' == $query->get( 'orderby' ) ) {
        add_filter( 'posts_orderby', 'my_content_size_orderby' );
    }
}
add_action( 'pre_get_posts', 'my_content_size_modify_orderby' );

Empêcher d'être publié

Il existe un moyen assez simple d'empêcher la publication de la publication. Tout ce que vous avez à faire est d'écrire votre propre action save_post. Vous pouvez vérifier si le message est vide et, le cas échéant, lui donner le statut draft (ou pending, ou celui que vous souhaitiez).

La seule chose dont vous devez vous rappeler est que WP affiche un message indiquant que le message a été publié. Vous pouvez changer ce message avec le filtre redirect_post_location.

function my_save_post( $post_id ) {
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;

    // Now perform checks to validate your data. 
    $prevent_publish = ('' == trim( $_POST['content'] )); // Set to true if data was invalid.
    if ( $prevent_publish ) {
        // Unhook this function to prevent indefinite loop
        remove_action( 'save_post', 'my_save_post' );

        // Update the post to change post status
        wp_update_post( array(
            'ID' => $post_id,
            'post_status' => 'draft'
        ) );

        // Re-hook this function again
        add_action( 'save_post', 'my_save_post' );
    }
}
add_action( 'save_post', 'my_save_post' );


function my_redirect_location( $location, $post_id ) {
    if ( isset($_POST['publish']) ) {
        // Obtain current post status
        $status = get_post_status( $post_id );

        // The post was 'published', but if it is still a draft, display draft message (10).
        if ( 'draft' === $status ) {
            $location = add_query_arg( 'message', 10, $location );
        }
    }

    return $location;
}
add_filter( 'redirect_post_location', 'my_redirect_location', 10, 2 );
6
Krzysiek Dróżdż