¿Cómo muestro el diseño del widget "Archives" (barra lateral) en Wordpress por "año" y luego por "meses"?

2

Estoy usando el widget predeterminado en el Archivo de mi barra lateral que actualmente muestra el archivo de esta manera:

Mar 2018
Feb 2018
Jan 2018

Sin embargo, me gustaría que se muestre de esta manera:

2018
March
February
January

2017
December
November
October

Donde los meses son enlaces. ¿Cómo logro eso? ¿Qué hago con mi archivo sidebar.php?

    
pregunta catandmouse 27.04.2018 - 04:08

2 respuestas

3

Cambiar el widget predeterminado sería bastante complicado.

Sin embargo, puede escribir su propio código y función para obtener la lista deseada.

¿Supongo que quieres una lista desordenada en tu widget?

Ponga esto en las funciones de su tema.php:

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

Luego coloque un Widget de texto en la barra lateral e ingrese el código corto:

[archive_by_year_and_month]

Pulsa guardar y listo: debes obtener tu lista como desees.

¡Feliz codificación!

    
respondido por el kuchenundkakao 03.05.2018 - 08:43
1

Me temo que sería bastante difícil modificar la salida del widget original. Utiliza la función wp_get_archives para imprimir el archivo y no hay una manera fácil de modificar esta salida. Puedes intentar usar get_archives_link , pero puede ser un poco desordenado.

Decir que ... Hay otra forma mucho más sencilla: escribir tu propio 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. No he probado ese código, por lo que puede contener algunos errores tipográficos.

    
respondido por el Krzysiek Dróżdż 06.05.2018 - 12:35

Lea otras preguntas en las etiquetas