Modificando el contenido de la barra lateral del admin para mostrar indicador de posts pendientes

11 nov 2010, 02:56:40
Vistas: 4.2K
Votos: 4

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:

Burbuja de 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!

3
Comentarios

$menu[5] está codificado como "Posts" en wp-admin/menu.php, al menos en la versión 3.0. ¿Cuándo ves que la notificación aparece en un área diferente? ¿Puedes identificar la configuración específica donde ocurre esto?

goldenapples goldenapples
11 nov 2010 06:17:54

Existe un filtro específico disponible para ordenar los elementos del menú, algunos plugins se enganchan a ese filtro y mueven los elementos, lo que resulta en que 'posts' no sea la clave 5...

t31os t31os
11 nov 2010 11:07:13

Para aquellos interesados en esta función, he enviado un ticket al Trac de WP. Parece que está programado para una versión futura :) - http://core.trac.wordpress.org/ticket/15406

Ignacio Ignacio
14 nov 2010 23:09:03
Todas las respuestas a la pregunta 3
4

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.

11 nov 2010 19:08:01
Comentarios

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?

Ignacio Ignacio
11 nov 2010 19:16:23

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... ;)

t31os t31os
13 nov 2010 11:40:50

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

t31os t31os
20 nov 2010 13:18:47

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...

somatic somatic
22 nov 2010 22:21:21
1

@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.. :)

11 nov 2010 15:05:41
Comentarios

De nada... ;) Y gracias adicionales a Somatic por la información de seguimiento...

t31os t31os
13 nov 2010 11:37:48
0

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ú
5 jul 2013 15:36:13