WordPressでイベントカレンダー

WordPressでイベントカレンダー
WordPress ではウィジェットや get_calendar タグ/ファンクションを使って、ブログによくある投稿カレンダーを出力することができます。カレンダーの日付のリンク先は日付別アーカイブとなっているのですが、カレンダーの日付枠内に記事のタイトルを表示したいという要望がよくあります。巷ではイベントカレンダーと呼ばれるニーズですね。
そのようなことを実現するプラグインはありますが、他人のルールで作られたものは敬遠したいという方のために get_calendar をいじくる方法をご紹介します。さらにカレンダーに表示する記事はカテゴリーで指定できるようにします。

デモカレンダー

※ wpxtreme.jp / 2010年1月 / TUTORIAL カテゴリーの記事を表示しています。

2010年1月
    2月 »
 123
45678910
11121314151617
1819管理画面をカスタマイズする20the_excerpt で抜粋有無・本文長短・moreタグを考慮して「続きを読む」を付ける21新規ページのメタボックスのデフォルト値を自動で指定する2223公開済の記事を指定日時で予約更新する24投稿の一括操作で指定のカテゴリーを削除する
25カテゴリー毎の日付別アーカイブを表示する2627Ktai Entry でデコメール(背景は除く)28投稿に日付欄を追加してjQuery UIのDatepickerでカレンダーから入力する29AddToAny にはてブを追加&日本語ローカライズ3031

get_calendar を利用する

get_calendar() は以前は 取得/出力を選択できましたが WordPress 2.9.1 では有無を言わさず出力するようになっています。
wp-includes/general-template.php 956行目〜 get_calendar()(抜粋)

 :
ob_start();
 :
$output = ob_get_contents();
ob_end_clean();
echo $output;
 :

なんで仕様変えちゃうんだよこれじゃ手が出せねぇじゃねぇかよですね。でも安心してください。WordPress が自由気ままに生きても所詮は PHP という世界の中です。PHP が「んじゃぁこうすりゃじゃん」というさらに自由な設計なので echo されててもオソルルに足りません。
自由過ぎるゆえに PHP なんてメタメタやんけかもですが、エレガントなアーキテクチャの68系より融通の利く86系,何かと気難しい理系より何だかノリの良い文系,高飛車なセクシー美人系よりかわいげのある癒し系、といつの世も勝者のキーワードは「親しみやすさ」です。知らんけど。
ダメなものをダメと言ってるだけでは何も生まれません。そこからボク達は何を学べるか、より良くするためにボク達に何ができるか、そういう考え方をすると少しは抜け毛が減るんじゃないかなって思います。
で、カレンダーを出力させずに html のマークアップ文字列として取得するには ob_start() を入れ子にすれば OK です。

ob_start();
get_calendar();
$output = ob_get_contents();
ob_end_clean();

これで get_calendar() で出力されているすべてを手に入れることができます。征服欲が満たされましたね、良かったです。

記事のある日付を取得する

get_calendar() で得られる html のマークアップ文字列では記事の存在する日付に a タグで日付別アーカイブへのリンクが付加されています。まずそのリンクから日付を取得して、次にその日付に投稿された記事を取得することにしましょう。

if(preg_match_all('@<td><a href="' . get_option('home') . '/(\?m=)?([^"]*?)" title="[^"]*?">([0-9]+?)</a>@i', $output, $matches)){
  foreach($matches[0] as $key => $match){
    $date  = preg_replace('@/@', '', $matches[2][$key]);
    $year  = substr($date, 0, 4);   // 年
    $month = substr($date, 4, 2); // 月
    $day   = substr($date, 6, 2);   // 日
    /* do stuff */
  }
}

preg_match_all() のパターンは、前後月へのリンクを拾わない,パーマリンクがデフォルト/%postname% のいずれでも OK、なように気配りします。title 周りは検証の名残コードなので気にしないこと。これで記事のある年月日すべてについて処理ができるようになりました。

当該日付の記事を取得する

ついでにカテゴリーも指定できるようになってると嬉しいだろうな、と使う人の喜ぶ姿を妄想しながらコードを書きます。

global $wpdb;
  $posts = $wpdb->get_results("
    SELECT ID, post_title 
    FROM $wpdb->posts 
      INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
      INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
    WHERE YEAR(post_date) = '$year' 
      AND MONTH(post_date) = '$month' 
      AND DAY(post_date) = '$day' 
      AND post_type = 'post' AND post_status = 'publish' 
      AND $wpdb->term_taxonomy.taxonomy = 'category' 
      AND $wpdb->term_taxonomy.term_id IN (123,456)  
      ORDER BY post_date DESC
");

段々長くなってくると get_calendar() 使わんでもという気になってきますが、イジルのが目的なのを忘れないように。初志貫徹です。カテゴリーの指定に term_taxonomy.term_id IN を使ってますので、複数カテゴリーを指定したい場合は上記コードのようにカテゴリー ID をコンマで区切ります。1生1カテゴリーを貫くなら IN じゃなくて = (イコール)での指定で良いです。

記事のリンクを追加する

さらに日付別アーカイブのリンクには消えてもらいましょう。

$link = '';
foreach($posts as $post)
  $link .= '<a class="post" href="'. get_permalink($post->ID) . '">' . $post->post_title . '';

if($link)
  $output = preg_replace('@' . preg_quote($match) . '@', '<td class="event">' . $day . $link, $output); 
else
  $output = preg_replace('@' . preg_quote($match) . '@', '<td>' . $day, $output); 

イベントのある日の td タグにクラス名を付けると css でのお楽しみが増えます。

スタイルを指定する

get_calendar() が出力するカレンダーの ID は wp-calendar なので、styles.css で以下のように指定すると上記のデモカレンダーみたいな仕上がりになります。

#wp-calendar{width:auto;}
#wp-calendar caption{
text-align:center;
width:auto;
}
#wp-calendar th{
background-color:#333;
border:1px solid #231F1D;
font-style:normal;
height:2.5em;
text-align:center;
width:85px;
}
#wp-calendar td{
color:#444;
background-color:#1D1A18;
border:1px solid #231F1D;
height:auto;
padding:3px;
text-align:center;
vertical-align:top;
font-size:36px;
font-family:Georgia, "Times New Roman", Times, serif;
font-style:italic;
}
#wp-calendar td.event{color:#888;}
#wp-calendar td a{
display:block;
font-size:12px;
font-style:normal;
margin:.5em 0;
text-align:left;
}
#wp-calendar td.pad{background-color:transparent;} // カレンダー上で日付がない箇所
#wp-calendar tfoot{display:none;} // 前後月へのリンク

wp-calendar という ID を変えたいなら $output = preg_replace('@#wp-calendar@', '#my-calendar', $output); とかなんとかしておきましょう。

前後月へのリンクに対応する

2010.3.2 追加

ご要望があったので前後月へのリンクに対応しました。今後このようなご要望がございましたら お問い合わせ からこっそりオネダリしていただくと、1案件10,500円でアッちゅーまにお望みを叶えるのでそういうことでよろしく頼むぜ。領収書も出ますのでね。と、営業もできる kz でした。
オリジナルなカレンダーでは、前後月へのリンクは月別アーカイブのパーマリンクになっています。そこをなんとかカレンダーの月を移動させるために、前後月へのリンクを「 http://example.com/カレンダーのあるページ/?ym=201001」のようにカレンダーのあるページのパーマリンクに ?ym= とかなんとかで所望の年月を与えてやることにします。で、my_get_calendar() 内で $_GET['ym'] が設定されていればそれを採用するようにします。

// $_GET['ym'] があれば前後月リンクからお越しなのでそれを採用する
$m = isset($_GET['ym']) ? $_GET['ym'] : $yearmonth; 
 
// http://example.com/?m=201001 や http://example.com/201001 の月別アーカイブリンクを
//   http://example.com/event-calendar/?ym=201001 の形式に変更する  
// 前後月リンクは td に next, prev の ID が付加されているのでそれを利用する
if(preg_match_all(
  '@<td( id="[prev|next]")?[^>]*?><a href="(' . get_option('home') . '/)(\?m=)?([^"]*?)" title="[^"]*?">[^<]+?</a>@i', 
  $output, $matches)){
  foreach($matches[0] as $key => $match){
    $ym  = preg_replace('@/@', '', $matches[4][$key]);
    $output = preg_replace(
      '@' . preg_quote($matches[2][$key]) . preg_quote($matches[3][$key]) . preg_quote($matches[4][$key]) . '@',   
      get_permalink() . '/?ym=' . $ym, 
      $output
    ); 
  }
}

できてしまえば簡単なことでしたね。preg_なんとか辺りはもっとエレガントなやり方を募集中です。えびちゃんからのみ受け付けます。

CONCLUSION

functions.php

function my_get_calendar($yearmonth = ''){
  global $m;
  $m = isset($_GET['ym']) ? $_GET['ym'] : $yearmonth;  //  前後月リンク対応
  // $m = $yearmonth; // 'YYYYMM' の書式でカレンダーの年月を指定
  
  ob_start();
  get_calendar();
  $output = ob_get_contents();
  ob_end_clean();

  if(preg_match_all(
    '@<td( id="today")?><a href="' . get_option('home') . '/(\?m=)?([^"]*?)" title="[^"]*?">([0-9]+?)</a>@i', 
    $output, $matches)){
    foreach($matches[0] as $key => $match){
      $date  = preg_replace('@/@', '', $matches[3][$key]);
      $year  = substr($date, 0, 4);
      $month = substr($date, 4, 2);
      $day   = substr($date, 6, 2);
	  
      global $wpdb;
      $posts = $wpdb->get_results("
        SELECT ID, post_title 
        FROM $wpdb->posts 
          INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
          INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
          WHERE YEAR(post_date) = '$year' 
            AND MONTH(post_date) = '$month' 
            AND DAY(post_date) = '$day' 
            AND post_type = 'post' AND post_status = 'publish' 
            AND $wpdb->term_taxonomy.taxonomy = 'category' 
            AND $wpdb->term_taxonomy.term_id IN (123,456) 
          ORDER BY post_date DESC"
      );

      $link = '';
      foreach($posts as $post){ 
        $cats = get_the_category($post->ID);  // カテゴリースラッグをクラス名に追加する
        $cat = $cats[0];
        $thumb = '';
        if ( has_post_thumbnail( $post->ID ) ) {
          $thumb = get_the_post_thumbnail( $post->ID, array( 24, 24 ) );
        }
        $link .= sprintf(
          '<a class="post %1$s" href="%2$s">%3$s%4$s</a>',
          $cat->category_nicename,
          get_permalink( $post ),
          $thumb,
          $post->post_title
        );
      }

      if($link)
        $output = preg_replace('@' . preg_quote($match) . '@', '<td class="event">' . $matches[4][$key] . $link, $output); 
      else
        $output = preg_replace('@' . preg_quote($match) . '@', '<td>' . $matches[4][$key], $output); 
    }
  }

  //  前後月リンク対応
  if(preg_match_all(
    '@<td( id="[prev|next]")?[^>]*?><a href="(' . get_option('home') . '/)(\?m=)?([^"]*?)" title="[^"]*?">[^<]+?</a>@i', 
    $output, $matches)){
    foreach($matches[0] as $key => $match){
      $ym  = preg_replace('@/@', '', $matches[4][$key]);
      $output = preg_replace(
        '@' . preg_quote($matches[2][$key]) . preg_quote($matches[3][$key]) . preg_quote($matches[4][$key]) . '@',   
        get_permalink() . '/?ym=' . $ym, 
        $output
      ); 
    }
  }  
  return $output;
}

今日の日付に投稿があると td タグに id="today" が付いて困ってしまう場合に対応したぜ。

前後月リンクでカレンダー月移動に対応したぜ。

投稿タイトルのアンカータグにカテゴリースラッグをクラス名として追加したぜ。

アイキャッチ画像に対応したぜ多分。

カレンダーを出力したい箇所で echo my_get_calendar(); と書きます。年月を指定するなら echo my_get_calendar('201001'); てな感じで OK。
記事内のショートコードで使いたい場合は functions.php に以下を追加して、

function sc_get_calendar($atts, $cont) {
  extract(shortcode_atts(array(
    'm' => ''
  ), $atts));

  return my_get_calendar($m);
}
add_shortcode('get_calendar', 'sc_get_calendar');

投稿内で [get_calendar] とか [get_calendar m='201001'] とか書けば OKOK。

動作確認バージョン
  • WordPress 2.9.1
参照

102 Comments

  • BLOG: WordPressでイベントカレンダー http://bit.ly/aSFw4L

  • WordPressでイベントカレンダー をグリグリ作るサンプル

  • WordPressでイベントカレンダー をグリグリ作るサンプル

  • maki_ayaya maki_ayaya

    上記のカレンダーを試したのですが、カレンダーしか表示されませんでした。
    参照サイトにある方を試しましたら、日付がリンクされましたが、こちらのページのようにタイトルが表示され、リンクされる形式ではありませんでした。
    当方、WordPress2.9.2です。

  • kz kz

    リンクされた記事タイトルが1件も表示されない場合:以下を確認。
    functions.php 内の AND $wpdb->term_taxonomy.term_id IN (123,456) の
    123,456 は表示したいカテゴリーIDを指定する。

    そういう話じゃないよ、ということでしたら再度その旨お知らせください。

  • maki_ayaya maki_ayaya

    はい、カテゴリーIDを変更しましたが、はじめにご説明したような現象になりました。

  • kz kz

    あ。エスケープ忘れで a 閉じタグが表示されてなかったです。

    ■誤
    $link .= ‘<a class=”post” href=”‘. get_permalink($post->ID) . ‘”>’ . $post->post_title . ”;

    ■正
    $link .= ‘<a class=”post” href=”‘. get_permalink($post->ID) . ‘”>’ . $post->post_title . ‘</a>’;

    こちらをお試しください。

  • maki_ayaya maki_ayaya

    早速試したのですが、現象は同じでした。
    PHP側に  のように書いたのですが、これがいけないのでしょうか。

    • maki_ayaya maki_ayaya

      すみません、上の投稿のコードは下記のとおりです。
      <? echo my_get_calendar(); ?>

  • kz kz

    それはOKです。
    表示したページのソース(html)のカレンダー日付部分には
    <td class=”event”>24
    <a href=”http://example.com/post-slug” class=”post”>投稿のタイトル</a>
    </td>
    <td>25</td>
    のような a タグは、投稿が存在するにも関わらず一切出力されていない、ですか?

    どうにもお困りなら「お問い合わせ」から当該URLをお知らせいただくと良いかもです。
    maki_ayaya さん側で問題が無いなら kz 用編集アカウントを一時的に作成していただくとより解決が早いです。多くの方にお喜びいただいてますのでご安心ください。

  • maki_ayaya maki_ayaya

    kz 用編集アカウントとはWordPressの管理者権限のユーザー設定の事でしょうか。

  • kz kz

    はい、テーマの編集権限が必要なので「管理者」権限でのユーザ追加になります。

    それが難しいようでしたら
    functions.php, single.php(echo my_get_calendar();を書いているファイル)
    の内容を http://wordpress.pastebin.ca/ に投稿して URL をお知らせいただく方法もあります。

  • kz kz

    皆様へ報告:
    タイトルが表示されないのは、日付アーカイブのパーマリンクがマッチしない形式だからでした。オリジナルなパーマリンク構造をご使用の場合は、
    my_get_calendar() 内の \?m= をアナタ色にマッチするように変更してください。

  • maki_ayaya maki_ayaya

    この度はイベントカレンダーで大変お世話になりました。
    ひとつご報告がございます。
    投稿したデータが当日の場合、カレンダーのソースが id=today となり、記事タイトルが表示されなくなり、日付にリンクが付いてしまいます。
    そのような仕様ならいいのですが、他の日付同様に記事タイトルでリンクになった方がいいかと思うのですが。
    ご検討いただけますと、幸いです。

  • kz kz

    本日付けの投稿がある場合、向けにコードを変更しました。
    マッチパターンに ( id=”today”)? が付いたのと
    それにより各 $matches のカッコ内数値が +1 されてます。

  • maki_ayaya maki_ayaya

    早速のご対応ありがとうございました。

  • maki_ayaya maki_ayaya

    この間は、イベントカレンダーでお世話になりました。
    月が変わり、カレンダーの下部に2月のリンクが現れ、それをクリックすると、カレンダー形式ではなく、全カテゴリーの2010年2月分のアーカイブが表示されました。
    functions.phpにて特定のカテゴリーを設定していますので、前月もそのカテゴリーだけ表示するか、または当月と同じカレンダー形式を表示させることは可能でしょうか。
    もし可能なら、後者のカレンダー掲載がベストです。
    お手数をおかけしますが、ご検討いただけましたら幸いです。

  • kz kz

    前月のカレンダーは利用価値が無いので
    #wp-calendar tfoot{display:none;}
    としてリンクを非表示にしています。
    「前月もそのカテゴリーだけ表示」「当月と同じカレンダー形式」の
    内容がつかめないので噛み砕いていただけると良いかもです。
    ※当月も「そのカテゴリーだけ表示」なので違いが不明なため。

    リンク有りにして月を移動する、なら、表示しているページは同じでリンクを
    http://example.com/cal?ym=201002
    の形式にして、カレンダー表示時に ym の値を引数に使う、仕組みになります。

  • maki_ayaya maki_ayaya

    分かりづらい説明ですみません。

    kzさんの言われている通り、「リンク有りにして月を移動」です。
    今月の例で言うと先月の2月をクリックすると、カレンダー形式(echo my_get_calendar(’201002′);と指定した時に出るカレンダー表示)が現れるようなイメージです。
    よろしくお願いします。

  • kz kz

    前後月リンク対応完了。

  • maki_ayaya maki_ayaya

    この度は大変お手数をお掛けしております。
    修正後のfunctions.phpを上書きしましたら、

    Fatal error: Allowed memory size of 94371840 bytes exhausted (tried to allocate 146102396 bytes) in /○○○○/wp-content/themes/○○○○/functions.php on line 77

    のエラーでした。
    エラー箇所は、追加いただいた「前後月リンク対応」の$outputの下にある「 );」です。
    当方、パーマリンクの関係で(\?m=)のところを(archives/date/)にしているせいでしょうか。
    お手数をお掛けいたします。

  • maki_ayaya maki_ayaya

    度々失礼します。
    このページの「前後月へのリンクに対応する」の2010.3.2 追加を読んで自己解決いたしました。
    // 前後月リンク対応 以降をfunctions.phpではなく、「2010.3.2 追加」に書かれているものを参照しましたら、ちゃんと表示できました。
    この度は大変お手数をお掛けいたしました。
    ありがとうございます。

    • kz kz

      すばらしい。その意気でがんばってください。

  • kz kz

    エスケープ忘れでコードが変になっていたので「CONCLUSION」セクションを丸コピペだけだとダメかもでした。エスケープ済の「前後月へのリンクに対応する」セクションとコードが違っていたので、こいつミスってやがるな、とお気づきいただく方向だとサイト運営のモチベーション的に有り難いです。

    そんなわけで、オリジナルなパーマリンクなど、各々の諸事情は各々でよきにはからっていただくと抜け毛が減って助かります。

  • MONK MONK

    my_get_calendar() 内の \?m= をアナタ色にマッチするように変更してください。とのことですが、具体的にどのように記述したら良いか教えて頂けると嬉しいです。

    パーマリンク構造は以下を指定しております。
    /%year%/%post_id%.html

    宜しくお願いします。

    • kz kz

      WordPressオリジナルのカレンダーでは、実際の日別アーカイブのリンクはどうなってますか?

  • nobi nobi

    はじめまして。
    いつも記事を見て勉強させてもらっています。
    こちらのページのカレンダーを参考にさせていただいて予定表として使用しようと思っています。
    予約投稿も表示させたいと思っているのですが、コアの部分はあまりいじりたくないと思っていまして何かやり方があれば教えていただきたいと思っているのですが、何かございますでしょうか?

    • kz kz

      1.コアの get_calendar() をまるっとコピー。
      2.my_future_calendar() とかの名前で functions.php にペースト。
      3.post_status = ‘publish’ となっている箇所を
       post_status = ‘future’ に変更。
      4.my_get_calendar() 内の get_calendar() を my_future_calendar() に変更。
      でイケる気がします。公開済み&予約投稿なら 3.を
      (post_status = ‘publish’ OR post_status = ‘future’)
      のようにします。がんばってください!

  • nobi nobi

    遅くなってしまってすみません。
    ご返信ありがとうございます。早速試してみます。

  • はじめましてフォーラムではチョクチョクおせわになってるkazudartsです
    いつもありがとうございます。
    月間のイベントカレンダーをと思い縦型のイベントカレンダーを探していたのですが
    日付しか表示されないものばかりで
    しょうがないので自分で作成したのですがphpの知識が
    次の月の取得をincludeするパスにの通りほとんどありません
    で作ったのが少しは楽になるように自動で表示されるように考えた末に以下のように一日分を
    日数分繰り返すと結うことですが

    <div class="schedule_”>

    <?php /* 01日の記事で囲む*/ ?>

     
     

     

    これとKZさんの上のやつは組み合わせ可能なのでしょうか
    的外れわわかっていますが・・・

    組み合わせしないまでも
    上記を日数分ループさせてその日のカテゴリーの投稿を表示させると結うことは
    phpだけで可能でしょうか?
    よろしくお願いします

    • kz kz

      縦長だったらコレを整形するより始めから作った方が早いですね。
      ※ブログのコメント欄では <(半角)で始まるタグは削除されますので
       全角で書くと良いです。

  • >整形するより始めから作った方が早いですね
    了解しました頑張ってみます^^
    いきず待ったらよろしくおねがいします

  • メモ書き。WordPressでイベントカレンダー。http://wpxtreme.jp/event-calendar-with-wordpress

  • WordPressに連動させたカレンダーの表示。

  • mst mst

    はじめまして。
    とても便利で利用させていただいております。
    この度、予約投稿も反映させたいと思い、
    kzさんの2010.4.14の記事のとおりやってみたのですが、
    うまくいかないので質問させてください〜

    3.のpost_status = ‘future’に変更するのは
    my_get_calendar()
    my_future_calendar()
    2つの関数に記述されている全ての
    post_status = ‘publish’でよろしいでしょうか?

    すみません、よろしくお願いします。

    • kz kz

      未確認)
      予約投稿「も」だと
      post_status IN (‘publish’, ‘future’)
      かな、と。

  • Jonio Jonio

    はじめまして。このページを参考にしてイベントカレンダーを作成しています。

    複数のカテゴリーの記事をこのカレンダーに表示させるようにしているのですが、タイトルの前に各カテゴリのアイコンを表示させようとしています。
    そこで各記事の所属するカテゴリースラッグを取得したいのですが、どのようにすれば取得できるでしょうか?
    申し訳ありませんがご教授いただけないでしょうか。
    よろしくお願いします。

    • kz kz

      conclusion のコードに追加しましたのでお好みでアレンジしてみてください。
      ・カテゴリースラッグを取得してアンカータグのクラス名として追加。

  • Jonio Jonio

    コード修正ありがとうございます。

    やりたかった事ができました!
    どうしてもループがうまく出来なかった原因がforeachの{}にあったとは…
    考えれば当たり前の事ですが本当に助かりました。
    ありがとうございました。

  • どうもありがとうございます。
    このページを参考にして、gigs-calendarプラグインに対応する
    カレンダを作れました。
    2010.4.14のコメントを見させていただいて、
    作成できました。
    (ちなみにgigs-calendarの記事(post)は、未来の時刻で
    publishしていて、get_calendarでは未来の時刻のものは
    表示できてなかったですが、get_calendar内部で
    current_time(‘mysql’)と比較している個所があり、コピーし
    get_future_calendarとした関数でここの部分を取ってやると
    すんなり表示できました)
    ありがとうございました~

  • WordPress ではウィジェットや get_calendar タグ/ファンクションを使って、ブログによくある投稿カレンダーを出力することができます。カレンダーの日付のリンク先は日付別アーカイブとなっているのですが、カレンダーの日付枠内に記事のタイトルを表示したいという要望がよくあります。巷ではイベントカレンダーと呼ばれるニーズですね。 そのようなことを実現するプラグインはありますが、他人のルールで作られたものは敬遠したいという方のために get_calendar をいじくる方法をご紹介します。さらにカレンダーに表示する記事はカテゴリーで指定できるようにします。

  • mindg mindg

    このページの記事を参考にさせてもらっております。
    予約投稿「も」表示させたいのですが、

    > 未確認)
    > 予約投稿「も」だと
    > post_status IN (‘publish’, ‘future’)
    > かな、と。

    では動作しませんでした。
    試しに予約投稿だけでも、と思い

    post_status =‘future’

    としてみましたが、これも動作しませんでした。
    アドバイスお願い致します。

  • mindg mindg

    解決しました。
    みみすけ氏のコメントがヒントになりました。
    current_time(‘mysql’)の比較部分を「行で」取り除いてしまうと
    エラーが出て悩んでおりました。
    単に「current_time(‘mysql’)のみ」削除して無事表示出来ました。
    お騒がせしました。

    そして、このページの情報は大変役立ちました。
    ありがとうございます!

    • kz kz

      おぉぉ!良かったです。皆さん素晴らしい◎

  • RT @kzxtreme WordPressでイベントカレンダー http://bit.ly/bkynry

  • @csHirokawaz まぁ一覧表示できたらええのでhttp://j.mp/cx07EAええかと思ったけど投稿日と開催日が違うのでプラグイン系になりそう。まぁ他にええシステムあればそっち使うのもありだけど今のとこWPで行くのが楽かなとも。

  • Konno Konno

    もう…ダメです…ヒントください…

    3.0で利用できますか?!

    • kz kz

      3.0でも OK ですよ◎
      ってこれだけでいいんですか?笑

    • Konno Konno

      やってみる
      できない
      パーマリンクか!?
      BuddyPressなのが問題?
      まさか3.0
      3.0でもOKなんだ!←イマココ

      >ってこれだけでいいんですか?笑
      もうひとつだけ…!
      何か3.0用に修正する部分がありますか?

    • kz kz

      2.9.1から3.0.1まで何もしなくても動作してますのでこのままでOK!
      過去に皆様からお問い合わせいただいた
      「できない原因」はすべてパーマリンク絡みでしたー。
      お問い合わせからコッソリURLをお知らせいただいたり
      さらにコードを送っていただいたりすると話が早いです◎

  • WordPressイベントカレンダー

  • pan pan

    このページを参考に今イベントカレンダーを作成させていただいています。
    前後月リンクと、予告投稿のところがどうしてもうまくいかず悩んでおります。

    サイトアドレス:http://example.jp/test/schedule
    パーマリンク:デフォルト(これはなんでもかまいません)
    index.php:を記述
    ※他のテンプレートはまだ何も触っていません

    上記のように設定したのですが、前後月リンクのリンクURLが
    http://example.jp/test/schedule/?p=1/?ym=201010
    となってしまいます。

    <a href="(' . get_option('home') . '/)(\?m=)

    <a href="(' . '/)(\?m=)
    としてみると、
    http://example.jp/test/schedule/?ym=201010
    にはなるのですが、このやり方があっているようにも思えませんし、
    リンク先に飛んでもアーカイブページに飛んでしまいます。

    どうかアドバイスいただけないでしょうか。

  • pan pan

    すみません。
    php部分が消えてしまったのでもう一度‥
    index.php:echo my_get_calendar();を記述

  • WordPressでイベントカレンダー  |  wpxtreme: WordPressでイベントカレンダー  |  wpxtremeデモカレンダー※ wpxtreme.jp / 2010年1月 / TUTORIAL カテゴリ… http://bit.ly/9vgQeE

  • pan pan

    何度も何度もすみません。
    自己解決いたしました!
    ——————————————–
    修正前)get_permalink() . ‘/?ym=’ . $ym,
    修正後)’/?ym=’ . $ym,
    ——————————————–
    get_permalink()を消したら動きました!
    ありがとうございました~!

    • kz kz

      おおお!解決して良かったです。ほったらかしでごめんなさい。
      パーマリンク絡みを改善しないとアレですねー

  • 大塚 大塚

    はじめまして。
    大塚と申します。

    サイト拝見して参考にさせていただいております。

    ひとつお尋ねしたいことがあります。

    使用しているバージョンは3.0.1です。

    http://wpxtreme.jp/event-calendar-with-wordpress
    のページに記述されている

    【get_calendar を利用する】
    wp-includes/general-template.php 956行目〜 get_calendar()(抜粋)

    :
    ob_start();
    :
    $output = ob_get_contents();
    ob_end_clean();
    echo $output;
    :

    が、上記のファイル内、そして他ファイル内すべてに見つかりませんでした。

    3.0.1でも同じファイル内の同じような記述になるはずですか?

    お忙しいとは思いますが、ご教示いただけると幸いです。

    もし必要であれば、3.0.1のwp-includes/general-template.phpファイルだけ
    メールか何かに添付してお送りします。

    それでは、宜しくお願いします。

    大塚

    • 大塚 大塚

      ごめんなさい。
      先ほどご連絡した者です。

      CONCLUSIONの
      functions.phpをコピペしていたので、その中に含まれていたんですね。
      気付きませんでした。

      再度検索をかけたら、先ほどコピペしたファイル内にあったので今さら気付きました(苦笑)。

      ですが、依然カレンダーに記事が表示されないのです。
      term_taxonomy.term_id IN (1,2,3,4,5)
      で投稿カテゴリーのIDも指定しています。

      他に原因があり得るとすれば何かありますでしょうか?

      お時間ある時にでも、宜しくお願いします。

  • 大塚 大塚

    自己解決できました。
    パーマリンクの設定の問題でした。

    お騒がせしました。

    • kz kz

      またもやほったらかしでごめんなさいぃぃ。パーマリンクは鬼門です。何とかしてみようっと◎

  • otk otk

    未来の日付の投稿をカレンダーに表示させることが出来ずに悩んでいます。

    バージョンは、3.0.1 と、 2.8.6 両方とも試してみています。

    このページのすべてのコメントを参考に、色々試行錯誤してみましたが、どうにもこうにも解決できません・・・。

    =======================

    みみすけ氏のコメントがヒントになりました。
    current_time(‘mysql’)の比較部分を「行で」取り除いてしまうと
    エラーが出て悩んでおりました。
    単に「current_time(‘mysql’)のみ」削除して無事表示出来ました。
    お騒がせしました。

    =======================

    (ちなみにgigs-calendarの記事(post)は、未来の時刻で
    publishしていて、get_calendarでは未来の時刻のものは
    表示できてなかったですが、get_calendar内部で
    current_time(‘mysql’)と比較している個所があり、コピーし
    get_future_calendarとした関数でここの部分を取ってやると
    すんなり表示できました)

    =======================

    1.コアの get_calendar() をまるっとコピー。
    2.my_future_calendar() とかの名前で functions.php にペースト。
    3.post_status = ‘publish’ となっている箇所を
     post_status = ‘future’ に変更。
    4.my_get_calendar() 内の get_calendar() を my_future_calendar() に変更。
    でイケる気がします。公開済み&予約投稿なら 3.を
    (post_status = ‘publish’ OR post_status = ‘future’)
    のようにします。がんばってください!

    =======================

    current_time(‘mysql’) という表記のあるファイルはいくつか見つかったのですが、get_calendar関連のものがありませんでした。

    どのファイルのどのあたりでしょうか?

    また、「コアの get_calendar()」とは、どのファイル内のことでしょうか?

    宜しくお願いします。

    • kz kz

      ※行は 3.0.1 の場合です。

      >「コアの get_calendar()」とは、
      wp-includes/general-template.php の1061行目から始まる get_calendar() です。

      current_time(‘mysql’) は以下のように削除しちゃえば OK!

      1185行目:AND post_date < ‘” . current_time(‘mysql’) . ‘\”, ARRAY_N);

      , ARRAY_N);
      に変更。

      1204行目:.”AND post_date < ‘”.current_time(‘mysql’).”‘ ”
      は行をまるっと削除。

  • 以前から「WPでイベントカレンダーが欲しい」と思っていたところ、プラグインでは妥当なものが無くこちらにたどり着きました。
    素晴らしい!の一言です。
    未来投稿について、no future postsのカレンダーパッチに気づかずたいへん手間取りましたが、やっと無事に動き始めました。
    土日の色づけ、投稿日の色づけ、未来投稿等、改変して使わせていただいております。
    感謝をお伝えしたく、コメントにて失礼いたします。

    • kz kz

      お役に立てて良かったです!今年もWordPressを使い倒しましょう◎

  • いつもこちらのサイトを参考にさせていただています。ありがとうございます。

    今回、WP標準のカレンダーではなく、カテゴリ限定、直接記事へのリンクにということで、またこちらを利用させていただきましたが、ページ内の前月・次月のカレンダー表示がうまくいきません。

    例えば、

    http://kzn.heteml.jp/ryo/prius/2010/12/diary/557/

    のカレンダー表示で「« 11月」のリンク部分が、

    http://kzn.heteml.jp/ryo/prius/2010/12/diary/557/?ym=201011

    となりますが、クリックしてもカレンダー表示が切り替わりません。

    パーマリンクの設定は、「/%year%/%monthnum%/%category%/%post_id%/」で、sidebar.phpでの呼び出しは「echo my_get_calendar($ym);」としてあります。

    どこが間違っているか、ご教授ください。お願いします。

  • kz kz

    http://kzn.heteml.jp/ryo/prius/2010/12/diary/557?ym=201011
    ※?の前の/が無いリンクです。
    これで11月のカレンダーが表示されるなら
    /(\?m=)
    の部分の/を削除して
    (\?m=)
    にしてみてください。

    • お手数お掛けしてます。m(_ _)m

      パーマリンクの設定を「/%year%/%monthnum%/%category%/%post_id%」して試してみましたが、ダメです。

      ちなみにfunctions.phpにコピーしたコード、?m=の前にあるの¥マーク(2箇所)がバックスラッシュになってますが、これが問題ないですか?

    • kz kz

      とりあえず
      echo my_get_calendar($ym);
      の後に
      echo ‘ym=(‘ . $_GET['ym'] . ‘)’;
      と追加して「ym=(201011)」と表示されるか確認するとか、

      追加した my_get_calendar() が上から4行が
      function my_get_calendar($yearmonth = ”){
      global $m;
      $m = isset($_GET['ym']) ? $_GET['ym'] : $yearmonth; // 前後月リンク対応
      // $m = $yearmonth; // ‘YYYYMM’ の書式でカレンダーの年月を指定
      となってるかよぉく確認するとか、

      はどうでしょう。

      どうにもできんからやってくれ!って場合は、kz用の管理アカウントを作成してコンタクトフォームからコッソリお知らせください。

      バックスラッシュは ?m= の直前に1個だけです◎

  • カレンダープラグイン

  • カレンダー出力をゴリゴリ改造。 $wpdb->get_results()の参考例。

  • WordPressでイベントカレンダー  |  wpxtreme: カレンダー出力をゴリゴリ改造。 $wpdb->get_results()の参考例。 http://bit.ly/fjgBpD

  • get_calendarの挙動を変更する

  • これで get_calendar() で出力されているすべてを手に入れることができます。征服欲が満たされましたね、良かったです。

  • WordPressでイベントカレンダー  |  wpxtreme http://htn.to/BMLdMS

  • kota kota

    はじめまして!
    最近よくこちらのサイトを参考にさせていただています。
    いつもありがとうございます!!

    最近WPでの案件を請け負うようになったのですが、今回イベントカレンダーを組み込まなくてはならず、探していたところ、とても素晴らしいカレンダーで助かっています!!

    ちょっと自分なりに、タイトルの箇所に当該記事のサムネイル(アイキャッチ)画像を出すようにカスタマイズしたいのですが、どうもチンプンカンプンでお手上げ状態です!
    そもそもそういったことは可能なんでしょうか?

    調べに調べ
    SELECT ID, post_title
    の箇所をサムネイル呼び出ししたりと試しましたが、結局うまく行かず・・・・。
    ほんと素人すぎてすいません・・・。

    どうかご助力ねがえませんでしょうか??

    • kz kz

      未検証ですがアイキャッチ画像をつけ足してみました!お試しください◎

  • ちんぷい ちんぷい

    タイトルが表示されず、日付にリンクがはられます。

    パーマリンクは
    /%category%/%postname%/
    にしております。
    \?m=
    をどう変更すれば良いのでしょうか?

    WordPressオリジナルのカレンダーでは、実際の日別アーカイブのリンクはどうなってますか?
    URL/カテゴリ名/タイトル/
    です。

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

    • kz kz

      あけまして!
      日付にリンク、ということは多分このカスタマイズが実行されていません。
      何かうっかりミスがないか確認してみてください!

  • @toshiyuki83 @tommitucker WPでイベントカレンダー作るときいつもget_calender利用してるんですが、いろいろカスタマイズしやすいですよ(*´∀`)!! http://t.co/buFvda3p

  • [*wordpress][カレンダー] / “WordPressでイベントカレンダー  |  wpxtreme” http://t.co/7MHVpQl1

  • “WordPressでイベントカレンダー  |  wpxtreme” http://t.co/oOO0hyMS

  • 本題とは関係ない所でウケて申し訳ないけど『…世も勝者のキーワードは「親しみやすさ」です。』のくだりがもっともすぎw http://t.co/SmAoPZ75

  • WordPressでイベントカレンダー http://t.co/ZyaCqThY

  • WordPress

  • 読んでる WordPressでイベントカレンダーhttp://t.co/SJYi1xGx

  • get_calenderの挙動を変更する

  • wordpress,get_calenderの挙動を変更する。WPのカレンダー表示のノウハウ

  • 自分でCalendar作ってイベント管理したほうが楽そう。

  • wordpressでカレンダーをほぼ自作する方法。お仕事で使う予定。

  • たく たく

    はじめまして!
    色々とカレンダーを探していて、こちらの記事にたどり着きました。
    やりたいことはほぼ実装できそうなのですが、最初の表示のところでつまずいております。。。
    function.phpにCONCLUSIONのコードを追加し、echo my_get_calendar();を記述しましたが、そのままecho my_get_calendar();と表示されるだけです。
    初歩的なところで申し訳ございませんが、ぜひご教授頂ければと思います。
    よろしくお願いいたします。

    • kz kz

      こんにちは! echo my_get_calendar(); は PHP のコードなので <?php echo my_get_calendar(); ?> のように <?php と ?> の中に記述する必要があります。

  • たく たく

    早々にありがとうございます!
    基本の基本みたいなところで申し訳ありませんでした。
    ありがとうございます!

  • yam yam

    ちょうど、欲しかったアウトプットなのですが、
    未だ実装ができておりません。。

    カレンダーは表示されますが、
    日付にもリンクが表示されていないような状態です。

    記事のタイトルと、アイキャッチ画像が表示できていないのですが、
    結局のところ、general-template.php はどのように修正しないといけないのでしょうか?

    また、CONCLUSION の コードを functions.php へまるっとコピーするのみでOKなのでしょうか?

  • hoho hoho

    こんにちは。

    投稿ではなく、カスタム投稿(event)のみを表示させることは可能でしょうか?
    WordPress 3.5.1です。

    ‘post’部分を’event’に変更してみたのですが、表示されません。

    • kz kz

      取得&表示だけなら「‘post’部分を’event’に変更」だけで良いです。
      カテゴリ関連は不要でしたら、記事内のコードから削除する必要があります。
      取得&表示ができたら次はリンクの問題が発生すると思われます。

  • DoMo DoMo

    始めまして。
    私は最近wordpressはもとより、HTMLなどを独学で学び始めたばかりです。
    皆さんとはレベルも違いすぎて恐縮なのですが、勇気をだしてコメント(質問)させて頂きます。

    ①【functions.php】にご紹介されている上記に説明されているような追記をしました。

    ②カレンダーを表示させたい固定ページに

    を表記しました。
    結果、カレンダーは表示されました。しかし私が意図しない事が2つ表れました。

    一つ目は、tfootに【先月】【翌月】が表示されてません。
    二つ目は、記事が投稿された日のリンク先が、投稿詳細ページではないこと。

    この二つを解決したいのですが、私みたいな素人にお教え頂けないでしょうか?
    ちなみにWordpressのバージョンは3.5です。