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

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

ただいまの
回答率

90.47%

  • PHP

    20902questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7464questions

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

WordPressのカレンダーをカスタムフィールドの日付と関連付けたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,081

izumigt

score 15

前提・実現したいこと

ワードプレスのカレンダーカスタマイズについてと、ほぼ同じ内容なのですが…

カスタム投稿タイプ"event"を作成し、
カスタムフィールドにて、投稿日とは別の日付を設定しています。 
このカスタムフィールドで管理している日付をもとに、<?php get_calendar; ?>でイベントカレンダーを出力したいのですが、現状、カレンダーが投稿日にリンクされてしまっている状態です。

※前述の質問のように、投稿日をイベント日とし、さらに未来のスケジュールも表示させる方法もありますが、予約投稿を使いたいためこれは断念しました。
※カレンダープラグインを幾つか試しましたが、デザインと機能で思っているような表示をしてくれず断念しました。→イメージとしてはhttp://club-science.comのカレンダーのようにさせたいです。

なお、カスタム投稿タイプの作成は「Custom Post Type UI」
カスタムフィールドの作成は「Advanced Custom Fields」を使用しています。

発生している問題・エラーメッセージ

<?php get_calendar; ?>で出力したカレンダーのリンクをイベント日にしたいが投稿日になってしまう。

試したこと1

1.カスタム投稿タイプのカレンダーを表示する
→無事、"event"のカレンダーが表示されましたがリンクが投稿日になってしまいます。
2.カスタム3兄弟で作る独自イベントカレンダー
→general-template.php の該当部分をこのページのように差し替えましたが何も変化がありません。

追記1(試したこと2)

「試したこと1」の、1.カスタム投稿タイプのカレンダーを表示する内で、
wp-includes/general-template.php の記述を編集していることがわかりました。
wp-includes/general-template.php 2000行目辺りの以下の部分を編集すればなんとかなりそうな気がするのですが、どうすれば良いか検討がつきません。

お知恵をお貸し下さい。
宜しくお願いいたします。

// 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 = '$cpt' AND post_status = 'publish'
        AND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", ARRAY_N);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

こんにちは。

試したこと、についてですが、

1.カスタム投稿タイプのカレンダーを表示する 
→無事、"event"のカレンダーが表示されましたがリンクが投稿日になってしまいます。 

→取得条件のpost_typeのみ変更していて、取得対象カラムがpost_dateのままなので、当然リンクは投稿日のままになります。

2.カスタム3兄弟で作る独自イベントカレンダー 
→general-template.php の該当部分をこのページのように差し替えましたが何も変化がありません。

→おそらくクエリとしてはこれで良いと思われるのですが、該当部分のみ差し替え、とおっしゃられているので、もしかしたら$st,$edのあたりがうまくいっていないのではないかと推測します。

こちらを踏まえて、ご質問のSELECT文については下記のようにすればお望みの結果を得られると思います。
(修正結果を実行はしていないので、動作保証はできかねます、申し訳ありません)

$dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(meta_value)
        FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ID = post_id
        WHERE meta_value >= '{$thisyear}-{$thismonth}-01 00:00:00'
        AND post_type = '$cpt' AND post_status = 'publish'
        AND meta_value <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'", ARRAY_N);


また、前後のSELECT文でpost_dateを取得している箇所は同様に、meta_valueを取得&FROM句WHERE句を変更する必要があるでしょう(前月移動のリンクなど

修正時ですが、general-template.phpをそのまま書き換えてしまうと、WP自体をupdateした時に上書きされて消えてしまいますので、コアファイルの書き換えをせず、1のようにfunctions.phpに書くことをお勧めします。


話は飛躍しますが、「カレンダーのリンク」をクリックしたあとのページ表示についてはもう作り込みされていますでしょうか?
(一覧取得時にmeta_valueで絞り込むように修正する必要がある &
get_template.phpのline.2043付近、get_day_link( $thisyear, $thismonth, $day )でリンク先URLが生成されるので、↑にあわせてなんらか修正する必要がある)

これについてまだ考慮されていないのであれば、既存のプラグインを利用&カレンダー部分をCSSでどうにかする方向のほうが楽かもしれません。
以前似たようなイベントカレンダーを作成した時に
Event Organiser https://ja.wordpress.org/plugins/event-organiser/
を利用しましたが、上記の問題は対応できました。(挙げられていた別質問にはなかったのでご参考までに)

以上、解決のお役に立ちましたら幸いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/20 02:34

    こういったプラグインがあるのを知りませんでした。本当に助かりました。
    SELECT文に関しては、その他の/今後の修正箇所がわからず、今回は断念しました。

    ご回答、本当にありがとうございました。

    キャンセル

  • 2016/04/20 18:38 編集

    SELECT文のところは説明が足りなくて申し訳ありませんでした。
    今回はプラグインで対処されるようですのでご参考までに、
    (generate-template.phpの"post_date"を取得している箇所を検索すれば出ますが)件のクエリの70行ほど上のを、

    $previous = $wpdb->get_row("SELECT MONTH(meta_value) AS month, YEAR(meta_value) AS year
    FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ID = post_id
    WHERE meta_value < '$thisyear-$thismonth-01'
    AND post_type = '$cpt' AND post_status = 'publish'
    ORDER BY post_date DESC
    LIMIT 1");
    $next = $wpdb->get_row("SELECT MONTH(meta_value) AS month, YEAR(meta_value) AS year
    FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ID = post_id
    WHERE meta_value > '$thisyear-$thismonth-{$last_day} 23:59:59'
    AND post_type = '$cpt' AND post_status = 'publish'
    ORDER BY post_date ASC
    LIMIT 1");


    のように修正すると前月・次月が取れると思います。

    実装がんばってください。

    キャンセル

関連した質問

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

  • PHP

    20902questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7464questions

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