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

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

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

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

PHP

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

解決済

WordPressの記事取得の条件、複雑なためmeta_queryを使用しているがうまく取得できない。keyに変数入力、あるいはcompareの条件を複雑に出来るのか?

Samson818
Samson818

総合スコア158

WordPress

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

PHP

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

1回答

0グッド

0クリップ

200閲覧

投稿2022/10/21 05:14

編集2022/10/21 07:26

前提

動画欄 or Youtube欄に動画へのパスが存在します。
1.動画欄はオンエア日の15時に予約公開されるという条件がありますので、オンエア日と予約のON/OFFスイッチがあります。
動画欄にパスの入力がある。(カスタムフィールド名:'movie',形式はURL)
オンエア日の15時を過ぎている(カスタムフィールド名:'onair',形式は日付8桁、例20221021)
公開予約のスイッチがON(カスタムフィールド名:'movie_open',形式はtrue/flase)
2.Youtube欄にパスがある(カスタムフィールド名:'youtube',形式はURL)

1,2どちらかの条件を満たすものorで取得するWP_Queryを書いたつもりなのですが、
上手く動いてくれません。
どこに間違いがあるのでしょうか?

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

下記コードだと「2.Youtube欄にパスがある」に該当ある場合しか表示されない

該当のソースコード

php

1<?php 2$start_d = new DateTime(get_field('onair', false, false));//放送日 3$current = date_i18n('Y-m-d H:i:s');//カレントタイム 4$start = date_format($start_d,'Y-m-d 15:00:00');//放送日の15時 5 6$args = array( 7 'post_type' => 'post', 8 'post_status' => 'publish', 9 'posts_per_page' => -1, 10 'meta_query' => array( 11 'relation' => 'OR', 12 array( 13 'key' => 'youtube', 14 'value' => '', 15 'compare' => '!=' 16 ), 17 array( 18 'relation' => 'AND', 19 array( 20 'key' => 'movie', 21 'value' => '', 22 'compare' => '!=' 23 ), 24 array( 25 'key' => 'movie_open', 26 'value' => true 27 ), 28 array( //<--------------------------ここの扱いか日時の指定に問題があると思われます------------------------- 29 'key' => $start, 30 'value' => $current, 31 'compare' => '<=', 32 'type' => 'time' 33 ) 34 ) 35 ) 36); 37 $top_news = new WP_Query( $args ); 38 if($top_news->have_posts()): while($top_news->have_posts()): $top_news->the_post(); ?> 39 40 <!-- 繰り返し処理する内容 --> 41 42 <?php endwhile; ?> 43<?php wp_reset_postdata(); ?> 44<?php else: ?> 45<!-- 投稿が無い場合の処理 --> 46動画つきのコンテンツがありません。 47<?php endif; ?>

以前はYotube欄が無かったので、繰り返しの内で比較して出力していました。

php

1<?php if($current > $start): ?> 2 3 <!-- 繰り返し処理する内容 --> 4 5<?php endif; ?>

また、keyに変数を指定せず、時間に加工するまえのカスタム投稿タイプを直接入れる以下のパータンはうまく動いてくれてます。

php

1$current = date_i18n('Y-m-d');

php

1 array( //ここの扱いに問題があると思われます。 2 'key' => 'onair', 3 'value' => $current, 4 'compare' => '>=', 5 'type' => 'date' 6 )

$startの加工の仕方に問題があるのかと思いますが、どのようにしたら上手にcompareしてくれるでしょうか?
よろしくお願いいたします。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

ここの扱いか日時の指定に問題があると思われます
$startの加工の仕方に問題があるのかと思いますが、どのようにしたら上手にcompareしてくれるでしょうか?

と書かれている通り条件がおかしいと思います。

まず、確認ですが、

array( //<--------------------------ここの扱いか日時の指定に問題があると思われます------------------------- 'key' => $start, 'value' => $current, 'compare' => '<=', 'type' => 'time' )

は、何がしたいのでしょうか?

key に $start を入れていますが、$start と $current が

$start = date_format($start_d,'Y-m-d 15:00:00');//放送日の15時
$current = date_i18n('Y-m-d H:i:s');//カレントタイム

であれば、今日( 2022年10月21日 12:00:00 )に実行した場合、

> array( //<--------------------------ここの扱いか日時の指定に問題があると思われます------------------------- > 'key' => '2022-10-21 15:00:00', > 'value' => '2022-10-21 12:00:00', > 'compare' => '<=', > 'type' => 'time' > )

という条件で検索することになります。

「名前が2022-10-21 15:00:00のカスタムフィールドの値」と2022-10-21 12:00:00 を比較する条件で検索しています。
投稿にカスタムフィールドの名前が2022-10-21 15:00:00というカスタムフィールドが存在しない場合、この条件は、成立しないと思います。

'key' には、「カスタムフィールドの名前」を指定する必要があります。

なので、

また、keyに変数を指定せず、時間に加工するまえのカスタム投稿タイプを直接入れる以下のパータンはうまく動いてくれてます。

こちらの場合は、'key' に「カスタムフィールドの名前」を指定していて、正しくカスタムフィールドが指定されるので動作しています。

投稿2022/10/21 05:59

CHERRY

総合スコア24689

Samson818😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

Samson818

2022/10/21 06:27 編集

ありがとうございます! 頭の中整理できました。 ということは~、 'key' => 'onair'はいいとして、onairの値を加工して 'value' => $current,を比較すればいいんですね。 出来るのでしょうか? あるいはcompareの方の条件式を複雑化する? ググって30件ほど見てみましたが、素直にやっているパターンしか見つからず。 関数リファレンス/WP Query のページを参照している限り難しそうですね。。
CHERRY

2022/10/21 06:27 編集

一番簡単なのは、カスタムフィールドに保存するデータに時間を含めて保存して、 DATETIME で比較することかなと思います。 どうしてもカスタムフィールドのデータ構造は変更できないため、日付だけしか入っていないという状況であれば、 PHP 側で条件を補う必要があると思います。 ’DATE' 条件で比較する場合、'00:00:00' が基準になります。 今回の条件のように 15:00 で判定を分けるのであれば、PHP 側で 15:00 以前か以後か判断して、15:00以前は 前日の日付で検索するという条件にすることで対応できるのではないでしょうか。 たとえば、現在時刻から 15:00:00 (15時間)を引くと 15:00前は1日前の日付に、15:00 以降であれば当日になる計算になります。
Samson818

2022/10/21 06:31

ありがとうございます。$currentに入れる数字を条件分岐で操ってやって、dateで比較という事ですね。 やれそうな気がしてきました。
Samson818

2022/10/21 07:05

ありがとうございます! できました。 ```php <?php $time = wp_date('H:i:s');//現在時刻を取得 if( $time > '15:00:00'){ $current = wp_date('Y-m-d H:i:s');//カレントタイム }else{ $current = wp_date('Y-m-d H:i:s',strtotime("now - 15hours"));//15時間引いて強制的に昨日にする }; <中略> array( 'key' => 'event_onair', 'value' => $current, 'compare' => '<=', 'type' => 'date' ) ```
CHERRY

2022/10/21 07:07

はい。そのとおりです。 「公開日時は、常に15:00 を基準する」として回答していますが、固定の時刻なら一番最後に書いた「現在時刻から常に15時間引いて比較用の日付を作る」方法なら、条件分岐は不要です。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

WordPress

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

PHP

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