web-dev-qa-db-fra.com

Permaliens d'archives annuels/mensuels de type publication personnalisée

J'ai un type de message personnalisé "news" sur mon site Wordpress. J'utilise le plugin Advanced Custom Fields pour ajouter des métadonnées à chaque message.

Je veux créer un tableau de nouvelles sous forme d'archive:

[2013]
    [January] => 5
[2012]
    [January] => 20
    [February] => 10
[2011]
    [April] => 30

J'ai réussi à faire fonctionner ça en utilisant:

    global $wpdb;
    $news = $wpdb->get_results(
        "SELECT wp_posts.post_date, COUNT(wp_posts.ID) as count
         FROM $wpdb->posts
         WHERE
         wp_posts.post_type = 'news' AND
         wp_posts.post_status = 'publish' AND
         wp_posts.post_date <= CURDATE() AND
         wp_posts.post_date >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
         GROUP BY YEAR(wp_posts.post_date), MONTH(wp_posts.post_date)
         ORDER BY wp_posts.post_date DESC", 
         ARRAY_A);

    $archive = array();
    foreach ($news as $post):
        $year = date('Y', strtotime($post['post_date']));      
        $month = date('m', strtotime($post['post_date']));     
        $month_name = date('F', strtotime($post['post_date']));
        $post['url'] = 'NOT SURE ABOUT URL';
        $archive[$year][$month_name] = $post;
    endforeach;

Je dois pouvoir établir un lien avec des années et des mois spécifiques en utilisant http://example.com/news/2012/ et http://example.com/news/2012/10/.

J'ai essayé d'utiliser le plugin Custom Post Type Archives mais quand je vais à /news/2012/ je reçois la liste de nouvelles standard sans filtre appliqué.

Voici mon code de type de message personnalisé

register_post_type('news', 
  array(    
    'label' => 'News',
    'description' => 'Latest News',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'capability_type' => 'post',
    'hierarchical' => true,
    'rewrite' => array('slug' => '','with_front' => '1'),
    'query_var' => true,
    'has_archive' => true,
    'menu_position' => 120,
    'menu_icon' => /assets/img/icon-custom.png
  )
);
7
dclawson

Voici un exemple utilisant add_rewrite_rule pour gérer des années et des mois pour un type de publication personnalisé où news est le slug. Visitez la page Settings > Permalinks dans admin pour effacer les règles de réécriture après leur ajout. Vous pouvez également mettre ceci dans un plugin et effacer les règles de réécriture lors de l'activation du plugin .

function wpa83797_news_rewrite_rules(){

    add_rewrite_rule(
        'news/([0-9]{4})/([0-9]{1,2})/?$',
        'index.php?post_type=news&year=$matches[1]&monthnum=$matches[2]',
        'top'
    );

    add_rewrite_rule(
        'news/([0-9]{4})/?$',
        'index.php?post_type=news&year=$matches[1]',
        'top'
    );

}
add_action( 'init', 'wpa83797_news_rewrite_rules' );
6
Milo