

wordpressで複数人で投稿予定のサイトを作成しております。

それぞれの投稿者のページに `get_calendar`
でカレンダーを表示し、投稿のある日にリンクを貼りたいのですが、現状全ての投稿者のリンクが貼られてしまう状況です。

例:  
aさん 1日、3日、5日更新 →カレンダーの1、3、5にリンクが貼られて欲しい  
bさん 2日、4日、6日更新 →カレンダーの2、4、6にリンクが貼られて欲しい  
現状：→カレンダーの1、2、3、4、5、6にリンクが貼られている

カレンダーを表示しているタグは以下です。

[code]

    <?php get_calendar(); ?>
    
[/code]

お知恵を貸していただけますと助かります。宜しくお願い致します。


CC BY-SA 3.0
2015-12-20T10:43:10.023
20215
2016-04-19T13:06:39.897
2015-12-21T11:30:41.977
13748
13748
question
wordpress
投稿者ごとのカレンダーを表示したい


自己解決できました！  
今後同じような方のためにソースコードを掲載しておきます。

手順：  
1.wp-includes/general-template.phpの中にある、get_calender()関数を、functions.phpにコピー  
2.author idを取得し変数に格納（$uid）  
3.全てのSQL文のWHERE句内に post_author = $uidを挿入

[code]

    //投稿者ごとのリンクをカレンダーに表示
    function get_custom_calendar($initial = true, $echo = true) {
        global $wpdb, $m, $monthnum, $year, $wp_locale, $posts, $uid;
    
        //author IDを取得する
        $uid = get_the_author_meta('id');
        $key = md5( $m . $monthnum . $year );
        if ( $cache = wp_cache_get( 'get_calendar', 'calendar' ) ) {
            if ( is_array($cache) && isset( $cache[ $key ] ) ) {
                if ( $echo ) {
                    /** This filter is documented in wp-includes/general-template.php */
                    echo apply_filters( 'get_calendar', $cache[$key] );
                    return;
                } else {
                    /** This filter is documented in wp-includes/general-template.php */
                    return apply_filters( 'get_calendar', $cache[$key] );
                }
            }
        }
    
        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_author = $uid AND post_status = 'publish'　AND post_author = $uid LIMIT 1");
            if ( !$gotsome ) {
                $cache[ $key ] = '';
                wp_cache_set( 'get_calendar', $cache, 'calendar' );
                return;
            }
        }
    
        if ( isset($_GET['w']) )
            $w = ''.intval($_GET['w']);
    
        // week_begins = 0 stands for Sunday
        $week_begins = intval(get_option('start_of_week'));
    
        // Let's figure out when we are
        if ( !empty($monthnum) && !empty($year) ) {
            $thismonth = ''.zeroise(intval($monthnum), 2);
            $thisyear = ''.intval($year);
        } elseif ( !empty($w) ) {
            // We need to get the month from MySQL
            $thisyear = ''.intval(substr($m, 0, 4));
            $d = (($w - 1) * 7) + 6; //it seems MySQL's weeks disagree with PHP's
            $thismonth = $wpdb->get_var("SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')");
        } elseif ( !empty($m) ) {
            $thisyear = ''.intval(substr($m, 0, 4));
            if ( strlen($m) < 6 )
                    $thismonth = '01';
            else
                    $thismonth = ''.zeroise(intval(substr($m, 4, 2)), 2);
        } else {
            $thisyear = gmdate('Y', current_time('timestamp'));
            $thismonth = gmdate('m', current_time('timestamp'));
        }
    
        $unixmonth = mktime(0, 0 , 0, $thismonth, 1, $thisyear);
        $last_day = date('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_author = $uid 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_author = $uid 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), 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) . '">« ' . $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"> </td>';
        }
    
        $calendar_output .= "\n\t\t".'<td class="pad"> </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)) . ' »</a></td>';
        } else {
            $calendar_output .= "\n\t\t".'<td colspan="3" id="next" class="pad"> </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_author = $uid
            AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", ARRAY_N);
        if ( $dayswithposts ) {
            foreach ( (array) $dayswithposts as $daywith ) {
                $daywithpost[] = $daywith[0];
            }
        }
    
        if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'camino') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'safari') !== false)
            $ak_title_separator = "\n";
        else
            $ak_title_separator = ', ';
    
        $ak_titles_for_day = array();
        $ak_post_titles = $wpdb->get_results("SELECT ID, post_title, DAYOFMONTH(post_date) as dom "
            ."FROM $wpdb->posts "
            ."WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00' "
            ."AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59' "
            ."AND post_type = 'post' AND post_author = $uid AND post_status = 'publish'"
        );
        if ( $ak_post_titles ) {
            foreach ( (array) $ak_post_titles as $ak_post_title ) {
    
                    /** This filter is documented in wp-includes/post-template.php */
                    $post_title = esc_attr( apply_filters( 'the_title', $ak_post_title->post_title, $ak_post_title->ID ) );
    
                    if ( empty($ak_titles_for_day['day_'.$ak_post_title->dom]) )
                        $ak_titles_for_day['day_'.$ak_post_title->dom] = '';
                    if ( empty($ak_titles_for_day["$ak_post_title->dom"]) ) // first one
                        $ak_titles_for_day["$ak_post_title->dom"] = $post_title;
                    else
                        $ak_titles_for_day["$ak_post_title->dom"] .= $ak_title_separator . $post_title;
            }
        }
    
        // See how much we should pad in the beginning
        $pad = calendar_week_mod(date('w', $unixmonth)-$week_begins);
        if ( 0 != $pad )
            $calendar_output .= "\n\t\t".'<td colspan="'. esc_attr($pad) .'" class="pad"> </td>';
    
        $daysinmonth = intval(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', current_time('timestamp')) && $thismonth == gmdate('m', current_time('timestamp')) && $thisyear == gmdate('Y', current_time('timestamp')) )
                $calendar_output .= '<td id="today">';
            else
                $calendar_output .= '<td>';
    
            if ( in_array($day, $daywithpost) ) // any posts today?
                    $calendar_output .= '<a href="' . get_day_link( $thisyear, $thismonth, $day ) . '" title="' . esc_attr( $ak_titles_for_day[ $day ] ) . "\">$day</a>";
            else
                $calendar_output .= $day;
            $calendar_output .= '</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) .'"> </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 ) {
            /**
             * Filter the HTML calendar output.
             *
             * @since 3.0.0
             *
             * @param string $calendar_output HTML output of the calendar.
             */
            echo apply_filters( 'get_calendar', $calendar_output );
        } else {
            /** This filter is documented in wp-includes/general-template.php */
            return apply_filters( 'get_calendar', $calendar_output );
        }
    }
    
[/code]


CC BY-SA 3.0
2015-12-21T11:37:13.227
20259
2015-12-21T11:41:57.797
2015-12-21T11:41:57.797
8000
13748
20215
answer