前提・実現したいこと
ワードプレスのカレンダーカスタマイズについてと、ほぼ同じ内容なのですが…
カスタム投稿タイプ"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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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/
を利用しましたが、上記の問題は対応できました。(挙げられていた別質問にはなかったのでご参考までに)
以上、解決のお役に立ちましたら幸いです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/20 02:34
SELECT文に関しては、その他の/今後の修正箇所がわからず、今回は断念しました。
ご回答、本当にありがとうございました。
2016/04/20 18:38 編集
今回はプラグインで対処されるようですのでご参考までに、
(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");
のように修正すると前月・次月が取れると思います。
実装がんばってください。