Cuenta de publicaciones por (día / mes / año) desde que comenzó el blog

2

Busco repetir la cantidad de publicaciones por mes desde que comenzó el blog, y durante los meses en que no hubo publicaciones echo '0'.

Esta es la salida que quiero:

1 de enero, 3 de febrero, 8 de marzo, 3 de abril, ...

Cualquier ayuda sería genial. Dave

    
pregunta davebowker 05.08.2012 - 04:12

3 respuestas

2

Básicamente, lo que debe hacer es pegar el siguiente código en el archivo sidebar.php de su tema o en cualquier otro archivo donde desee mostrar archivos personalizados de WordPress.

<?php
global $wpdb;
$limit = 0;
$year_prev = null;
$months = $wpdb->get_results("SELECT DISTINCT MONTH( post_date ) AS month,YEAR( post_date ) AS year, COUNT( id ) as post_count FROM $wpdb->posts WHERE post_status = 'publish' and post_date <= now( ) and post_type = 'post' GROUP BY month , year ORDER BY post_date DESC");
foreach($months as $month) :
$year_current = $month->year;
if ($year_current != $year_prev){
if ($year_prev != null){
?>
<?php } ?>

<li class="archive-year"><a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/"><?php echo $month->year; ?></a></li>


<?php } ?>
<li><a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>"><span class="archive-month"><?php echo date("F", mktime(0, 0, 0, $month->month, 1, $month->year)) ?></span></a></li>
<?php $year_prev = $year_current;

if(++$limit >= 18) { break; }

endforeach; ?>

Nota: si desea cambiar la cantidad de meses mostrados, entonces necesita cambiar la línea 19 donde el valor límite actual de $ se establece en 18.

Nuestro CSS se parecía un poco a esto:

.widget-archive{padding: 0 0 40px 0; float: left; width: 235px;}
.widget-archive ul {margin: 0;}
.widget-archive li {margin: 0; padding: 0;}
.widget-archive li a{ border-left: 1px solid #d6d7d7; padding: 5px 0 3px 10px; margin: 0 0 0 55px; display: block;}
li.archive-year{float: left; font-family: Helvetica, Arial, san-serif; padding: 5px 0 3px 10px; color:#ed1a1c;}
li.archive-year a{color:#ed1a1c; margin: 0; border: 0px; padding: 0;}

Ahora, si desea mostrar el número de publicaciones en cada mes, deberá agregar este bit de código en cualquier lugar entre la línea 12 - 16 del código anterior:

<?php echo $month->post_count; ?>
    
respondido por el Varun Sridharan 05.08.2012 - 04:23
2

Tu mejor apuesta es probablemente usar $wpdb directamente. Puedes usar COUNT y GROUP BY para hacer las cosas más fáciles.

Una consulta podría tener este aspecto:

<?php
global $wpdb;
$res = $wpdb->get_results("SELECT MONTH(post_date) as post_month, count(ID) as post_count from {$wpdb->posts} WHERE post_status = 'publish' GROUP BY post_month", OBJECT_K);

Eso te lleva a la mayor parte del camino allí. Asegúrese de consultar la sección resultados genéricos de wpdb docs.

Para obtener el resto del camino, es probable que desees recorrer un rango de 1-12, creando nombres de meses y verificando si los resultados incluyen ese mes.

Aquí hay un ejemplo implementado como código abreviado:

<?php
add_action('init', 'wpse60859_register_shortcode');
/**
 * Registers the shortcode
 * 
 * @uses    add_shortcode
 */
function wpse60859_register_shortcode()
{
    add_shortcode(
        'posts_per_month',
        'wpse60859_shortcode_cb'
    );
}


/**
 * The shortcode callback function.
 *
 * Usage:
 *      [posts_per_month year="2012"]
 *
 * @uses    date_i18n
 * @uses    shortcode_atts
 */
function wpse60859_shortcode_cb($args)
{
    global $wpdb;

    $args = shortcode_atts(array(
        'year' => false
    ), $args);

    $year = absint($args['year']);

    // year is a no go?  bail.
    if(!$year)
        return '';

    $res = $wpdb->get_results($wpdb->prepare(
        "SELECT MONTH(post_date) AS post_month, count(ID) AS post_count from " .
        "{$wpdb->posts} WHERE post_status = 'publish' AND YEAR(post_date) = %d " .
        "GROUP BY post_month;", $year
    ), OBJECT_K);

    // We didn't get any results.  Something might be wrong?
    if(!$res)
        return '';

    // build the display
    $out = '<ul>';
    foreach(range(1, 12) as $m)
    {
        $month = date_i18n('F', mktime(0, 0, 0, $m, 1));
        $out .= sprintf(
            '<li>%s %d</li>',
            $month,
            isset($res[$m]) ? $res[$m]->post_count : 0
        );
    }
    $out .= '</ul>';

    return $out;
}

El bucle foreach al final es el que se debe prestar atención. Recorra un rango de 1-12, cree un nombre de mes adecuado para cada uno y vea si existe el recuento de publicaciones. Si usa ese número, o si no imprime 0.

Ese código abreviado como complemento .

EDIT los recuentos de visualización de los últimos 12 meses.

Esta requiere una consulta un poco más compleja, pero el concepto es el mismo: obtener conteos de publicaciones, agrupados por mes. Esta vez, orden por fecha de envío ascendente. A partir de ahí, solo tenemos que hacer una serie de números de meses basados en la fecha actual.

Ejemplo (de nuevo como código abreviado)

<?php
add_action('init', 'wpse60859_register_shortcode');
/**
 * Registers the shortcode
 * 
 * @uses    add_shortcode
 */
function wpse60859_register_shortcode()
{
    add_shortcode(
        'posts_per_month_last',
        'wpse60859_shortcode_alt_cb'
    );
}

/**
 * Callback for displaying the last twelve months of posts
 *
 * @uses $wpdb
 */
function wpse60859_shortcode_alt_cb()
{
    global $wpdb;
    $res = $wpdb->get_results(
        "SELECT MONTH(post_date) as post_month, COUNT(ID) as post_count " .
        "FROM {$wpdb->posts} " .
        "WHERE post_date BETWEEN DATE_SUB(NOW(), INTERVAL 12 MONTH) AND NOW() " .
        "AND post_status = 'publish' " .
        "GROUP BY post_month ORDER BY post_date ASC", OBJECT_K
    );

    $cur = absint(date('n'));
    if($cur > 1)
    {
        $looper = array_merge(range($cur, 12), range(1, $cur-1));
    }
    else
    {
        $looper = range(1, 12);
    }

    $out = '<ul>';
    foreach($looper as $m)
    {
        $month = date_i18n('F', mktime(0, 0, 0, $m, 1));
        $out .= sprintf(
            '<li>%s %d</li>',
            $month,
            isset($res[$m]) ? $res[$m]->post_count : 0
        );
    }
    $out .= '</ul>';

    return $out;
}
    
respondido por el chrisguitarguy 05.08.2012 - 05:14
1

Gracias por tu ayuda, Chris y Varun. Parece que lo he hecho utilizando principalmente el ejemplo de Chris y también tomando un poco de código de Varuns.

Esto es lo que terminé. No estoy seguro de si es la forma más eficiente de hacer esto, es más una prueba de concepto para mí, pero si alguien tiene una forma de hacerlo más limpia, por favor, hágamelo saber.

Gracias a todos.

global $wpdb;
$res = $wpdb->get_results(
    "SELECT MONTH(post_date) as post_month, COUNT(ID) as post_count " .
    "FROM {$wpdb->posts} " .
    "WHERE post_date BETWEEN DATE_SUB(NOW(), INTERVAL 12 MONTH) AND NOW() AND post_type = 'post' " .
    "AND post_status = 'publish' " .
    "GROUP BY post_month ORDER BY post_date DESC", OBJECT_K
);

$postCount= 0;
$len = count($looper);

$cur = absint(date('n'));
if($cur > 1)
{
    $looper = array_merge(range($cur+1, 12), range(1, $cur));
}
else
{
    $looper = range(1, 12);
}

$out = '0,';
$postCount= '0';
$len = count($looper);
foreach($looper as $m)
{


    $month = date_i18n('F', mktime(0, 0, 0, $m, 1));

    $out .= sprintf(
        '%s %d',
        $month,
        //'',
        isset($res[$m]) ? $res[$m]->post_count : 0
    );
    if ($postCount!= $len-1) {
        $out .= ',';
    }

    $postCount++;

}
//$out .= '</ul>';

echo $out;
    
respondido por el davebowker 05.08.2012 - 20:16

Lea otras preguntas en las etiquetas