¿Mostrar los recuentos de publicaciones del usuario por tipo de publicación personalizada en la lista de usuarios del administrador?

8

Estoy intentando averiguar cómo conectar la página /wp-admin/users.php manage para cree columnas personalizadas para mostrar la cantidad de publicaciones que los usuarios tienen para los tipos de publicaciones personalizadas en WPHonors.com .

Creé un ticket de trac para esto pero @ nacin explicó por qué es un trabajo más que hacer un complemento en su lugar.

No he podido encontrar una manera de manipular la salida de los usuarios Tabla, por lo que puedo agregar columnas personalizadas para recuentos de CPT para cada usuario. Y que puede tener algo que ver con la pregunta que preguntó @nacin, ¿cuál sería la los números de conteo de correos enlazan a Para el recuento actual de publicaciones 'post' que tiene un usuario, enlaces a la página de gestión de publicaciones, mostrando todas las publicaciones de ese usuario ( /wp-admin/edit.php?author=%author_id% ).

Si tuviera que vincularlo en algún lugar, sería:

/wp-admin/edit.php?post_type=%post_type%&author=%author_id%

Si eso fuera posible de alguna manera, supongo. Pero ni siquiera necesariamente necesito vincularlo a ningún lado. La mayoría de las veces solo quiero mostrar los recuentos de publicaciones de CPT para cada persona, con 600 de usuarios y un total combinado de 300+ de publicaciones en 4 de publicaciones personalizadas. Los administradores son solo uno que puede enviar 'post' publicaciones, por lo que la columna en la página del usuario es inútil.

    
pregunta jaredwilli 24.10.2010 - 07:47

4 respuestas

10

Aquí hay una expansión de la respuesta del tutorial de Mike. Agregué enlaces a los tipos enumerados para que pueda hacer clic en uno y acceder directamente a una lista de todas las publicaciones de ese tipo para ese autor, que requería una variable adicional para $counts y algo de salida adicional para $custom_column[]

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
    unset($column_headers['posts']);
    $column_headers['custom_posts'] = 'Assets';
    return $column_headers;
}

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) {
                $link = admin_url() . "edit.php?post_type=" . $count['type']. "&author=".$user_id;
                // admin_url() . "edit.php?author=" . $user->ID;
                $custom_column[] = "\t<tr><th><a href={$link}>{$count['label']}</a></th><td>{$count['count']}</td></tr>";
            }
        $custom_column = implode("\n",$custom_column);
        if (empty($custom_column))
            $custom_column = "<th>[none]</th>";
        $custom_column = "<table>\n{$custom_column}\n</table>";
    }
    return $custom_column;
}

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', 'draft')
        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,
                'type' => $post->post_type,
                );
        }
    }
    return $counts;
}
    
respondido por el somatic 24.10.2010 - 18:08
9

Suponiendo Comprendí la pregunta, lo que debe hacer es enlazar los dos ganchos relacionados con los encabezados de columna y el valor de las columnas para las páginas de administración de administración. Son 'manage_{$type}_columns' y 'manage_{$type}_custom_column' , donde en su caso de uso {$type} es users .

El gancho 'manage_users_columns'

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, como desea cambiarlo, simplemente lo eliminaremos con 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 gancho 'manage_users_custom_column'

A continuación, debe usar el gancho 'manage_users_custom_column' al que solo se llama para columnas no estándar. Probamos $column_name=='custom_posts' para hacer que nuestro código sea robusto en caso de que agreguemos nuevas columnas de usuarios en el futuro y luego obtengamos los recuentos de tipos de publicaciones de usuarios 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;
}

Obtención de recuentos de publicaciones 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. Por lo general, trato de seguir usando WP_Query() al ejecutar consultas en publicaciones, pero esta consulta hubiera requerido usar tantos otros enlaces. Parecía más fácil ser "travieso" y hacer todo en uno.

He omitido que cualquier publicación de $post->post_type sea 'revision' o 'nav_menu_item' pero se dejó en '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 para solo 'publish' y 'pending' . Si también desea incluir 'future' , 'private' y / o 'draft' , deberá realizar los cambios en el código.

Para cada carga de página, solo llamo a esta función _yoursite_get_author_post_type_counts() una vez y luego la almaceno 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 Tipo de publicación en el elemento 'label' y, por supuesto, el recuento 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:

Descargaelcódigocompleto

Puede descargar el código completo de Gist :

Puede copiar este código en el archivo functions.php de su tema o en la tienda, incluya el archivo en un complemento, lo que elija.

Espero que esto ayude!

    
respondido por el MikeSchinkel 24.10.2010 - 09:16
2

La siguiente es una variación de la respuesta de sorich87, ya que no pude hacer que funcionara, y quería admitir múltiples tipos automáticamente:

function my_manage_users_custom_column($output = '', $column, $user_id) {
    global $wpdb;
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = '$column' AND post_author = $user_id");
    return '<a href="' . admin_url("edit.php?post_type=$column&author=$user_id") . '">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    // create columns for each type, make sure to use the post_type slug
    $columns['animals'] = 'Animals Count';
    $columns['plants'] = 'Plants Count';
    $columns['insects'] = 'Insect Count';
    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

Leí sobre get_posts_by_author_sql() y cómo se supone que debe construir una instrucción WHERE para ti, pero los resultados que obtuve siempre fueron "1 = 0". Así que escribí el resto de la declaración SQL, ya que get_posts_by_author_sql() solo le ahorra tener que escribir dos bits: el tipo de publicación y el autor:

"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'your_custom_type' AND post_author = $user_id"

Esto funciona igual de bien, y agregará tantas columnas como quieras, pero cada una usa un espacio horizontal, mientras que el tutorial de Mike agregará una sola columna para los tipos de publicaciones personalizadas, y luego las listará como una tabla dentro de esa fila . La misma información, visualización diferente. Mike's es probablemente 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 de sorich87 es bueno para cantidades más pequeñas, ya que solo hay mucho espacio de columnas horizontales disponible.

No olvides que puedes agregar "post_status = publish" a la consulta para devolver solo los artículos publicados, ya que el ejemplo devuelve todas las publicaciones ...

    
respondido por el somatic 24.10.2010 - 18:02
1

Lo siguiente lo agregará:

function my_manage_users_custom_column($output = '', $column_name, $user_id) {
    global $wpdb;

    if( $column_name !== 'post_type_count' )
        return;

    $where = get_posts_by_author_sql( 'post_type', true, $user_id );
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );

    return '<a href="' . admin_url("edit.php?post_type=post_type&author=$user_id") . '" title="Post Type Count">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    $columns['post_type_count'] = __( 'Post Type', 'textdomain' );

    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');
    
respondido por el sorich87 24.10.2010 - 08:51

Lea otras preguntas en las etiquetas