質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

Wordpress ウィジェット標準カレンダーのカスタマイズについて

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,003

pippi_385

score 6

Wordpressのウィジェット欄にある、「カレンダー」のカスタマイズについてお伺いしたいです。

現在スクールのレッスン予約ページを制作中です。
その中でカレンダーを表示させたいと思っているのですが、プラグインはある程度自由度が低く調整しにくいところもあり、
詳しい人に聞いてみたところウィジェットにデフォルトで入っている「カレンダー」でもできるのでは?とアドバイスをいただき
実践してみているところなのですがうまくいかないため、質問させてください。

カレンダーの表示自体は、dynamic_sidebarで行っています。

今回のカレンダーの理想
・カレンダーに、標準の投稿(post)の記事を紐づけて、各日付の枠内に記事タイトル(これがレッスン名になる)を表示させたい。
・1日にレッスンは複数回ありうる(10時~12時レッスン1、14時~16時レッスン2といった感じ)
・記事タイトル(レッスン名)をクリックすると、各個別投稿ページ(レッスン詳細ページ)にリンクするようにしたい(single-post.phpを作る予定)
・カレンダー下の前後月への遷移先が今http://○○○/date/2020/○○/となっているのですが、クリックするとカレンダーの該当月に切り替えるように、などできるのでしょうか…?

カレンダーのなかで1日ごとのレッスン予定がぱっと見で分かって、さらに気になったレッスンタイトルをクリックすると各レッスンの詳細ページに飛ぶようにしたいのです。

・記事タイトルの出力、各個別投稿ページへのリンクの貼り方
・前後月カレンダーの表示

上記についてご教授いただければ幸いです。

よろしくお願いいたします。

見た目はこちらです。
イメージ説明

wp-includes>general-template.php のget_calender関数の全内容は下記です。

function get_calendar( $initial = true, $echo = true ) {
    global $wpdb, $m, $monthnum, $year, $wp_locale, $posts;

    $key   = md5( $m . $monthnum . $year );
    $cache = wp_cache_get( 'get_calendar', 'calendar' );

    if ( $cache && is_array( $cache ) && isset( $cache[ $key ] ) ) {
        /** This filter is documented in wp-includes/general-template.php */
        $output = apply_filters( 'get_calendar', $cache[ $key ] );

        if ( $echo ) {
            echo $output;
            return;
        }

        return $output;
    }

    if ( ! is_array( $cache ) ) {
        $cache = array();
    }

    // Quick check. If we have no posts at all, abort!
    if ( ! $posts ) {
        $gotsome = $wpdb->get_var( "SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" );
        if ( ! $gotsome ) {
            $cache[ $key ] = '';
            wp_cache_set( 'get_calendar', $cache, 'calendar' );
            return;
        }
    }

    if ( isset( $_GET['w'] ) ) {
        $w = (int) $_GET['w'];
    }
    // week_begins = 0 stands for Sunday
    $week_begins = (int) get_option( 'start_of_week' );

    // Let's figure out when we are
    if ( ! empty( $monthnum ) && ! empty( $year ) ) {
        $thismonth = zeroise( intval( $monthnum ), 2 );
        $thisyear  = (int) $year;
    } elseif ( ! empty( $w ) ) {
        // We need to get the month from MySQL
        $thisyear = (int) substr( $m, 0, 4 );
        //it seems MySQL's weeks disagree with PHP's
        $d         = ( ( $w - 1 ) * 7 ) + 6;
        $thismonth = $wpdb->get_var( "SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')" );
    } elseif ( ! empty( $m ) ) {
        $thisyear = (int) substr( $m, 0, 4 );
        if ( strlen( $m ) < 6 ) {
            $thismonth = '01';
        } else {
            $thismonth = zeroise( (int) substr( $m, 4, 2 ), 2 );
        }
    } else {
        $thisyear  = current_time( 'Y' );
        $thismonth = current_time( 'm' );
    }

    $unixmonth = mktime( 0, 0, 0, $thismonth, 1, $thisyear );
    $last_day  = gmdate( 't', $unixmonth );

    // Get the next and previous month and year with at least one post
    $previous = $wpdb->get_row(
        "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
        FROM $wpdb->posts
        WHERE post_date < '$thisyear-$thismonth-01'
        AND post_type = 'post' AND post_status = 'publish'
            ORDER BY post_date DESC
            LIMIT 1"
    );
    $next     = $wpdb->get_row(
        "SELECT MONTH(post_date) AS month, YEAR(post_date) AS year
        FROM $wpdb->posts
        WHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'
        AND post_type = 'post' AND post_status = 'publish'
            ORDER BY post_date ASC
            LIMIT 1"
    );

    /* translators: Calendar caption: 1: Month name, 2: 4-digit year. */
    $calendar_caption = _x( '%1$s %2$s', 'calendar caption' );
    $calendar_output  = '<table id="wp-calendar">
    <caption>' . sprintf(
        $calendar_caption,
        $wp_locale->get_month( $thismonth ),
        gmdate( 'Y', $unixmonth )
    ) . '</caption>
    <thead>
    <tr>';

    $myweek = array();

    for ( $wdcount = 0; $wdcount <= 6; $wdcount++ ) {
        $myweek[] = $wp_locale->get_weekday( ( $wdcount + $week_begins ) % 7 );
    }

    foreach ( $myweek as $wd ) {
        $day_name         = $initial ? $wp_locale->get_weekday_initial( $wd ) : $wp_locale->get_weekday_abbrev( $wd );
        $wd               = esc_attr( $wd );
        $calendar_output .= "\n\t\t<th scope=\"col\" title=\"$wd\">$day_name</th>";
    }

    $calendar_output .= '
    </tr>
    </thead>

    <tfoot>
    <tr>';

    if ( $previous ) {
        $calendar_output .= "\n\t\t" . '<td colspan="3" id="prev"><a href="' . get_month_link( $previous->year, $previous->month ) . '">&laquo; ' .
            $wp_locale->get_month_abbrev( $wp_locale->get_month( $previous->month ) ) .
        '</a></td>';
    } else {
        $calendar_output .= "\n\t\t" . '<td colspan="3" id="prev" class="pad">&nbsp;</td>';
    }

    $calendar_output .= "\n\t\t" . '<td class="pad">&nbsp;</td>';

    if ( $next ) {
        $calendar_output .= "\n\t\t" . '<td colspan="3" id="next"><a href="' . get_month_link( $next->year, $next->month ) . '">' .
            $wp_locale->get_month_abbrev( $wp_locale->get_month( $next->month ) ) .
        ' &raquo;</a></td>';
    } else {
        $calendar_output .= "\n\t\t" . '<td colspan="3" id="next" class="pad">&nbsp;</td>';
    }

    $calendar_output .= '
    </tr>
    </tfoot>

    <tbody>
    <tr>';

    $daywithpost = array();

    // Get days with posts
    $dayswithposts = $wpdb->get_results(
        "SELECT DISTINCT DAYOFMONTH(post_date)
        FROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'
        AND post_type = 'post' AND post_status = 'publish'
        AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'",
        ARRAY_N
    );
    if ( $dayswithposts ) {
        foreach ( (array) $dayswithposts as $daywith ) {
            $daywithpost[] = $daywith[0];
        }
    }

    // See how much we should pad in the beginning
    $pad = calendar_week_mod( gmdate( 'w', $unixmonth ) - $week_begins );
    if ( 0 != $pad ) {
        $calendar_output .= "\n\t\t" . '<td colspan="' . esc_attr( $pad ) . '" class="pad">&nbsp;</td>';
    }

    $newrow      = false;
    $daysinmonth = (int) gmdate( 't', $unixmonth );

    for ( $day = 1; $day <= $daysinmonth; ++$day ) {
        if ( isset( $newrow ) && $newrow ) {
            $calendar_output .= "\n\t</tr>\n\t<tr>\n\t\t";
        }
        $newrow = false;

        if ( $day == current_time( 'j' ) &&
            $thismonth == current_time( 'm' ) &&
            $thisyear == current_time( 'Y' ) ) {
            $calendar_output .= '<td id="today">';
        } else {
            $calendar_output .= '<td>';
        }

        if ( in_array( $day, $daywithpost ) ) {
            // any posts today?
            $date_format = gmdate( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) );
            /* translators: Post calendar label. %s: Date. */
            $label            = sprintf( __( 'Posts published on %s' ), $date_format );
            $calendar_output .= sprintf(
                '<a href="%s" aria-label="%s">%s</a>',
                get_day_link( $thisyear, $thismonth, $day ),
                esc_attr( $label ),
                $day
            );
        } else {
            $calendar_output .= $day;
        }
        $calendar_output .= '</td>';

        if ( 6 == calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) {
            $newrow = true;
        }
    }

    $pad = 7 - calendar_week_mod( gmdate( 'w', mktime( 0, 0, 0, $thismonth, $day, $thisyear ) ) - $week_begins );
    if ( $pad != 0 && $pad != 7 ) {
        $calendar_output .= "\n\t\t" . '<td class="pad" colspan="' . esc_attr( $pad ) . '">&nbsp;</td>';
    }
    $calendar_output .= "\n\t</tr>\n\t</tbody>\n\t</table>";

    $cache[ $key ] = $calendar_output;
    wp_cache_set( 'get_calendar', $cache, 'calendar' );

    if ( $echo ) {
        /**
         * Filters the HTML calendar output.
         *
         * @since 3.0.0
         *
         * @param string $calendar_output HTML output of the calendar.
         */
        echo apply_filters( 'get_calendar', $calendar_output );
        return;
    }
    /** This filter is documented in wp-includes/general-template.php */
    return apply_filters( 'get_calendar', $calendar_output );
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • 退会済みユーザー

    2020/09/03 12:09

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • Space-Monkey

    2020/09/03 12:09

    > 実践してみているところなのですがうまくいかないため

    何が『うまくいかない』のか書いてない

    これはやりたい事だけ書いてコアのコードを張り付けただけの丸投げ質問

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る