Suponiendo que entendí la pregunta, lo que debe hacer es conectar los dos ganchos relacionados con los encabezados de columna y el valor de las columnas para las páginas de administración del administrador. Ellos son 'manage_{$type}_columns'
y 'manage_{$type}_custom_column'
dónde en su caso de uso {$type}
es users
.
El 'manage_users_columns'
gancho
Este primero es simple, le permite especificar los encabezados de columna y, por lo tanto, las columnas disponibles. WordPress codifica el valor de la columna "Publicaciones" , por lo que, dado que desea cambiarlo, simplemente lo eliminaremos unset()
y luego agregaremos una nueva columna con el mismo título, pero que en su lugar tiene el identificador de 'custom_posts'
:
add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
unset($column_headers['posts']);
$column_headers['custom_posts'] = 'Posts';
return $column_headers;
}
El 'manage_users_custom_column'
gancho
A continuación, debe usar el 'manage_users_custom_column'
gancho que solo se llama para columnas no estándar. Probamos para $column_name=='custom_posts'
hacer que nuestro código sea robusto en caso de que agreguemos nuevas columnas de usuario en el futuro y luego tomamos los recuentos de tipo de publicación de usuario de la función que escribí, _yoursite_get_author_post_type_counts()
que analizaré a continuación. Luego jugué con algunas formas de formatear esto, pero decidí que un HTML <table>
era el más apropiado (ya que es una tabla de datos) . Si una tabla no funciona para usted, supongo que podrá generar un marcado diferente con bastante facilidad:
add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
if ($column_name=='custom_posts') {
$counts = _yoursite_get_author_post_type_counts();
$custom_column = array();
if (isset($counts[$user_id]) && is_array($counts[$user_id]))
foreach($counts[$user_id] as $count)
$custom_column[] = "\t<tr><th>{$count['label']}</th>" .
"<td>{$count['count']}</td></tr>";
$custom_column = implode("\n",$custom_column);
}
if (empty($custom_column))
$custom_column = "No Posts!";
else
$custom_column = "<table>\n{$custom_column}\n</table>";
return $custom_column;
}
Obtener publicaciones cuenta por tipo de publicación para cada usuario / autor
Por último, existe la recuperación de los recuentos de publicaciones por tipo de publicación por autor / usuario. En general, trato de seguir usando WP_Query()
cuando ejecuto consultas en publicaciones, pero esta consulta habría requerido el uso de tantos otros ganchos que parecía más fácil ser "travieso" y hacerlo todo en uno.
Omití cualquier publicación de $post->post_type
is 'revision'
o 'nav_menu_item'
but left 'attachments'
. Puede que le resulte mejor incluir explícitamente los tipos de publicación que desea en lugar de excluir los pocos que hice.
También filtré por $post->post_status
solo 'publish'
y 'pending'
. Si desea incluir también 'future'
, 'private'
y / o 'draft'
deberá realizar los cambios en el código.
Para cada carga de página, solo llamo a esta _yoursite_get_author_post_type_counts()
función una vez y luego la guardo en una variable estática en lugar de llamar a cada usuario. Almaceno en una matriz indexada por ID de autor / usuario que contiene una matriz con el nombre del tipo de publicación en el elemento 'label'
y, por supuesto, la cuenta en un elemento con el mismo nombre:
function _yoursite_get_author_post_type_counts() {
static $counts;
if (!isset($counts)) {
global $wpdb;
global $wp_post_types;
$sql = <<<SQL
SELECT
post_type,
post_author,
COUNT(*) AS post_count
FROM
{$wpdb->posts}
WHERE 1=1
AND post_type NOT IN ('revision','nav_menu_item')
AND post_status IN ('publish','pending')
GROUP BY
post_type,
post_author
SQL;
$posts = $wpdb->get_results($sql);
foreach($posts as $post) {
$post_type_object = $wp_post_types[$post_type = $post->post_type];
if (!empty($post_type_object->label))
$label = $post_type_object->label;
else if (!empty($post_type_object->labels->name))
$label = $post_type_object->labels->name;
else
$label = ucfirst(str_replace(array('-','_'),' ',$post_type));
if (!isset($counts[$post_author = $post->post_author]))
$counts[$post_author] = array();
$counts[$post_author][] = array(
'label' => $label,
'count' => $post->post_count,
);
}
}
return $counts;
}
La interfaz de usuario resultante
Y esto es lo que parece aplicado a mi instalación de prueba de WordPress 3.0.1:
(fuente: mikeschinkel.com )
Descargar el código completo
Puede descargar el código completo de Gist :
Puede copiar este código en el functions.php
archivo o la tienda de su tema e incluir el archivo en un complemento, lo que elija.
¡Espero que esto ayude!
La siguiente es una variación de la respuesta de sorich87, ya que no pude hacer que funcione, y quería admitir varios tipos automáticamente:
Leí
get_posts_by_author_sql()
y cómo se supone que debe construir una declaración WHERE para usted, pero los resultados que obtuve siempre fueron "1 = 0". Así que acabo de escribir el resto de la declaración SQL, yaget_posts_by_author_sql()
que solo te ahorra tener que escribir dos bits: el tipo de publicación y el autor:Esto funciona igual de bien y agregará tantas columnas como desee, pero cada una usa espacio horizontal, mientras que el tutorial de Mike agregará una sola columna para los tipos de publicaciones personalizadas y luego las enumerará como una tabla dentro de esa fila. La misma información, diferente visualización. Mike's probablemente sea mejor para grandes cantidades de tipos, ya que crea una lista vertical condensada (y solo muestra un elemento de conteo si no está vacío), mientras que el método sorich87 es bueno para cantidades más pequeñas, ya que solo hay una gran cantidad de espacio de columna horizontal disponible.
No olvide que puede agregar "post_status = publicar" a la consulta para devolver solo los elementos publicados, como el ejemplo actualmente devuelve todas las publicaciones ...
fuente
get_posts_by_author_sql( $column, true, $user_id );
debe construir la instrucción where.Lo siguiente lo agregará:
fuente
get_posts_by_author_sql()
¿eh? Ese es nuevo para mí; ¡Gracias! Pero acabo de comprobar su código y no creo que haga lo que él espera. Suget_posts_by_author_sql()
llamada siempre regresa'1=0
", y él quería obtener una lista de conteos por tipo de publicación para un usuario; a menos que malinterprete este código no hace eso. ¿Quizás puedas arreglarlo?post_type
por el nombre del tipo de publicación. Por ejemplo:get_posts_by_author_sql( 'book', true, $user_id );
para un tipo de publicación llamado 'libro'. Probado y funciona.