web-dev-qa-db-fra.com

Comment afficher la présentation du widget "Archives" (barre latérale) dans Wordpress par "année", puis par "mois"?

J'utilise le widget par défaut dans ma barre latérale Archive, qui affiche actuellement l'archive de la manière suivante:

Mar 2018
Feb 2018
Jan 2018

Cependant, j'aimerais qu'il soit affiché de cette façon:

2018
March
February
January

2017
December
November
October

Où les mois sont des liens. Comment puis-je y arriver? Que dois-je faire dans mon fichier sidebar.php?

2
catandmouse

Changer le widget par défaut serait assez compliqué.

Cependant, vous pouvez écrire votre propre shortcode et votre propre fonction pour obtenir votre liste souhaitée.

Je suppose que vous voulez une liste non ordonnée dans votre widget?

Mettez ceci dans le functions.php de votre thème:

add_shortcode('archive_by_year_and_month','get_archive_by_year_and_month');

function get_archive_by_year_and_month($atts=array()){
    global $wpdb;
    $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC");
    if($years){
        $rueckgabe = '<ul>';
        foreach($years as $year){
            $rueckgabe.='<li class="jahr"><a href="'.get_year_link($year).'">'.$year.'</a>';
            $rueckgabe.='<ul class="monthlist">';
            $months = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_type='post' AND post_status='publish' AND YEAR(post_date) = %d ORDER BY post_date ASC",$year));
            foreach($months as $month){
                $dateObj   = DateTime::createFromFormat('!m', $month);
                $monthName = $dateObj->format('F'); 
                $rueckgabe.='<li class="month"><a href="'.get_month_link($year,$month).'">'.$monthName.'</a></li>';
            }
            $rueckgabe.='</ul>';
            $rueckgabe.='</li>';
        }
        $rueckgabe.='</ul>';
    }
    return $rueckgabe;
}

Ensuite, placez un widget texte dans votre barre latérale et entrez le shortcode:

[archive_by_year_and_month]

Cliquez sur Enregistrer et le tour est joué: Vous devriez obtenir votre liste comme vous le souhaitez.

Bon codage!

3
kuchenundkakao

J'ai bien peur qu'il soit assez difficile de modifier la sortie du widget original. Il utilise la fonction wp_get_archives pour imprimer l'archive et il n'y a pas de moyen facile de modifier cette sortie. Vous pouvez essayer d'utiliser get_archives_link, mais cela peut devenir un peu désordonné.

En disant cela ... Il existe un autre moyen, beaucoup plus simple: écrire votre propre widget.

class WP_Widget_ArchivesByYear extends WP_Widget {

    public function __construct() {
        $widget_ops = array(
            'classname' => 'widget_archive_by_year',
            'description' => __( 'A monthly archive of your site&#8217;s Posts displayed by year.' ),
            'customize_selective_refresh' => true,
        );
        parent::__construct('archives_by_year', __('Archives by Year'), $widget_ops);
    }

    public function widget( $args, $instance ) {
        global $wpdb;

        $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Archives' ) : $instance['title'], $instance, $this->id_base );

        echo $args['before_widget'];
        if ( $title ) {
            echo $args['before_title'] . $title . $args['after_title'];
        }

        $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC");

        if ( $years ) :
        ?>
            <ul class="years-list">
                <?php
                    foreach ( $years as $year ) : 
                        $months = $wpdb->get_col( $wpdb->prepare("SELECT DISTINCT MONTH(post_date) FROM {$wpdb->posts} WHERE post_type='post' AND post_status='publish' AND YEAR(post_date) = %d ORDER BY post_date ASC", $year));
                ?>
                    <li class="year">
                        <a href="<?php echo get_year_link($year); ?>"><?php echo $year ?></a>
                        <ul class="months-list">
                            <?php
                                foreach ( $months as $month ) :
                                    $dateObj = DateTime::createFromFormat('!m', $month);
                            ?>
                                <li class="month">
                                    <a href="<?php echo get_month_link($year, $month); ?>"><?php echo $dateObj->format('F'); ?></a>
                                </li>
                            <?php endforeach; ?>
                        </ul>
                    </li>
                <?php endforeach; ?>        
            </ul>
        <?php
        endif;

        echo $args['after_widget'];
    }

    public function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $new_instance = wp_parse_args( (array) $new_instance, array( 'title' => '') );
        $instance['title'] = sanitize_text_field( $new_instance['title'] );

        return $instance;
    }


    public function form( $instance ) {
        $instance = wp_parse_args( (array) $instance, array( 'title' => '') );
        $title = sanitize_text_field( $instance['title'] );
        ?>
        <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>
        <?php
    }
}

PS Je n'ai pas testé ce code, il peut donc contenir des fautes de frappe.

1