একাধিক রিলেশন কী সহ নেস্টেড মেটা_কোয়ারি


18

আমি কৌতূহল যে ওয়ার্ডপ্রেস নেস্টেড চালাতে সক্ষম meta_query, প্রত্যেকের আলাদা আলাদা রিলেশন কী রয়েছে কিনা ? ওয়ার্ডপ্রেস 3.0 হিসাবে, tax_queryএই ফাংশনটি সম্পাদন করতে সক্ষম; আমি ভাবছি এটির সাথে এর সমতুল্য আছে কিনা meta_query

$results = query_posts( array(
    'post_type' => 'event_id',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            array(
                'key' => 'primary_user_id',
                'value' => $user_id
            ),
            array(
                'key' => 'secondary_user_id',
                'value' => $user_id
            )
        ),
        array(
            'key' => 'date',
            'value' => array( $start_date, $end_date ),
            'type' => 'DATETIME',
            'compare' => 'BETWEEN'
        )
    )
) );

তথ্যসূত্র:

উত্তর:


21

প্রশ্নটি ওয়ার্ডপ্রেস 3.0.০ এর জন্য ছিল, তবে কেবলমাত্র যদি কারও কাছে সাম্প্রতিক সংস্করণের জন্য একই প্রশ্ন থাকে তবে ওয়ার্ডপ্রেস কোডেক্স থেকে:

"সংস্করণ ৪.১ দিয়ে শুরু করে, জটিল কোয়েরিগুলি তৈরির জন্য মেটা_কোয়ারি ক্লোজগুলি বাসাতে পারে" "

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

সুতরাং, সেই প্রশ্নের বর্তমান ওয়ার্ডপ্রেস সংস্করণে কাজ করা উচিত।


9

এটা অসম্ভব বলে মনে হচ্ছে। আমি ভুল হলে দয়া করে কেউ আমাকে সংশোধন করুন।

meta_queryপরামিতি আসলে একটি রূপান্তরিত করা হবে WP_Meta_Queryবস্তু, এবং relationযাচাইকরণটিতে গভীর যেতে হবে না wp-includes/meta.php, এবং শুধুমাত্র শীর্ষ স্তরের একবার ঘটে:

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

এর সম্ভাব্য সমাধান হ'ল এই ক্যোয়ারির জন্য নিজের জয়ন তৈরি করা।

$query = new WP_Query( array(
    ...
    'my_meta_query' => true,
    'suppress_filters' => false
) );

add_filter( 'posts_join', 'my_meta_query_posts_join', 10, 2 );
function my_meta_query_posts_join( $join, $query ) {

    if ( empty( $query->query_vars['my_meta_query'] ) )
        return $join;

    global $wpdb;

    $new_join = "
        INNER JOIN {$wpdb->postmeta} pm1 ON 1=1
            AND pm1.post_id = {$wpdb->posts}.ID
            AND pm1.meta_key = '_some_meta_key'
            AND pm1.meta_value = 'some_value'
    ";

    return $join . ' ' . $new_join;
}

এবং আপনার যদি আরও যাচাইকরণ এবং নিয়মগুলির প্রয়োজন হয় তবে আপনি posts_whereফিল্টারটিও ব্যবহার করতে পারেন ।


3
একই পদ্ধতিতে মনে হচ্ছে @ এসক্রিবু কোর ট্রাকে পরামর্শ দিয়েছেন: core.trac.wordpress.org/ticket/20312
অ্যান্ড্রু ওড্রি

@ অ্যান্ড্রু ওদ্রি এটি একই তবে এটি =) নয়
ভিমাসুচেটো

1

এদিকে এটি সম্ভব, উদাহরণ এবং ব্যাখ্যা সহ ডকুমেন্টেশন দেখুন:

https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

এবং অন্য একটি উদাহরণ https://wordpress.org/support/topic/wp_query-with-mpleple-meta_query/#post-9410992

'meta_query'  => array(
    'relation' => 'OR',
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 1,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 3000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    ),
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 3001,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 6000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    )
),
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.