it-swarm.com.de

Wie zeige ich das Widget-Layout "Archive" (Seitenleiste) in Wordpress nach "Jahr" und "Monaten" an?

Ich verwende das Standard-Widget in meinem Seitenleisten-Archiv, das das Archiv derzeit folgendermaßen anzeigt:

Mar 2018
Feb 2018
Jan 2018

Ich möchte jedoch, dass es so angezeigt wird:

2018
March
February
January

2017
December
November
October

Wo die Monate sind Links. Wie erreiche ich das? Was mache ich mit meiner sidebar.php-Datei?

2
catandmouse

Das Ändern des Standard-Widgets wäre ziemlich kompliziert.

Sie können jedoch einen eigenen Shortcode und eine eigene Funktion schreiben, um die gewünschte Liste zu erhalten.

Ich vermute, Sie möchten eine ungeordnete Liste in Ihrem Widget?

Schreibe dies in die functions.php deines Themas:

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

Dann lege ein Text-Widget in deine Sidebar und gib den Shortcode ein:

[archive_by_year_and_month]

Klicken Sie auf Speichern und OK: Sie sollten Ihre Liste wie gewünscht erhalten.

Viel Spaß beim Codieren!

3
kuchenundkakao

Leider ist es ziemlich schwierig, die Ausgabe des ursprünglichen Widgets zu ändern. Das Archiv wird mit der Funktion wp_get_archives gedruckt, und es gibt keine einfache Möglichkeit, diese Ausgabe zu ändern. Sie könnten versuchen, get_archives_link zu verwenden, aber es kann ein bisschen chaotisch werden.

Das sagen ... Es gibt eine andere, viel einfachere Möglichkeit - das Schreiben eines eigenen Widgets.

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. Ich habe diesen Code nicht getestet, daher kann er Tippfehler enthalten.

1