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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

PHP

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

Q&A

解決済

1回答

8574閲覧

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

bpbjsu

総合スコア24

WordPress

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

PHP

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

0グッド

0クリップ

投稿2016/04/18 19:00

編集2016/04/18 22:11

###前提・実現したいこと
ワードプレスのカレンダーカスタマイズについてと、ほぼ同じ内容なのですが…

カスタム投稿タイプ"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);

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

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

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/19 07:59

shiina

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bpbjsu

2016/04/19 17:34

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

2016/04/20 09:39 編集

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"); のように修正すると前月・次月が取れると思います。 実装がんばってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問