0

meta_queryサブリレーションを持つ方法はありますか? relationクエリのすべての配列に適用したくありません。

私はこれを試しましたが、役に立ちませんでした:

'meta_query' => array(
    array(
        'key' => 'event_type',
        'value' => 'session',
        'compare' => 'LIKE'
    ),
    array(
        'relation' => 'OR',
        array(
            'key' => 'event_video',
            'value' => '0',
            'compare' => '>'
        ),
        array(
            'key' => 'event_summary',
            'value' => '',
            'compare' => '!='
        )
    ),
    array(
        'key' => 'event_date_single',
        'value' => '',
        'compare' => 'LIKE'
    ),
    array(
        'key' => 'event_start_time',
        'value' => '',
        'compare' => 'LIKE'
    )
)

したがって、 と'relation' => 'OR'の間にのみ適用する必要がevent_videoありevent_summaryます。他のすべては互いに独立しています。これはどういうわけか可能ですか?

ありがとう

4

1 に答える 1

1

これがmeta_query限界になりそうです。WP Codexは、メタ クエリにリレーションを使用できることを示していますが、私が見る限り、全体に対して1 種類のリレーションしか使用できないmeta_queryという制限があります。

これは、パラメータ間に完全ORまたは完全AND(デフォルト) の関係を持たせることができることを意味しますがmeta_query、両方を組み合わせることはできません。

WP Codex で直面したときはうれしかったので、手動でコードを検索して問題をさらに掘り下げました。そのため、パラメーターを解析するWP_Query呼び出しがあることがわかりました。これはのクラス コンストラクターです ( WP 3.6のat 行にあります):WP_Meta_Querymeta_queryWP_Meta_Querywp-includes/meta.php643

/**
 * Constructor
 *
 * @param array $meta_query (optional) A meta query
 */
function __construct( $meta_query = false ) {
    if ( !$meta_query )
        return;

    if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) {
        $this->relation = 'OR';
    } else {
        $this->relation = 'AND';
    }

    $this->queries = array();

    foreach ( $meta_query as $key => $query ) {
        if ( ! is_array( $query ) )
            continue;

        $this->queries[] = $query;
    }
}

簡単に言うと、2 番目のif例は、このクラスがORorAND関係のいずれかでのみ機能し、両方を組み合わせては機能しないことを示しています。

したがって、残念ながら、あなたがやろうとしていることを達成することは不可能のようです (少なくとも WP 3.6 まで)。メインクエリを分割し、最初に特定のメタクエリを実行してから、その結果(返されたmetas)をメインクエリに適用するのが最善の方法だと思います。

これは解決策ではなく、答えであることを私は知っています。それでも、これがこの問題の解決策を見つけるのに役立つことを願っています.

于 2013-09-24T00:24:59.677 に答える