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

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

ただいまの
回答率

87.37%

スタムフィールドのイベントカレンダーを表示させたいです。

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 746

score 8

前提・実現したいこと

初めまして、wordpress初心者です。
カスタム投稿とカスタムフィールドを使い
カレンダーのようなものを表示させようと考えているのですが
カレンダーを表示することはできたのですが、
カスタムフィールドの値を取得してくれません。

カスタム投稿「 Custom Post Type UI 」
カスタムフィールド 「 Advanced Custom Fields 」

post type: event
meta_key: eventday

もとのサイトから引用させていただきました。

https://memo.ark-under.net/memo/718

ご教授頂けますと幸いです。

functions.php

function my_event_calendar($year = "", $month = "", $eventArray) {
  if(empty($year) && empty($month)) {
      $year = date("Y");
      $month = date("n");
  }
  //月末の取得
  $l_day = date("j", mktime(0, 0, 0, $month + 1, 0, $year));
  //祝日の取得
  $holidays = getHolidays($year);
  //初期出力
  $tmp = <<<EOM
<table class="calendar">
  <caption>{$year}{$month}月</caption>
  <tr>
      <th class="sun">日</th>
      <th>月</th>
      <th>火</th>
      <th>水</th>
      <th>木</th>
      <th>金</th>
      <th class="sat">土</th>
  </tr>\n
EOM;
  $lc = 0;
  //月末分繰り返す
  for ($i = 1; $i < $l_day + 1;$i++) {
      //曜日の取得
      $week = date("w", mktime(0, 0, 0, $month, $i, $year));
      if($i<10){
          $holinum = $year.'-'.$month.'-0'.$i;
      }else{
          $holinum = $year.'-'.$month.'-'.$i;
      }
      $holiday = agv($holidays, $holinum);

      //曜日が日曜日の場合
      if ($week == 0) {
          $tmp .= "\t<tr>\n";
          $lc++;
      }
      //1日の場合
      if ($i == 1) {
          if($week != 0) {
              $tmp .= "\t<tr>\n";
              $lc++;
          }
          $tmp .= repeat($week);
      }
      if ($i == date("j") && $year == date("Y") && $month == date("n")) {
          //現在の日付の場合
          $tmp .= "\t\t".'<td class="today">'.$i;
          if($holiday){$tmp .= '<span class="holiday">'.$holiday.'</span>';}
          if($i<10){$day = "0".$i."日";}else{$day = $i."日";}
          foreach($eventArray as $eventArrayData) {
              $eln = explode("\t", $eventArrayData);
              if($eln[0] == $day){$tmp .= '<a href="'.$eln[2].'">'.$eln[1].'</a>';}
          }
          $tmp .= "</td>\n";
      } else {
          //現在の日付ではない場合
          $tmp .= "\t\t";
          if($holiday){$tmp .= '<td class="holiday">'.$i.'<span class="holiday">'.$holiday.'</span>';
          }elseif($week == '0'){$tmp .= '<td class="sun">'.$i;
          }elseif($week == '6'){$tmp .= '<td class="sat">'.$i;
          }else{$tmp .= '<td>'.$i;}
          if($i<10){$day = "0".$i."日";}else{$day = $i."日";}
          foreach($eventArray as $eventArrayData) {
              $eln = explode("\t", $eventArrayData);
              if($eln[0] == $day){$tmp .= '<a href="'.$eln[2].'">'.$eln[1].'</a>';}
          }
          $tmp .= "</td>\n";
      }
      //月末の場合
      if ($i == $l_day) {
          $tmp .= repeat(6 - $week);
      }
      //土曜日の場合
      if($week == 6) {
          $tmp .= "\t</tr>\n";
      }
  }
  if($lc < 6) {
      $tmp .= "\t<tr>\n";
      $tmp .= repeat(7);
      $tmp .= "\t</tr>\n";
  }
  if($lc == 4) {
      $tmp .= "\t<tr>\n";
      $tmp .= repeat(7);
      $tmp .= "\t</tr>\n";
  }
  $tmp .= "</table>\n";
  return $tmp;
}

function repeat($n) {
  return str_repeat("\t\t<td> </td>\n", $n);
}

/* 祝日の取得 */
//Googleカレンダーから祝日を取得
function getHolidays($year) {
  //Googleカレンダーから、指定年の祝日情報をJSON形式で取得するためのURL
  $url = sprintf(
      'http://www.google.com/calendar/feeds/%s/public/full-noattendees?alt=json&%s&%s',
      'japanese__ja@holiday.calendar.google.com',
      'start-min='.$year.'-01-01',
      'start-max='.$year.'-12-31'
  );
  if ( $results = file_get_contents($url) ) {
          $results = json_decode($results, true);
          $holidays = array();
          foreach ($results['feed']['entry'] as $val ) {
                  $date  = $val['gd$when'][0]['startTime'];
                  $week = date('w',strtotime($date));
                  $title = $val['title']['$t'];
                  $holidays[$date] = $title;

                  if( $week == 0) {
                      $nextday = date('Y-m-d',strtotime('+1 day', strtotime($date)));
                      $holidays[$nextday] = '振替休日';
                  }

                  $before_yesterday = date('Y-m-d',strtotime('-2 day', strtotime($date)));

                  if(isset($holidays[$before_yesterday])){
                      $yesterday = date('Y-m-d',strtotime('-1 day', strtotime($date)));
                      $holidays[$yesterday] = '国民の休日';
                  }

          }
          ksort($holidays);
  }
  return $holidays;
}

function agv($array, $key, $default = NULL) {
return isset($array[$key]) ? $array[$key]: $default;
}

page-event.php

<!-- main -->
<div id="main">
<?php //'live'というカスタム投稿タイプ呼び出し
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$getY = agv($_GET, 'ey');
$getM = agv($_GET, 'em');
if($getY && $getM){
    $min = $_GET['ey']."年".$_GET['em']."月01日";
    $max = $_GET['ey']."年".$_GET['em']."月31日";
}else{
    $min = date('Y年m月01日');
    $max = date('Y年m月31日');
}
$wp_query = new WP_Query( array(
    'post_type' => 'event',
    'posts_per_page' => -1,
    'paged' => $paged,
    'meta_key'=>'eventday',
    'meta_value'=> array( $min, $max ),
    'meta_compare'=>'BETWEEN',
    'orderby'=>'meta_value',
    'order'=>'ASC'
) );
$eventArray = array();
?>
<?php if (have_posts()) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<?php //イベントスケジュールを配列に格納
    $eventID = get_permalink();
    $eventTitle = get_the_title();
    $eventDate = get_post_meta($post->ID,'eventday',TRUE);
    $eventPref = get_post_meta($post->ID,'Pref',TRUE);
    preg_match('/\d{2}日/' , $eventDate , $matchDate);
    $eventData = $matchDate[0]."\t".$eventTitle."\t".$eventID."\t".$eventPref."\t";
    array_unshift($eventArray, $eventData);
?>
<?php endwhile; ?>

<?php endif; ?>

<?php 
$getY = agv($_GET, 'ey');
$getM = agv($_GET, 'em');
if($getY && $getM){
    $nowYear = $_GET['ey'];
    $nowMon = $_GET['em'];
}else{
    $nowYear = date('Y');
    $nowMon = date('m');
}
$next = strtotime(date("Ymd",strtotime($nowYear.$nowMon."01"))."+1 month");
$next = date("Ymd",$next);
$prev = strtotime(date("Ymd",strtotime($nowYear.$nowMon."01"))."-1 month");
$prev = date("Ymd",$prev);

    echo '<h2>カレンダー表示</h2>';
    echo '<p class="link_prev"><a href="?ey='.substr($prev,0,4).'&amp;em='.substr($prev,-4,2).'">&lt;&lt; '.substr($prev,0,4).'年'.substr($prev,-4,2).'月</a></p>';
    echo '<p class="link_next"><a href="?ey='.substr($next,0,4).'&amp;em='.substr($next,-4,2).'">'.substr($next,0,4).'年'.substr($next,-4,2).'月 &gt;&gt;</a></p>';
    //カレンダー表示
    echo my_event_calendar($nowYear,$nowMon,$eventArray);
    echo '<p class="nextback">';
    echo '<a href="?ey='.substr($prev,0,4).'&amp;em='.substr($prev,-4,2).'">&lt;&lt; '.substr($prev,0,4).'年'.substr($prev,-4,2).'月</a>';
    echo '|';
    echo '<a href="?ey='.substr($next,0,4).'&amp;em='.substr($next,-4,2).'">'.substr($next,0,4).'年'.substr($next,-4,2).'月 &gt;&gt;</a>';
    echo '</p>';
?>
</div>
<!-- /main -->

試したこと

functions.phpよりカスタム投稿を作成し、設定しなおしたりしたのですが、
カスタムフィールドの日付で表示してくれませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • yukikp

    2019/08/06 20:20

    ACFプラグインを使っているなら、
    get_post_meta関数ではなくてget_field関数を使うべきかと。

    それは置いておいて、どこの段階までデータが取得で来ているのか見て見る必要があるのですが、

    my_event_calendar($nowYear,$nowMon,$eventArray);の直前に、
    echo "<pre>";
    var_dump( $eventArray );
    echo "</pre>";
    を入れて、$eventArrayの中身がちゃんと取得されているか見て見てください。

    キャンセル

回答 1

check解決した方法

0

カスタムフィールドのリピートでカレンダーに指定した日付の場所にタイトルを表示することが出来ました。
googleカレンダーの祝日の部分が旧版で表示ができない状態ですが、、
一応希望通りの動作をすることが出来ましたので、ご報告いたします。

calendar.php ▼

<div id="main">
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$getY = agv($_GET, 'ey');
$getM = agv($_GET, 'em');
if($getY && $getM){
    $min = $_GET['ey']."年".$_GET['em']."月01日";
    $max = $_GET['ey']."年".$_GET['em']."月31日";
}else{
    $min = date('Y年m月01日');
    $max = date('Y年m月31日');
}


    $wp_query = new WP_Query( array(
        'post_type' => 'clutureprogram',
        'posts_per_page' => -1,
        'paged' => $paged,
        'post_status' => 'publish',
        'order'=>'ASC'
    ) );
    $eventArray = array();
    ?>
    <?php if (have_posts()) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
        <?php //イベントスケジュールを配列に格納
        $year = filter_input(INPUT_GET, 'ey', FILTER_SANITIZE_NUMBER_INT)?: date('Y');
        $month = filter_input(INPUT_GET, 'em', FILTER_SANITIZE_NUMBER_INT)?: date('m');
        $eventID = get_permalink();
        $eventTitle = get_the_title();
        $eventPref = get_post_meta($post->ID,'Pref',TRUE);
        if (have_rows('date_repeat')) {
            while(have_rows('date_repeat')) {
                the_row();
                $eventDate = get_sub_field('date');
                if (preg_match("/{$year}年{$month}月(\d{2}日)/u" , $eventDate , $matchDate)) {
                    $eventData = $matchDate[1] . "\t" . $eventTitle . "\t" . $eventID . "\t" . $eventPref . "\t";
                    $eventArray[$matchDate[1]][] = $eventData;
                }
            }
        }
        ?>
    <?php endwhile; ?>

    <?php endif; ?>

<?php 
$getY = agv($_GET, 'ey');
$getM = agv($_GET, 'em');
if($getY && $getM){
    $nowYear = $_GET['ey'];
    $nowMon = $_GET['em'];
}else{
    $nowYear = date('Y');
    $nowMon = date('m');
}
$next = strtotime(date("Ymd",strtotime($nowYear.$nowMon."01"))."+1 month");
$next = date("Ymd",$next);
$prev = strtotime(date("Ymd",strtotime($nowYear.$nowMon."01"))."-1 month");
$prev = date("Ymd",$prev);
    echo '<div class="calendar">';
    echo '<p class="link_prev"><a href="?ey='.substr($prev,0,4).'&amp;em='.substr($prev,-4,2).'">&lt;&lt; '.substr($prev,0,4).'年'.substr($prev,-4,2).'月</a></p>';
    echo '<p class="link_next"><a href="?ey='.substr($next,0,4).'&amp;em='.substr($next,-4,2).'">'.substr($next,0,4).'年'.substr($next,-4,2).'月 &gt;&gt;</a></p>';
    //カレンダー表示
    echo my_event_calendar($nowYear,$nowMon,$eventArray);
    echo '</div>';
?>
</div>

functions.php ▼

function my_event_calendar($year = "", $month = "", $eventArray) {
    if(empty($year) && empty($month)) {
        $year = date("Y");
        $month = date("n");
    }
    //月末の取得
    $l_day = date("j", mktime(0, 0, 0, $month + 1, 0, $year));
    //祝日の取得
    $holidays = getHolidays($year);
    //初期出力
    $tmp = <<<EOM
<table class="wp-calendar">
    <caption>{$year}{$month}月</caption>
    <thead>
    <tr>
        <th class="sun">日</th>
        <th>月</th>
        <th>火</th>
        <th>水</th>
        <th>木</th>
        <th>金</th>
        <th class="sat">土</th>
    </tr>\n
    </thead>
EOM;
    $lc = 0;

    //月末分繰り返す
    for ($i = 1; $i < $l_day + 1;$i++) {
        //曜日の取得
        $week = date("w", mktime(0, 0, 0, $month, $i, $year));
        if($i<10){
            $holinum = $year.'-'.$month.'-0'.$i;
        }else{
            $holinum = $year.'-'.$month.'-'.$i;
        }
        $holiday = agv($holidays, $holinum);

        //曜日が日曜日の場合
        if ($week == 0) {
            $tmp .= "\t<tr>\n";
            $lc++;
        }
        //1日の場合
        if ($i == 1) {
            if($week != 0) {
                $tmp .= "\t<tr>\n";
                $lc++;
            }
            $tmp .= repeat($week);
        }

        if ($i == date("j") && $year == date("Y") && $month == date("n")) {
            //現在の日付の場合
            $tmp .= "\t\t".'<td class="today">'.$i;
            if($holiday){$tmp .= '<span class="holiday">'.$holiday.'</span>';}
            if($i<10){$day = "0".$i."日";}else{$day = $i."日";}
            if (isset($eventArray[$day])) {
                foreach ($eventArray[$day] as $eventArrayData) {
                    $eln = explode("\t", $eventArrayData);
                    if ($eln[0] == $day) {
                        $tmp .= '<a href="' . $eln[2] . '">' . $eln[1] . '</a>';
                    }
                }
            }
             $tmp .= "</td>\n";
        } else {
            //現在の日付ではない場合
            $searchUrl = esc_url( home_url( '/' ))."clutureprogram/?meta_key=date_repeat_date&meta_value=".$year."年".$month."月".$i."日";
            $tmp .= "\t\t";
            if($holiday){$tmp .= '<td class="holiday">'.$i.'<span class="holiday">'.$holiday.'</span>';
            }elseif($week == '0'){$tmp .= '<td class="sun">'.$i;
            }elseif($week == '6'){$tmp .= '<td class="sat">'.$i;
            }else{$tmp .= '<td>'.'<a href="'.$searchUrl.'">'.$i.'</a>';}
            if($i<10){$day = "0".$i."日";}else{$day = $i."日";}
            if (isset($eventArray[$day])) {
                foreach ($eventArray[$day] as $eventArrayData) {
                    $eln = explode("\t", $eventArrayData);
                    if ($eln[0] == $day) {
                        $tmp .= '<a href="' . $eln[2] . '">' . $eln[1] . '</a>';
                    }
                }
            }
            $tmp .= "</td>\n";
        }
        //月末の場合
        if ($i == $l_day) {
            $tmp .= repeat(6 - $week);
        }
        //土曜日の場合
        if($week == 6) {
            $tmp .= "\t</tr>\n";
        }
    }
    if($lc < 6) {
        $tmp .= "\t<tr>\n";
        $tmp .= repeat(7);
        $tmp .= "\t</tr>\n";
    }
    if($lc == 4) {
        $tmp .= "\t<tr>\n";
        $tmp .= repeat(7);
        $tmp .= "\t</tr>\n";
    }
    $tmp .= "</table>\n";
    return $tmp;
}

function repeat($n) {
    return str_repeat("\t\t<td> </td>\n", $n);
}

/* 祝日の取得 */
//Googleカレンダーから祝日を取得
function getHolidays($year) {
    //Googleカレンダーから、指定年の祝日情報をJSON形式で取得するためのURL
    $url = sprintf(
        'http://www.google.com/calendar/feeds/%s/public/full-noattendees?alt=json&%s&%s',
        'japanese__ja@holiday.calendar.google.com',
        'start-min='.$year.'-01-01',
        'start-max='.$year.'-12-31'
    );
    if ( $results = file_get_contents($url) ) {
            $results = json_decode($results, true);
            $holidays = array();
            foreach ($results['feed']['entry'] as $val ) {
                    $date  = $val['gd$when'][0]['startTime'];
                    $week = date('w',strtotime($date));
                    $title = $val['title']['$t'];
                    $holidays[$date] = $title;

                    if( $week == 0) {
                        $nextday = date('Y-m-d',strtotime('+1 day', strtotime($date)));
                        $holidays[$nextday] = '振替休日';
                    }

                    $before_yesterday = date('Y-m-d',strtotime('-2 day', strtotime($date)));

                    if(isset($holidays[$before_yesterday])){
                        $yesterday = date('Y-m-d',strtotime('-1 day', strtotime($date)));
                        $holidays[$yesterday] = '国民の休日';
                    }

            }
            ksort($holidays);
    }
    return $holidays;
}

function agv($array, $key, $default = NULL) {
  return isset($array[$key]) ? $array[$key]: $default;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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