2013-02-27 5 views
0

У меня есть этот код:Как создать новый пользовательский виджет календаря в WordPress?

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

    $cache = array(); 
    $key = md5($m . $monthnum . $year); 
    if ($cache = wp_cache_get('get_calendar', 'calendar')) { 
     if (is_array($cache) && isset($cache[ $key ])) { 
      if ($echo) { 
       echo apply_filters('get_calendar', $cache[$key]); 
       return; 
      } else { 
       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_status = 'publish' 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_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 = '<div align="center"><table width="300px" style="border: 1px solid #ccc; background: #eee;"><tr><td width="150px" style="text-align: left; vertical-align: top;"><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 = (true == $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) . '" title="' . esc_attr(sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($previous->month), date('Y', mktime(0, 0 , 0, $previous->month, 1, $previous->year)))) . '">&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) . '" title="' . esc_attr(sprintf(__('View posts for %1$s %2$s'), $wp_locale->get_month($next->month), date('Y', mktime(0, 0 , 0, $next->month, 1, $next->year)))) . '">' . $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>'; 

    // 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]; 
     } 
    } else { 
     $daywithpost = array(); 
    } 

    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_status = 'publish'" 
    ); 
    if ($ak_post_titles) { 
     foreach ((array) $ak_post_titles as $ak_post_title) { 

       $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">&nbsp;</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) .'">&nbsp;</td>'; 

    $calendar_output .= "\n\t</tr>\n\t</tbody></td></table></td><td style='text-align: right; vertical-align: top; border-right: 1px solid #ccc;'><td align='left' valign='top'><embed src='http://img.mikufan.pl/mikuclock.swf' quality='high' bgcolor='#ffffff' name='mikuclock' allowscriptaccess='sameDomain' allowfullscreen='false' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' align='middle' height='180' width='150'></td></td></tr></table></div>"; 

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

    if ($echo) 
     echo apply_filters('get_calendar', $calendar_output); 
    else 
     return apply_filters('get_calendar', $calendar_output); 

} 

Это модифицированный календарь код в WordPress из файла общего пользования template.php. Если я изменяю oryginal код календаря для этого кода, то у меня есть мой модифицированный календарь. Но у меня новая установка WordPress, чем у меня нет modiffy oryginal filles, но я хочу свой календарь. Итак, как я могу создать новый виджет-плагин с этим кодом? Я создал новый виджет просто плагин:

<?php 
/* 
Plugin Name: My New simple widget #1 
Plugin URI: http://mikufan.pl/ 
Description: This is my new simple widget plugin... 
Author: Idolw Szutrab 
Version: 1.0.0 
Author URI: http://idolwszutrab7.tumblr.com/ 
*/ 

function sampleHelloWorld() 
{ 
    echo "<h2>Hello World</h2>"; 
} 

function widget_myHelloWorld($args) { 
    extract($args); 
    echo $before_widget; 
    echo $before_title;?>My Widget Title<?php echo $after_title; 
    sampleHelloWorld(); 
    echo $after_widget; 
} 

function myHelloWorld_init() 
{ 
    register_sidebar_widget(__('Hello World'), 'widget_myHelloWorld');  
} 
add_action("plugins_loaded", "myHelloWorld_init"); 
?> 

Но когда я вставляю код о моем Каллендер этого кода, то плагин dosen't работы. Итак, как я могу вставить код моего календаря в код плагина? Короче ... Я хочу использовать свой календарь, но мне не нужен файл modpressy oryginals wordpress:/Как я могу это сделать?

ответ

1

Вы можете скопировать/функцию класса для календаря от default_widgets.php в соре-включает в себя папку, а также скопировать функцию get_calendar() из general_template.php в свой functions.php файл для вашей темы.

Вам нужно будет переименовать класс и переименовать get_calendar() в нечто уникальное. Как только вы это сделаете, вы найдете виджет в вашем админе, который контролируется этой новой функцией. Вы можете назвать его, что хотите, и поменять html в функции get_calendar(), если хотите.

+0

Я скопирую get_calendar() из general_template в свой funtions.php, а также скопирую календарь классов из default_widgets.php и в мои функции.php, но я не знаю, что сейчас. Конечно, я переименовал «get_calendar» в «get_mikuCalendar» и имя класса «WP_Widget_Calendar» в «WP_Widget_mikuCalendar». –

Смежные вопросы