web-dev-qa-db-ja.com

WordPressダッシュボードで投稿をサイズ順に並べる方法は?

これは足りない質問かもしれませんが、私はこれに対する答えを見つけることができません。

あなたが削除したいたくさんの空の投稿があるとしましょう。明らかに、何らかのコンテンツを持っている人はもっとサイズが大きくなります。

WordPressダッシュボードで投稿をサイズ順に並べ替えることはできますか?

さらに良いことに、コンテンツがなくても投稿が自動的に公開されないようにするオプションはありますか? fuctions.phpを通して?

どうぞよろしくお願いします。

4
RaymondM

サイズ順

カスタム列を追加してpost_contentの長さで並べ替えることができます。それはそれほど効率的ではないでしょう、私は怖いです。

まず、カスタム列を追加してそこにコンテンツの長さを表示する必要があります。私はあなたがトリミングされたコンテンツに興味があると仮定しました(だから ''はまだ空です)。

次に、この列を並べ替え可能にし、投稿を並べ替えるためのカスタムコードを作成する必要があります。

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

公開されている蜂からの防止

投稿が公開されないようにする簡単な方法があります。あなたがしなければならないのはあなた自身のsave_postアクションを書くことです。投稿が空かどうかを確認できます。空の場合は、投稿のステータスをdraft(またはpending、または任意のもの)に変更できます。

覚えておく必要があるのは、WPに投稿が公開されたことを示すメッセージが表示されることだけです。そのメッセージは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