You’re a Tenant, Not the Owner: 6 Doors in Someone Else’s wp-admin, and How Not to Be a Bad Neighbor
Rules of a Good Neighbor — One Per Hook `admin_init` — move in quietly Don’t run heavy code or checks without a reason — this hook fires on…

Filter Hook since 2.5.0
Adds or removes columns on the admin post list table
manage_posts_columns controls what shows up in wp-admin's post list table — add a custom column here, then fill it with manage_posts_custom_column.
wp-admin Posts list screen only, when the table header renders. For a custom post type, the equivalent is manage_{post_type}_posts_columns.
apply_filters( 'manage_posts_columns', string[] $columns );$columns string[] — Column slug => label, in display order.add_filter( 'manage_posts_columns', function( $columns ) {
$columns['word_count'] = 'Word Count';
return $columns;
} );Add a new column header to the Posts list.
add_filter( 'manage_posts_columns', function( $columns ) {
unset( $columns['comments'] );
$columns['reading_time'] = 'Reading Time';
return $columns;
} );Remove the default Comments column and add a custom one instead.
Rules of a Good Neighbor — One Per Hook `admin_init` — move in quietly Don’t run heavy code or checks without a reason — this hook fires on…
manage_posts_columns only adds the header. You also need add_action( 'manage_posts_custom_column', ... ) to echo the actual value for each row/column combination.
Source: wp-admin/includes/class-wp-posts-list-table.php
One session: this hook, then each related_hooks entry. Walk it and tell us what to change.
manage_posts_columns → admin_menu
Practice the manage_posts_columns WordPress filter hook in our interactive sandbox — a VS Code-style editor with a step-by-step manage_posts_columns tutorial, add_filter exercises, and instant feedback. No local WordPress install required.