WordPress: Как добавить сортируемые колонки в список постов

Итак, в первую очередь найдём WordPress hook, который отвечает за колонки в списках постов. Им будет 'manage_edit-{post_type}_columns'. Вместо {post_type} встявляем нужный нам Post Type. Это может быть как один из стандартных post, page, так и любой другой пользовательский Post Type.

Hook мы уже знаем, остаётся навесить на него наш регистратор новой колонки, пока что обычной, не сортируемой. Возьмём post для примера:

function my_column_register( $columns ) {
	$columns['my_column'] = __( 'My Column', 'my-plugin' );

	return $columns;
}
add_filter( 'manage_edit-post_columns', 'my_column_register' );

Следующим шагом зарегистрируем новую колонку в WordPress как сортируемую. Для этого существует похожий hook 'manage_edit-{post_type}_sortable_columns':

function my_column_register_sortable( $columns ) {
	$columns['my_column'] = 'my_column';

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

Теперь наш WordPress знает о существовании новой колонки и о том, что она должна быть сортируемой и что принадлежит списку постов (post). Осталось научить WordPress отображать в этой колонке данные нужные нам и сортировать по этим данным.

Отобразим в колонке данные из мета-данных текущего поста:

function my_column_display( $column_name, $post_id ) {
	if ( 'my_column' != $column_name )
		return;

	$data = get_post_meta($post_id, 'my_column', true);
	if ( !$data )
		$data = '<em>' . __( 'No Data', 'my-plugin' ) . '</em>';

	echo $data;
}
add_action( 'manage_posts_custom_column', 'my_column_display', 10, 2 );

Указываем системе как нужно сортировать эту колонку с помощью WordPress hook 'request':

function my_column_orderby( $vars ) {
	if ( isset( $vars['orderby'] ) && 'my_column' == $vars['orderby'] ) {
		$vars = array_merge( $vars, array(
			'meta_key' => 'my_column',
			'orderby' => 'meta_value' // Может быть meta_value_num если данные в поле являются числовыми.
//Возможны и другие значения в зависимости от типа данных. Подробнее в сносках.
		) );
	}

	return $vars;
}
add_filter( 'request', 'my_column_orderby' );

Подробнее о типах сортировки.

Пример работоспособен, но для специфических задач, естественно, нужно шаманить.