web-dev-qa-db-ja.com

Wordpressの「アーカイブ」ウィジェットのレイアウト(サイドバー)を '年'で '月'で表示するにはどうすればよいですか

私は現在アーカイブをこのようにして表示している私のサイドバーArchiveのデフォルトウィジェットを使っています。

Mar 2018
Feb 2018
Jan 2018

しかし、私はそれがこのように表示したいのですが:

2018
March
February
January

2017
December
November
October

月がリンクしているところ。どうやってそれを達成できますか? sidebar.phpファイルに何をしますか?

2
catandmouse

デフォルトウィジェットを変更するのはかなり複雑です。

しかし、あなたはあなた自身の希望するリストを得るためにあなた自身のショートコードと機能を書くことができます。

私はあなたがあなたのウィジェットに順不同のリストが欲しいと思いますか?

これをあなたのテーマのfunctions.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;
}

それからサイドバーにテキストウィジェットを入れて、ショートコードを入力してください。

[archive_by_year_and_month]

保存して失礼します。必要に応じてリストを取得してください。

ハッピーコーディング!

3
kuchenundkakao

元のウィジェットの出力を修正するのはかなり難しいでしょう。アーカイブを印刷するためにwp_get_archives関数を使用しており、この出力を修正する簡単な方法はありません。あなたはget_archives_linkを使うことを試みることができます、しかしそれは少し面倒になることができます。

それを言って...他の、はるかに簡単な方法があります - あなた自身のウィジェットを書くこと。

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。私はそのコードをテストしていないので、いくつかのタイプミスを含めることができます。

1