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

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

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

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

Q&A

解決済

2回答

1067閲覧

カスタムフィールド値によって絞り込む記事の日時範囲の条件を変えたい

kanineko

総合スコア39

WordPress

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

0グッド

0クリップ

投稿2020/06/24 08:36

WordPressにてpre_get_postsで出力条件を設定しているのですが、
その中で、カスタムフィールド値によって参照する記事日時の範囲を変更したいと考えています。


なにかヒントになることなど、何かお気づきの点がございましたら回答お願いいたします。

やりたいこと

カスタムフィールドの値によって、絞り込む記事の日時範囲を変更したい

(例)
カスタムフィールド値が
hoge1のとき:投稿日が一週間以内の記事
hoge2のとき:更新日が二週間以内の記事

状況

カスタムフィールドA(customfield_key)
「未設定」「更新日」「手動の更新日」があります

カスタムフィールドB(customfield_key_date_time)
カスタムフィールドAで手動を選択したときの日時設定欄です

試したこと

名前付けメタクエリというもので、「複数の meta_key を伴う orderby の指定」ということができるようなので、(https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query

date_queryでもできないかと名前付けメタクエリ(customfield_null,customfield_default,customfield_auto、customfield_manual)と任意の名前を設定し、date_queryで設定しましたができませんでした。

php

1<?php 2//function.phpの一部抜粋 3 4$today_date_time = date_i18n("Y-m-d H:i:s"); 5$after_3weeks_date_time = date("Y-m-d H:i:s", strtotime($today_date_time."-3 week"));//今日の日付から3週間前 6 7$metaquery_setting[] = array( 8 'relation' => 'OR', 9 array( 10 'relation' => 'OR', 11 'customfield_null' => array( 12 array( 13 'key' => 'customfield_key', 14 'value' => "",//カスタムフィールド値が空のもの 15 'compare' => '=' 16 ), 17 ), 18 'customfield_default' => array( 19 array( 20 'key' => 'customfield_key', 21 'value' => "未設定",//カスタムフィールド値が未設定のもの 22 'compare' => '=' 23 ), 24 ), 25 'customfield_auto' => array( 26 array( 27 'key' => 'customfield_key', 28 'value' => "更新日",//カスタムフィールド値が更新日のもの 29 'compare' => '=' 30 ), 31 ), 32 ), 33 array( 34 'customfield_manual' => array( 35 'relation' => 'AND', 36 array( 37 'key' => 'customfield_key', 38 'value' => "手動の更新日",//カスタムフィールド値が手動の更新日のもの 39 'compare' => '=' 40 ), 41 42 array( 43 'key' => 'customfield_key_date_time',//カスタムフィールド日時設定 44 'value' => $after_3weeks_date_time, 45 'compare'=>'>=',//日時設定の値が$after_3weeks_date_time以上(以降)の投稿 46 'type'=>'DATETIME' 47 ), 48 ), 49 50 ), 51 ); 52 53$query->set( 'posts_per_rss', 30 );//30件表示 54$query->set( 'meta_query', $metaquery_setting ); 55 56$query->set('date_query', 57 array( 58 'relation'=>'OR',//以下のいずれか 59 array(//customfield_nullのときは1週間以内に投稿されたもの 60 'customfield_null' => array( 61 'column' => 'post_date_gmt', 62 'after' => '1 week ago', 63 ), 64 ), 65 array(//customfield_defaultのときは2週間以内に投稿されたもの 66 'customfield_default' => array( 67 'column' => 'post_date_gmt', 68 'after' => '2 week ago', 69 ), 70 ), 71 array(//customfield_autoのときは3週間以内に変更されたもの 72 'customfield_auto' => array( 73 'column' => 'post_modified_gmt', 74 'after' => '3 week ago', 75 ), 76 ), 77 array(//customfield_manualのときは3週間以内に変更されたもの 78 'customfield_manual' => array( 79 'column' => 'post_modified_gmt', 80 'after' => '3 week ago', 81 ), 82 ), 83 ) 84 );

他に考えたことなど

  • meta_query自体で日時範囲設定ができないか(特定keyのときに期間設定)

 ……keyの値との比較ならできるが投稿日や更新日との比較などはmeta_queryでできなさそう

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

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

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

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

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

guest

回答2

0

WP_queryのフィルタフックでゴニョゴニョすればできないことはないけど
hoge1で1週間以上前の記事のIDを先に取得して
それをpost__not_inに指定して、2週間以内の投稿を取得
みたいなやり方が多分一番簡単だと思います

投稿2020/06/24 09:35

KazuhiroHatano

総合スコア7819

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

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

0

自己解決

回答ありがとうございます。

hoge1で1週間以上前の記事のIDを先に取得して
それをpost__not_inに指定して、2週間以内の投稿を取得
みたいなやり方が多分一番簡単だと思います

この方向で思ったような出力ができました!ありがとうございます。

php

1<?php 2//function.phpの一部抜粋 3 4$array_scope_articleID[] = "";//範囲にいれる記事ID 5 6/*先にID arrayを取得 */ 7$post_ids_date = get_posts(array( 8 //カスタムフィールド値が「null」か「未設定」で【投稿日2週間以内】の記事ID 9 'posts_per_page'=> -1, 10 'fields' => 'ids', 11 'date_query' => array( 12 'column' => 'post_date', 13 'after' => '2 week ago', 14 ), 15 'meta_query' => array( 16 'relation' => 'OR', 17 array( 18 'key' => 'customfield_key', 19 'compare' => 'NOT EXISTS' 20 ), 21 array( 22 'key' => 'customfield_key', 23 'value' => '未設定', 24 'compare' => '=' 25 ), 26 ) 27)); 28 29$post_ids_modified = get_posts(array( 30 //カスタムフィールド値が「更新日」か「手動の更新日」で【更新日2週間以内】の記事ID 31 'posts_per_page'=> -1, 32 'fields' => 'ids', 33 'date_query' => array( 34 'column' => 'post_modified', 35 'after' => '2 week ago', 36 ), 37 'meta_query' => array( 38 'relation' => 'OR', 39 array( 40 'key' => 'customfield_key', 41 'value' => '更新日', 42 'compare' => '=' 43 ), 44 array( 45 'key' => 'customfield_key', 46 'value' => '手動の更新日', 47 'compare' => '=' 48 ), 49 ) 50)); 51 52$array_scope_articleID = array_merge($post_ids_date, $post_ids_modified);//上記のID配列2つを合体 53 54 55$query->set( 'posts_per_rss', 30 );//30件表示 56$query->set( 'post__in', $array_scope_articleID );//$array_scope_articleIDで抽出された記事IDのみを表示する

投稿2020/06/24 12:50

kanineko

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問