আমি কীভাবে মেটা_ফিল্ড হিসাবে একটি অ্যারের সাথে একটি মেটা_কোয়ারি তৈরি করতে পারি?


16

আমার প্রশ্নের জন্য নিবন্ধগুলি এখানে:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
        )
    )
);

এই কাজ করে যখন topicsএকটি স্ট্রিং, কিন্তু না এটা একটি অ্যারের যখন। আমি topicsউদাহরণস্বরূপ যখন এই ক্যোয়ারী কাজ করতে চাইarray( 'sports', 'nonprofit', etc. )

মেটা_কি হিসাবে অ্যারে দিয়ে মেটা প্রশ্নগুলি তৈরি করার কোনও উপায় আছে কি?


দয়া করে পরিষ্কার করুন - আপনার অর্থ কি "বিষয়" এর সঞ্চিত মানটি একটি অ্যারে? অথবা যে সঞ্চিত মানটি একটি স্ট্রিং এবং আপনি কোনও অ্যারেতে একাধিক পদ ক্যোয়ারিতে পাস করতে চান?
ম্যাথসম্যাথ

@ ম্যাথসম্যাট, আমার অর্থ হ'ল সঞ্চিত মানটি একটি অ্যারে।
মাইকে 23

উত্তর:


31

কোয়েরিকে সম্ভাব্য মানগুলির একটি অ্যারে খাওয়ানো

ডাটাবেসের মানটি যদি একটি স্ট্রিং হয় এবং আপনি কোয়েরিকে বেশ কয়েকটি মান ফিড করতে চান:

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => array ( 'sports', 'nonprofit', 'community' ),
            'compare' => 'IN'
        )
    )
);

ডেটার ক্রমিকায়িত অ্যারেতে একটি নির্দিষ্ট মান সন্ধান করা

যদি ডাটাবেসের মানটি বেশ কয়েকটি বিষয়ের একটি অ্যারে হয় এবং আপনি সেই অ্যারের মধ্যে একটি একক বিষয় অনুসন্ধান করতে চান (দ্রষ্টব্য যে ডাটাবেসে কোনও অ্যারে যেমন পুনরুদ্ধার করা যায়, তবে ডাটাবেসে ক্রমিক আকারে থাকে যা একটি স্ট্রিং এছাড়াও):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

তুলনামূলক মান হিসাবে 'লাইক' ব্যবহার করা কোনও নির্দেশের মতো পরিষ্কার-কাট নয়, যা আপনি আশা করেছিলেন, তবে এটিই সবচেয়ে ভাল বিকল্প।

তার পরে, আপনার কেবলমাত্র অন্য বিকল্পটি হ'ল মেটা_কি "বিষয়" সেট থাকা সমস্ত পোস্টগুলি পুনরুদ্ধার করা হবে এবং ম্যানুয়ালি সেগুলির উপরে পুনরাবৃত্তি করা হবে বা অন্য কথায় লুপের মধ্যে মানটি পরীক্ষা করে এবং বর্ণিত শর্তে পোস্টগুলি প্রদর্শন করা হবে।


14

জোহানেসের প্রতিক্রিয়া থেকে দূরে যেতে, যেহেতু এটি একটি সিরিয়ালযুক্ত অ্যারে, আপনি যদি ব্যবহারকারী আইডির (যা আমার ক্ষেত্রে ছিল) এর মতো কিছু সঞ্চয় করে রাখেন তবে আপনার এটিকে কিছুটা ভিন্নভাবে পরিচালনা করতে হবে।

পোস্ট মেটা সংরক্ষণ করা হচ্ছে যেমন:

array( "1", "23", "99");

সুতরাং হ্যাঁ তারা পূর্ণসংখ্যা কিন্তু update_post_metaতাদের মাধ্যমে স্ট্রিং হিসাবে সংরক্ষণ করা হয়েছিল।

'meta_query' => array(
            array(
                    'key'     => 'my_meta_key',
                    'value'   => serialize( strval( 1 ) ),
                    'compare' => 'LIKE'
                )
            )

সুতরাং আপনি যা খুঁজছেন তার সিরিয়ালযুক্ত স্ট্রিং সংস্করণের সাথে আসলে একটি পছন্দ তুলনা করছেন। এই জাতীয় কিছু কাজ করার চেষ্টা করার জন্য আমি বেশ কয়েক ঘন্টা ব্যয় করেছি এবং এখন পর্যন্ত এটি আমার পক্ষে সেরা could


সিরিয়ালাইজ (স্ট্রভাল (1)) আমার সমস্যার সমাধান করেছে, ধন্যবাদ
বেহজাদ 20

আজ সুযোগ পেয়ে এই পুরানো উত্তর জুড়ে এসেছেন। আমি আপনার সংযোজন পছন্দ। +1
জোহানেস পিল 6

আমি ঠিক এটির পাশাপাশি এসেছি, আমার জিনিসটি হ'ল আমাকে এমন সমস্ত পোস্টগুলি পাওয়া দরকার যেখানে ইউজার_আইডি অ্যারে না থাকে তবে উপরের সমাধানটি কাজ করে না তাই আমি এটি এটি তৈরি করেছি: 'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) ) কারণ সিরিয়াল করা হলে সমস্ত মানগুলি সংরক্ষণ করা হয়: ' : VALUE; '
ববজ

4

@ এসমাইলসের উত্তর থেকে আর একটি সামান্য উন্নতি।

আমার ক্ষেত্রে এমন ঘটনা ঘটেছে যেখানে আইডি দুটি স্ট্রিং হিসাবে সংরক্ষণ করা হয়েছে (যেমন কোনও ফর্ম ইনপুট থেকে নেওয়া হয়েছিল) এবং পূর্ণসংখ্যা হিসাবে (যেমন update_post_meta($post_id, authorized_users', array(get_current_user_id()));)। এটি একধরনের সুপরিচিত ইস্যুর মতো wp_set_object_terms()যেখানে আপনি শর্তাদি সেট করতে টার্ম আইডি ব্যবহার করতে পারেন, তবে আপনি যদি প্রথমে তাদের পূর্ণসংখ্যার হিসাবে না ফেলে থাকেন তবে আপনি তাদের নাম হিসাবে এই সংখ্যাগুলির সাথে নতুন পদ তৈরি করার প্রায় 50% সম্ভাবনা রাখবেন পরিবর্তে.

এর ফলে সেগুলিকে সিরিয়ালযুক্ত অ্যারেতে আলাদাভাবে সংরক্ষণ করা হতে পারে, যেমনটি আমার পরীক্ষার সাইটের ডাটাবেস থেকে ঠিক এরকম কেসের অংশ থেকে পাওয়া যায়:

a:1:{i:0;s:1:"1";} // 's' for 'string', also note the double quotes
a:1:{i:0;i:1;} // 'i' for 'integer', no quotes

উপরের উভয়টি, যখন খাওয়ানো print_r()হবে ততক্ষণ রেন্ডার হবে

Array
(
    [0] => 1
)

এটি ঠিক করার জন্য, আমি কোয়েরির meta_queryএকটি relationএবং অন্য সংস্করণ যুক্ত করে একটি সামান্য ঝাঁকুনি দিয়েছি যা স্ট্রিংয়ের পরিবর্তে পূর্ণসংখ্যা হিসাবে মানটি ফেলে।

এখানে চূড়ান্ত ফলাফল:

        'meta_query' => array(
            'relation' => 'OR', // Lets it know that either of the following is acceptable
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(strval(get_current_user_id())), // Saved as string
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(intval(get_current_user_id())), // Saved as integer
                'compare' => 'LIKE'
            ),
        ),

সম্পাদনা: ঠিক বুঝতে পেরেছি যে এই পদ্ধতিটি অ্যারে সূচকগুলির সাথে সংঘর্ষের ঝুঁকি চালাতে পারে, যার ফলে যদি তারা অ্যারেতে না থাকে তবে উপকরণগুলিতে অবৈধ অ্যাক্সেসের অনুমতি দিতে পারে, তবে তাদের ব্যবহারকারীর আইডি সূচক হিসাবে উপস্থিত হয়। যেমন, যখন এই কাজ যদি আপনার সমস্যা আলোচনা করেছি, ভাল অনুশীলন তা নিশ্চিত করার জন্য কোনো মান আপনার জন্য তাদের যাতে আপনি @sMyles 'পদ্ধতি পরিবর্তে ব্যবহার করতে পারেন সংরক্ষণ করার পূর্বে স্ট্রিং হিসাবে নিক্ষেপ করা হয় অনুসন্ধান করতে চান হয়।


এটি নির্বাচিত উত্তর হওয়া উচিত, সবচেয়ে নির্ভরযোগ্য
আমিন

2

আমি জোহানেস এর জবাব চাই। যাইহোক, আমি এটি উন্নত করতে চাই কারণ সেই মেটা_কিউরি ব্যবহার করে, আপনি এরকম একটি মামলার দেখা পাবেন

আপনার মান হয়

array('sports','movies', 'sports2');

আপনি যখন অনুসন্ধান

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

তারপরে ফলাফলটি 'ক্রীড়া' এবং 'স্পোর্ট 2' উভয়ই ফিরিয়ে দেবে।

এটি ঠিক করতে মেটা_কোয়ারি আরগগুলিকে রূপান্তর করুন

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports";',
            'compare' => 'LIKE'
        )
    )
);

এর কারণ এটি ডাটাবেসে মানটি ক্রমিকায়িত হয় এবং প্রতিটি আইটেম একটি সেমিকোলন দ্বারা পৃথক করা হবে। সুতরাং, উপরের আরগগুলি কাজ করবে

যদি মানগুলির আইটেমগুলির সংখ্যা হয় তবে আপনাকে কেবল দ্বিগুণ উদ্ধৃতিটি সরিয়ে ফেলতে হবে "

$args = array(
        'post_type' => 'news',
        'meta_query' => array(
            array(
                'key' => 'topics',
                'value' => '1;',
                'compare' => 'LIKE'
            )
        )
    );

1

আমি আজ কিছু অনুরূপ সঙ্গে আটকে। আমাকে একাধিক সম্পর্কিত ব্যবহারকারী (অ্যারে) এর সাথে এসিএফ (অ্যাডভান্সড কাস্টম ফিল্ডস) সম্পর্ক ক্ষেত্রটি জিজ্ঞাসা করতে হবে।

পিএইচপি এর মাধ্যমে ক্ষেত্রটি আপডেট করার পরে ক্যোয়ারি কার্যকর হয়নি। এটি ACF UI এর মাধ্যমে আপডেট করার পরে ক্যোয়ারী কাজ করেছিল।

সমস্যাটি ছিল, আমার পিএইচপি কোডটি সম্পর্কের মানগুলিকে আন্তঃ-মান হিসাবে সেট করে, ইউআই এটি স্ট্রিং-মানগুলিতে সেট করে। উভয় কাজ নিশ্চিত করার জন্য আমি এই কোয়েরিটি এখনই ব্যবহার করি (এখানে উদাহরণের সাথে লাগানো):

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'topics',
            'value' => '1;',  // works for int-array
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'topics',
            'value' => '"1"',  // works for string-array
            'compare' => 'LIKE'
        ),
    )
);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.