Wp-queryでカスタムフィールドの値でフィルターする時に気をつけたいこと

こんにちは、水戸でコーディングしているけど、いずれ全国、全世界でコーディングしたいレターズです。

今回は、現場であった失敗を元にお話しします。

まずは結果から。。

入力画面

一言で言うと、掲載終了日をカスタムフィールドで設定して(そういった必要がありました。)、その日が過ぎたら掲載をストップするという機能を実装した時のことです。
一度掲載日を入力して更新し、その後その掲載日を入力欄から消しても記事が表示されないままになってしまった件です。。

修正前コード

..
..
'meta_query' => array(
			'relation'          => 'OR',
			// if not exists, still showing
			array(
				'key'       => 'last-showing-day',
				'compare'   => 'NOT EXISTS',
			),
			// if exists and the value is greater than or equal to today, still showing
			array(
				'key' => 'last-showing-day',
				'value' => date_i18n('Ymd'),
				'compare' => '>=',
				'type' => 'DATE',
			),
		);
..
..
..

上記のような形で、Wp-queryの引数$agrsの中にフィルター用の要素を入れたのですが、

'compare'   => 'NOT EXISTS',

はあくまで ”存在しない” という状況で、一度入力して更新をかけてから再度削除した場合は、値が空という状態で ”存在する” ということになります。
なので、このままだと一度消しても空の値が残り、フィルターがうまくいかなかったようです。

修正後コード

..
..
'meta_query' => array(
			'relation'          => 'OR',
			// if not exists, still showing
			array(
				'key'       => 'last-showing-day',
				'compare'   => 'NOT EXISTS',
			),
	          // when value is blank, still showing
			array(
				'key'       => 'last-showing-day',
				'value'   => '',
			),
			// if exists and the value is greater than or equal to today, still showing
			array(
				'key' => 'last-showing-day',
				'value' => date_i18n('Ymd'),
				'compare' => '>=',
				'type' => 'DATE',
			),
		);
..
..
..

上記が修正後コードです。

	// when value is blank, still showing
			array(
				'key'       => 'last-showing-day',
				'value'   => '',
			),

を追加したことによって、空の場合もフィルターに引っかかるようになり、記事が表示されるようになりました。

前もってこの辺りは頭に入れておきたいですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です