Вопрос или проблема
Я застрял и не смог найти ответ после долгих поисков.
Мне нужно изменить панель администратора пользователей, отображающую список пользователей и количество постов. У меня есть пользовательские посты (type=”articles”), поэтому по умолчанию ‘посты’ отображают только ноль.
Я думал, что смогу изменить стандартное количество постов, чтобы включить мои статьи, но не смог найти способ. Вместо этого я добавил новый столбец.
Я могу заполнить мой новый столбец правильным количеством статей. У меня также есть это число, связанное со списком статей этого автора.
Единственное, что я не могу понять, это как отсортировать столбец. Я пробовал все способы, которые мог найти или придумать. Я просто не так глубоко разбираюсь в WordPress или SQL.
Я использую следующие фильтры.
// добавляем новый столбец
add_filter( 'manage_users_columns', 'my_users_articles_column' );
function my_users_articles_column( $columns ) {
$columns['articles_count'] = 'Количество';
return $columns;
}
// получаем значение для каждой строки
add_filter( 'manage_users_custom_column', 'my_users_articles_column_value', 10, 3 );
function my_users_articles_column_value( $value, $column_name, $id ) {
if ( $column_name == 'articles_count' ) {
$count = count_user_posts($id, 'articles');
$link = '<a href="/wp-admin/edit.php?post_type=articles&author=" . $id . "">' . $count . '</a>';
$return = ($count > 0) ? $link : $count;
return $return;
}
}
// делаем столбец сортируемым
add_filter( 'manage_users_sortable_columns', 'my_articles_count_column_sortable' );
function my_articles_count_column_sortable( $columns ) {
$columns['articles_count'] = 'articles_count';
return $columns;
}
Итак, после основного кода выше, у меня есть новый столбец для количества всех статей для каждого автора. И он кликабельный для сортировки, но сортировка происходит по имени автора (первый столбец), а не по моему количеству статей.
Я не могу найти способ, чтобы этот столбец сортировался. Фильтры/хуки, которые я пробовал, включают ‘pre_get_users’, ‘pre_user_query’, ‘request’ и другие. Не уверен, какой из них правильный фильтр. Но я не думаю, что у меня правильный способ сортировки в любом случае.
Столбец не является мета-полем. Он заполнен из запроса. Я попробовал что-то типичное, как ниже, но это не работает.
add_filter('pre_get_users', 'my_pre_get_users');
function my_pre_get_users( $vars ) {
if ( 'article_count' == $vars['orderby'] ) {
$vars['meta_key'] = 'article_count';
$vars['orderby'] = 'meta_value_num';
}
return $vars;
}
На данный момент я могу только догадываться, что мне нужно объединять таблицы, но это выходит за пределы моих навыков программирования. Я мог бы продолжать “взламывать” это бесконечно на этом этапе.
Я следил за ответами в нескольких статьях, таких как:
WP_User_Query::parse_orderby()
на самом деле поддерживает сортировку по количеству постов, но поскольку WP_User_Query::parse_orderby()
ограничивает то, по каким пользователям можно сортировать, осуществить пользовательскую сортировку – это немного хака.
Вот обходной путь, который я создал (полу-тестированный):
add_filter( 'manage_users_sortable_columns', static function ( $columns ) {
$columns['articles_count'] = array(
'articles_count',
false,
__( 'Статьи' ),
__( 'Таблица упорядочена по количеству статей.' ),
);
return $columns;
} );
/**
* Поскольку `parse_orderby()` отбросит 'articles_count',
* установите его на `post_count` и создайте переменную пользовательского запроса для
* обратной ссылки позже.
*/
add_action( 'pre_get_users', static function ( $query ) {
if ( 'articles_count' !== $query->get( 'orderby' ) ) {
return;
}
$query->set( 'orderby', 'post_count' );
$query->set( 'sort_articles_count', true );
} );
/**
* Проверяем нашу пользовательскую переменную запроса и изменяем SQL
* для сортировки пользователей.
*/
add_action( 'pre_user_query', static function ( $query ) {
if ( ! $query->get( 'sort_articles_count' ) ) {
return;
}
$search = get_posts_by_author_sql( 'post' );
$replace = get_posts_by_author_sql( 'articles' );
$query->query_from = str_replace( $search, $replace, $query->query_from );
} );
Ответ или решение
Для того чтобы сортировать колонку, содержащую количество статей пользователей в админ-панели WordPress, вам нужно будет внести некоторые изменения в код, который вы уже написали. Приведу полный пример кода на PHP, который поможет решить вашу задачу. Обратите внимание, что для выполнения сортировки по количеству статей необходимо подменить SQL-запрос в функции pre_user_query
.
Вот шаги, которые вам нужно выполнить:
- Добавление колонки для количества статей:
add_filter( 'manage_users_columns', 'my_users_articles_column' );
function my_users_articles_column( $columns ) {
$columns['articles_count'] = 'Count';
return $columns;
}
- Заполнение колонки значениями:
add_filter( 'manage_users_custom_column', 'my_users_articles_column_value', 10, 3 );
function my_users_articles_column_value( $value, $column_name, $id ) {
if ( $column_name == 'articles_count' ) {
$count = count_user_posts($id, 'articles');
$link = '<a href="/wp-admin/edit.php?post_type=articles&author=' . $id . '">' . $count . '</a>';
return ($count > 0) ? $link : $count;
}
return $value;
}
- Сделать колонку сортируемой:
add_filter( 'manage_users_sortable_columns', 'my_articles_count_column_sortable' );
function my_articles_count_column_sortable( $columns ) {
$columns['articles_count'] = 'articles_count';
return $columns;
}
- Настройка сортировки:
add_action( 'pre_get_users', 'my_pre_get_users' );
function my_pre_get_users( $query ) {
if ( 'articles_count' === $query->get('orderby') ) {
$query->set('orderby', 'post_count'); // Сортируем по количеству постов
$query->set('sort_articles_count', true); // Устанавливаем пользовательскую переменную
}
}
- Изменение SQL-запроса для сортировки:
add_action( 'pre_user_query', 'my_pre_user_query' );
function my_pre_user_query( $query ) {
if ( !$query->get('sort_articles_count') ) {
return;
}
// Получаем SQL-выражение для постов
$search = get_posts_by_author_sql( 'post' );
$replace = get_posts_by_author_sql( 'articles' );
// Меняем внутренний SQL-запрос, чтобы он сортировал по количеству статей
$query->query_from = str_replace( $search, $replace, $query->query_from );
}
Объяснение:
- Мы добавили новый столбец в админ-панели пользователей и заполнили его количеством статей.
- Сделали столбец сортируемым, добавив его в массив сортируемых столбцов.
- Затем, в функции
pre_get_users
, если запрашивается сортировка по количеству статей, мы перенаправляем сортировку на стандартный подсчет постов. - Наконец, в функции
pre_user_query
мы подменяем SQL-запрос, чтобы вместо стандартногоpost
использоватьarticles
, тем самым обеспечивая сортировку по количеству статей каждого пользователя.
Заключение:
Теперь ваша админ-панель должна корректно отображать и сортировать колонку с количеством статей для каждого пользователя. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!