Modificando el contenido de la barra lateral del admin para mostrar indicador de posts pendientes
He estado intentando hacer que aparezca un contador de pendientes en la barra lateral del admin, para posts pendientes, como la pequeña burbuja que aparece para comentarios pendientes:
Fuera de tema: ¿Soy el único que piensa que esto debería ser un comportamiento básico? ¿Dónde debería sugerir esta característica?
De todos modos, encontré este plugin, pero noté que no siempre funciona. A veces el notificador aparece en Páginas u otro elemento.
El código que usa para agregar el contador de pendientes es algo así:
$menu[5][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
Claramente, el problema es el número 5 hard-codeado ahí, pero ¿cómo puedo actualizarlo para que siempre apunte a Posts?
Estaré encantado de cometer este cambio en el plugin si sabemos la respuesta.
¡Gracias!

Como seguimiento a la respuesta de t31os, aquí está el código completo necesario (combinando el contenido del plugin mencionado con la corrección de t31os), con modificaciones para manejar también tipos de publicaciones personalizados:
add_filter( 'add_menu_classes', 'mostrar_numero_pendientes');
function mostrar_numero_pendientes( $menu ) {
$tipo = "animales"; // Cambia esto por tu tipo de publicación personalizado
$estado = "pendiente"; // Estado de las publicaciones a contar
$num_publicaciones = wp_count_posts( $tipo, 'readable' );
$contador_pendientes = 0;
if ( !empty($num_publicaciones->$estado) )
$contador_pendientes = $num_publicaciones->$estado;
// Construir cadena para coincidir en el array $menu
if ($tipo == 'post') {
$cadena_menu = 'edit.php';
} else {
$cadena_menu = 'edit.php?post_type=' . $tipo;
}
// Recorrer elementos del menú, encontrar coincidencia y añadir indicador
foreach( $menu as $clave_menu => $datos_menu ) {
if( $cadena_menu != $datos_menu[2] )
continue;
$menu[$clave_menu][0] .= " <span class='update-plugins count-$contador_pendientes'><span class='plugin-count'>" . number_format_i18n($contador_pendientes) . '</span></span>';
}
return $menu;
}
Coloca este código en functions.php, no es necesario el plugin.

Guau, gracias. Ya me he puesto en contacto con el creador del plugin para confirmar esos cambios en caso de que alguien necesite este comportamiento.
Entonces, ¿alguien sabe por qué esto no funciona así por defecto?

Ni siquiera había revisado el plugin, gracias por el seguimiento. El código que has proporcionado hace una función simple y agradable que otros usuarios ahora pueden copiar si desean tener esta funcionalidad... buen trabajo... ;)

P: ¿No está la función estableciendo la variable $type, y en esencia haciendo que la condición if ($type == 'post') {
sea innecesaria?

sí, este ejemplo es un poco extraño, ya que lo adapté de uno donde estoy consultando todos los tipos de publicación en el sistema y ejecutando la función (aquí tuve que declarar las variables deseadas para que el ejemplo funcione de forma independiente). El propósito del condicional es construir la URL apropiada para todo excepto para el tipo de publicación principal...

@ign
Reemplaza la línea de código que publicaste con lo siguiente..
foreach( $menu as $menu_key => $menu_data ) :
if( 'edit.php' != $menu_data[2] )
continue;
$menu[$menu_key][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
endforeach;
..eso debería evitar la necesidad de conocer la clave específica.. (avísame si hay algún problema)..
Espero que ayude.. :)

Hice una ligera modificación a la publicación de somatic que permite múltiples tipos de publicaciones:
// Agrega números de pendientes a tipos de publicaciones en el menú de administración
function show_pending_number($menu) {
$types = array("post", "page", "custom-post-type"); // Tipos de publicaciones
$status = "pending"; // Estado 'pendiente'
foreach($types as $type) {
$num_posts = wp_count_posts($type, 'readable');
$pending_count = 0;
if (!empty($num_posts->$status)) $pending_count = $num_posts->$status;
if ($type == 'post') {
$menu_str = 'edit.php';
} else {
$menu_str = 'edit.php?post_type=' . $type;
}
foreach( $menu as $menu_key => $menu_data ) {
if( $menu_str != $menu_data[2] )
continue;
$menu[$menu_key][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
}
}
return $menu;
}
add_filter('add_menu_classes', 'show_pending_number'); // Aplica el filtro al menú
