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

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

ただいまの
回答率

90.51%

  • WordPress

    7212questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

WordPress get_calendarで出力されるhtmlコードをカスタマイズしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 511

yujic

score 4

実現したいこと

WordPress、get_calendarで出力されるhtmlコードをカスタマイズしたいです。
フックを用いてfunctions.phpに記述するということはわかったのですが、「フック」をあまり良くわかっていないため、具体的なコードがわからない状態です。

具体的にはカレンダーの日付で、
リンクがある日付は普通にaタグで囲み
リンクが無い日付はspanで囲むように
修正したいと思っています。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+3

簡単なのは/wp-includes/general-template.phpの中身をコピーします。
WordPress4.8.2だと上記ファイルの1904~2116行目をコピーしてfunction get_calendarの部分をfunction get_my_calendarなどに変更してテーマのfunctions.phpに追加します。
この追加した部分を好きなように装飾してカスタマイズしてください。

追記
例を載せておくので弄ってみてください。
あくまでコアのコードをそのまま流用してるだけなのでtdで出力するようになってますが、希望はspanとの事なのでtdへspanを放りこんでるので、my_calendar_spanを探して好きなようにしてみてください。

aタグの方はclassをmy_calendar_classにしてあるので探してください。
aタグの方もtdで出力されるのでmy_calendar_spanが入りますが、これは致し方ないでしょう。

以下をテーマのfunctions.phpに追加。

function get_my_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 ] ) ) {
        $output = apply_filters( 'get_calendar', $cache[ $key ] );

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

        return $output;
    }

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

    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 = (int) get_option( 'start_of_week' );
    $ts = current_time( 'timestamp' );

    if ( ! empty( $monthnum ) && ! empty( $year ) ) {
        $thismonth = zeroise( intval( $monthnum ), 2 );
        $thisyear = (int) $year;
    } elseif ( ! empty( $w ) ) {
            $thisyear = (int) substr( $m, 0, 4 );
            $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 = gmdate( 'Y', $ts );
        $thismonth = gmdate( 'm', $ts );
    }

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

    $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");

    $calendar_caption = _x('%1$s %2$s', 'calendar caption');
    $calendar_output = '<table id="wp-calendar">
    <caption>' . sprintf(
        $calendar_caption,
        $wp_locale->get_month( $thismonth ),
        date( '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();

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

    $pad = calendar_week_mod( date( '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) date( '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 == gmdate( 'j', $ts ) &&
            $thismonth == gmdate( 'm', $ts ) &&
            $thisyear == gmdate( 'Y', $ts ) ) {
            $calendar_output .= '<td id="today">';
        } else {
            $calendar_output .= '<td><span class="my_calendar_span">';
        }

        if ( in_array( $day, $daywithpost ) ) {
                    $date_format = date( _x( 'F j, Y', 'daily archives date format' ), strtotime( "{$thisyear}-{$thismonth}-{$day}" ) );
            $label = sprintf( __( 'Posts published on %s' ), $date_format );
            $calendar_output .= sprintf(
                '<a class="my_calendar_class" href="%s" aria-label="%s">%s</a>',
                get_day_link( $thisyear, $thismonth, $day ),
                esc_attr( $label ),
                $day
            );
        } else {
            $calendar_output .= $day;
        }
        $calendar_output .= '</span></td>';

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

    $pad = 7 - calendar_week_mod( date( '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 ) {
    return apply_filters( 'get_calendar', $calendar_output );
    }
}


カレンダーを表示したいところに<?php echo get_my_calendar(); ?>を書き込めば表示されるはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

関連した質問

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

  • WordPress

    7212questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。