web-dev-qa-db-fra.com

Nombre de messages par (jour/mois/année)

Je cherche à faire écho au nombre de publications par mois depuis le début du blog et pendant les mois où il n'y a pas eu de publications en écho.

C'est la sortie que je veux:

1er janvier, 3 février, 8 mars, 3 avril, ...

Toute aide est la bienvenue. Dave

2
davebowker

En gros, vous devez donc coller le code suivant dans le fichier sidebar.php de votre thème ou dans tout autre fichier dans lequel vous souhaitez afficher des archives WordPress personnalisées.

<?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; ?>

Remarque: Si vous souhaitez modifier le nombre de mois affichés, vous devez modifier la ligne 19, où la valeur maximale de $ limite est définie sur 18.

Notre CSS ressemblait un peu à ça:

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

Maintenant, si vous voulez afficher le nombre de messages chaque mois, vous devez ajouter ce code n'importe où entre les lignes 12 à 16 du code ci-dessus:

<?php echo $month->post_count; ?>
2
Varun Sridharan

Votre meilleur pari est probablement d'utiliser $wpdb directement. Vous pouvez utiliser COUNT et GROUP BY pour faciliter les choses.

Une requête pourrait ressembler à ceci:

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

Cela vous amène la plupart du chemin là-bas. Assurez-vous de consulter la section résultats génériques de la documentation wpdb.

Pour vous aider à faire le reste du chemin, vous voudrez probablement parcourir une plage de 1 à 12, en créant des noms de mois et en vérifiant si les résultats incluent ce mois.

Voici un exemple implémenté en tant que shortcode:

<?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;
}

La boucle foreach à la fin est celle à surveiller. Parcourez une plage allant de 1 à 12, créez un nom de mois approprié pour chacun et vérifiez si le nombre de publications existe. S'il utilise ce numéro, ou bien affiche 0.

Ce shortcode en tant que plugin .

EDITAffiche les comptes des 12 derniers mois.

Celle-ci nécessite une requête un peu plus complexe, mais le concept est le même: obtenir le nombre de publications, groupe par mois. Cette fois, ordre par date de poste croissant. À partir de là, il suffit de faire un tableau de mois en fonction de la date actuelle.

Exemple (encore un shortcode)

<?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;
}
2
chrisguitarguy

Merci pour votre aide, Chris et Varun. Je semble l'avoir fait en prenant principalement l'exemple de Chris et en prenant un peu de code de Varuns également.

Voici ce que j'ai fini avec. Je ne suis pas sûr que ce soit le moyen le plus efficace de le faire, mais plutôt une preuve de concept, mais si quelqu'un a le moyen de le nettoyer, faites-le-moi savoir.

Merci a tous.

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;
1
davebowker