まだ設定されていないキーのmeta_query


8

ギャラリーシステムのカスタム投稿タイプを照会しようとしています。ギャラリーを「注目の」ギャラリーとして設定するためのチェックボックスがあります(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

ありがとう!

回答:


7

その大規模な関数は少し怖いです、私はこれをこのように機能させました-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

);

最初のアレイは2番目のアレイをこのソリューションでオーバーライドしています。同じフィールドをダブルクエリできないと思いますか?
アレンギングリッチ

3

Codexのカスタムフィールドパラメータに従ってNOT EXISTS、WPバージョン3.5以降、特別な比較が可能です

技術的には、postリクエストで次の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)。そのため、キーがまったく存在しない場合にのみ機能し、偽の値で存在するキーには機能しません。


私はこのNOT EXISTS比較に興味をそそられます。未設定のメタキーの回避策として、save_postメタキーが設定されていない場合は、フックに0を保存するだけです。どのように機能しNOT EXISTSますか?OPのクエリを並べ替えmain-galて、メタを持たない投稿を4に入力しますか?
2013年

@helgatheviking回答の力学について詳しく説明しました
Rarst

2

チケットが指摘したように、それはサポートされていません。それまでは、カスタムソリューションに依存する必要があります。

数人のユーザーがこれを以前に要求したり、少なくともWordPress.orgフォーラムでそれを行う方法を尋ねたりしたため、私が保持しなかった(ペーストビン化された)仕事を実行する関数を書きました、幸いにも元のトピックを見つけましたここで、ペーストビンリンクを提供しました(有効期限はありません)。

http://pastebin.com/kgLt1RrG

私はそれを8か月前に書いたが、それ以降はテストしていないので、問題があれば教えてください。

お役に立てれば幸いです。


よろしくお願いいたします。今晩遅くにテストして、何が起こるかをお知らせします。
artparks

1

最もクリーンではありませんが、最も簡単な方法:

$args = array(
    'post_type' => 'gallery',
    'posts_per_page' => -1,
    'meta_key' => 'gal-ID',
    'order_by' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => 'main-gal',
    ) );

これにより、すべてのギャラリーがメタキーで並べ替えられます。次のステップは、値が1のギャラリーが他の投稿の前か後かを判断することです。この方法では、次のいずれかを実行できます。

  • 4つのギャラリーアイテムを処理するか、メタ値が1の投稿に到達するまで、アイテムを処理します。
  • メタ値1の投稿をスキップし、最初の1以外の値に達したときに処理を開始します

カスタムSQLステートメントを必要としない他のメソッド:

  • クエリを実行して不要なギャラリーを検索し、それを使用して投稿IDの配列に入力し、次に2番目のクエリを実行して、その配列を投稿として渡して除外します
  • カスタムフィールドの代わりに分類法を使用する(これはかなりうまく解決され、他の多くの優れた改善が無料で行われるため、時間の節約にもなります)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.