Сортировка пользовательских столбцов на страницах администратора Wordpress
Я пытаюсь отсортировать пользовательский столбец на экране редактирования администратора. Столбец содержит целочисленное значение (подсчет голосов).
Для генерации столбца я использую этот "стандартный" код:
add_filter( 'manage_edit-entries_sortable_columns', 'cutify_entries_columns_sortable' );
function cutify_entries_columns_sortable( $columns )
{
$columns['entry_vote_count'] = 'entry_vote_count';
return $columns;
}
add_filter( 'manage_entries_posts_columns', 'cutify_entries_columns_head' );
function cutify_entries_columns_head($defaults)
{
unset( $defaults['date'] );
$defaults['entry_vote_count'] = 'Votes';
return $defaults;
}
add_action('manage_entries_posts_custom_column', 'cutify_entries_columns_content', 10, 2);
function cutify_entries_columns_content($column_name, $post_ID)
{
if ($column_name == 'entry_vote_count')
{
$number = rand(1,1000);
print intVal($number);
}
}
Проблема пытается отсортировать этот столбец. Я читал много ответов здесь и на других сайтах, и я знаю о сортировке этого, если значение пришло из post_meta, но, как вы можете видеть, в этом случае значение приходит из возвращаемого значения из вызова функции.
Есть ли способ сортировки пользовательского столбца, не основанный на значении post_meta?
3 ответа
Зарегистрировать столбцы Первое, что нужно зарегистрировать столбец
<?php
add_action( 'manage_cake_posts_custom_column', 'my_cake_column_content', 10, 2 );
function my_cake_column_content( $column_name, $post_id ) {
if ( 'slices' != $column_name )
return;
//Get number of slices from post meta
$slices = get_post_meta($post_id, 'slices', true);
echo intval($slices);
} ?>
Сделать столбец сортируемым
<?php
add_filter( 'manage_edit-cake_sortable_columns',
'my_sortable_cake_column' );
function my_sortable_cake_column( $columns ) {
$columns['slices'] = 'slice';
//To make a column 'un-sortable' remove it from the array
//unset($columns['date']);
return $columns;
} ?>
Вы должны добавить пользовательские query_orderby
в WP_Query
когда wp пытается упорядочить записи по вашей пользовательской колонке. как это:
add_action( 'pre_get_posts', 'my_entry_vote_orderby' );
function my_entry_vote_orderby( $query ) {
global $wpdb;
// Only filter in the admin
if( ! is_admin() )
return;
$orderby = $query->get( 'orderby');
// Only filter if orderby is set to 'entry_vote_count'
if( 'entry_vote_count' == $orderby ) {
// We need the order - default is ASC
$order = isset( $query->query_vars ) && isset( $query->query_vars[ 'order' ] ) && strcasecmp( $query->query_vars[ 'order' ], 'desc' ) == 0 ? 'DESC' : 'ASC';
// Order the posts by vote count
$query->query_orderby = "ORDER BY ( SELECT vote_count FROM {$wpdb->posts} posts WHERE posts.post_type = 'post' AND posts.post_status='publish' ) {$order}";
}
}
Самый простой способ, если вы не разрабатываете плагин, это использовать существующий, такой как Admin Columns, потому что он позволяет вам выполнять несколько сложных действий: заказы, добавление столбцов, ...