web-dev-qa-db-fra.com

Obtenir la liste des mois avec les messages

J'essaie d'ajouter un filtre sur mon thème personnalisé en fonction du mois suivant, similaire aux archives mais avec quelques différences.

Quel est le meilleur moyen d'obtenir une liste des mois dans lesquels nous avons des publications?

Merci Alex

J'ai utilisé la requête suivante:

 $wpdb->get_results("SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS   `month`, count(ID) as posts 
                     FROM $wpdb->posts 
                     WHERE post_type = 'post' AND post_status = 'publish' 
                     GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC"

Impossible d'utiliser la fonction wp_get_archives car elle ne renvoie que les formats suivants:

html - In HTML list (<li>) tags and before and after strings. This is the default.
option - In select (<select>) or dropdown option (<option>) tags.
link - Within link (<link>) tags.
custom - Custom list using the before and after strings.
2
thedev

Core ne peut pas vous aider ici. Vous devrez faire un…

Requête personnalisée

Voici une requête de sauvegarde que j'utilise dans les écrans de l'interface utilisateur pour obtenir le nombre total de mois avec les publications pour les utiliser dans la pagination personnalisée. Faites attention à ne pas rechercher uniquement les publications publiées, mais prenez en compte le fait qu'il pourrait y avoir un ensemble de restrictions et appliquez-le ensuite.

$post_status = esc_attr( $_GET['post_status'] );
$post_status = in_array( $post_status, $GLOBALS['avail_post_stati'] )
    ? " AND post_status = {$post_status}"
    : 'all'
;
'all' === $post_status AND $post_status = '';

$total_page_dates = $wpdb->get_results( $wpdb->prepare( "
    SELECT
        YEAR( post_date )  AS year,
        MONTH( post_date ) AS month,
        count( ID )        AS posts
    FROM {$wpdb->posts}
    WHERE
        post_type = %s
        %s
    GROUP BY
        YEAR( post_date ),
        MONTH( post_date )
    ORDER BY post_date
    ASC
", get_current_screen()->post_type, $post_status ) );

Résultat

Vous pourrez alors inspecter votre résultat

// Inspect the result
var_dump( $total_page_dates );

Ce qui pourrait ressembler à ceci:

array (size=4)
  0 => 
    object(stdClass)[1847]
      public 'year' => string '2013' (length=4)
      public 'month' => string '6' (length=1)
      public 'posts' => string '19' (length=2)
  1 => 
    object(stdClass)[1846]
      public 'year' => string '2013' (length=4)
      public 'month' => string '7' (length=1)
      public 'posts' => string '17' (length=2)
  2 => 
    object(stdClass)[1845]
      public 'year' => string '2013' (length=4)
      public 'month' => string '8' (length=1)
      public 'posts' => string '8' (length=1)
  3 => 
    object(stdClass)[1844]
      public 'year' => string '2013' (length=4)
      public 'month' => string '9' (length=1)
      public 'posts' => string '2' (length=1)

Vous pouvez alors le parcourir ou simplement saisir le premier ou le dernier élément du tableau pour obtenir la plage. Compter - count( $total_page_dates ) - vous dirait combien de mois vous avez eu, etc. Gardez à l'esprit que chaque valeur de tableau est une object, vous devez donc y accéder comme ceci

$posts_in_first_month = total_page_dates[0]->posts;
1
kaiser

Essayez wp_get_archives ()

Douze derniers mois

Affiche la liste des archives par mois, en affichant uniquement les douze derniers.

<?php wp_get_archives('type=monthly&limit=12'); ?>

Quinze derniers jours

Affiche la liste des archives par date et n’affiche que les quinze derniers jours.

<?php wp_get_archives('type=daily&limit=15'); ?>

Les vingt derniers messages

Affiche la liste des archives des vingt derniers messages les plus récents classés par titre.

<?php wp_get_archives('type=postbypost&limit=20&format=custom'); ?>

Pour une solution non formatée, envisagez d'utiliser query_posts ()

<?php 
    $allPosts = query_posts('cat=6&monthnum=04&year=2011');
    print_r($allPosts); 
?>
1
Michael Ecklund

C'est la requête que wp_get_archive utilise en interne pour les archives du mois

$query = "SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date $order $limit";

et vous faites la même chose, sauf que vous utilisez distinct et groupe par ensemble.

0
Rajeev Vyas