ギャラリーシステムのカスタム投稿タイプをクエリしようとしています。ギャラリーを「おすすめの」ギャラリーとして設定するチェックボックスがあります(More Fieldsプラグインで設定) - これをチェックするとメタ値は1になり、チェックを外した場合は0になります。しかし、チェックボックスがチェックされていない場合、メタキーは作成されません。つまり、NOT LIKE 1は存在しないため、クエリできません。
私が欲しいクエリは、このメタ値で '1'としてマークされていない4つのギャラリーを引き出すことですが、まったくこの値を持っていないものもそうです。新しく追加された投稿に常にこのメタキーのデフォルト値を設定する方法はありますか(つまり、チェックボックスをオフにした場合は常にデフォルトで0にする)、またはまだ設定されていないキーを検索する方法はありますか
私の現在の質問は:
$args = array(
'post_type' => 'gallery',
'showposts' => 4,
'meta_key' => 'gal-ID',
'order_by' => 'meta_value',
'order' => 'ASC',
'meta_query' => array( array(
'key' => 'main-gal',
'value' => false,
) ),
) );
そして私は 'compare' => 'NOT LIKE'、 '!='などでいろいろな試みを試みました。
何か案は?このチケットは整理されるべきものであることを暗示しているようです。
http://core.trac.wordpress.org/ticket/18158
ありがとうございます。
その大規模な関数はちょっと怖かったです、私はこれがそのように働くことを手に入れました - 2つの引数(それは特徴を除外します)で
$args = array(
'meta_query' => array(
'relation' => 'OR',
array( // new and edited posts
'key' => 'Set as Featured Post',
'compare' => '!=',
'value' => 1
),
array( // get old posts w/out custom field
'key' => 'Set as Featured Post',
'value' => '1',
'compare' => 'NOT EXISTS'
)
),
'posts_per_page' => 30
);
カスタムフィールドパラメータ によると、Codexでは、WP version 3.5以降、特別なNOT EXISTS
compareが利用可能です。
技術的には、投稿リクエストで次のようなSQLクエリを生成します。
$posts = get_posts( array(
'meta_query' => array(
array(
'key' => 'wrong',
'compare' => 'NOT EXISTS',
),
),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'wrong')
WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5
提供されたキーでメタテーブルを結合し、意味のあるデータにならなかったレコードのみを選択することで機能します(IS NULL
)。したがって、keyがまったく存在しない場合にのみ機能し、 falsy valuesが存在するキーには機能しません。
チケットが指摘したように、それはサポートされていません..それまではカスタムソリューションに頼らなければなりません。
何人かのユーザーが以前にこれを要求したか、少なくともWordPress.orgフォーラムでそれをどうやってやり直すかを尋ねたので、私は(ペーストビンで)決して手に入らない仕事をするための関数を書きました。 Pastebinリンクを入力したところ(期限切れにならないはずです)。
私は8か月前にそのことを書きました、そして私はそれ以来(それ以来)それをテストしていませんので、どんな問題でも私に知らせてください。
それが役立つことを願っています..
最も簡単な方法ではありませんが、最も単純な方法です。
$args = array(
'post_type' => 'gallery',
'posts_per_page' => -1,
'meta_key' => 'gal-ID',
'order_by' => 'meta_value',
'order' => 'ASC',
'meta_key' => 'main-gal',
) );
これにより、メタキーでソートされたすべてのギャラリーが表示されます。次のステップは、値1のギャラリーが他の投稿の後または前のどちらにあるかを判断することです。これにより、次のいずれかを実行できます。
カスタムSQL文を必要としない他の方法: