web-dev-qa-db-ja.com

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

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

ありがとうございます。

8
artparks

その大規模な関数はちょっと怖かったです、私はこれがそのように働くことを手に入れました - 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

);
7
ArleyM

カスタムフィールドパラメータ によると、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が存在するキーには機能しません。

3
Rarst

チケットが指摘したように、それはサポートされていません..それまではカスタムソリューションに頼らなければなりません。

何人かのユーザーが以前にこれを要求したか、少なくともWordPress.orgフォーラムでそれをどうやってやり直すかを尋ねたので、私は(ペーストビンで)決して手に入らない仕事をするための関数を書きました。 Pastebinリンクを入力したところ(期限切れにならないはずです)。

http://Pastebin.com/kgLt1RrG

私は8か月前にそのことを書きました、そして私はそれ以来(それ以来)それをテストしていませんので、どんな問題でも私に知らせてください。

それが役立つことを願っています..

2
t31os

最も簡単な方法ではありませんが、最も単純な方法です。

$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番目のクエリを実行し、その配列を除外する投稿として渡します
  • カスタムフィールドの代わりに分類法を使用する(これを非常にうまく解決し、他の多くのNice改良を無料で提供するので、時間も節約できます)
1
Tom J Nowell