সিরিয়ালাইজ অ্যারে হিসাবে মেটা মানগুলির সাথে মেটা_কোয়ারি


37

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

<p> 
    <label for="latitude">Latitude:</label><br /> 
    <input type="text" id="latitude" name="coordinates[latitude]" class="full-width" value="" /> 
</p> 
<p>     
    <label for="longitude">Longitude:</label><br /> 
    <input type="text" id="longitude" name="coordinates[longitude]" class="full-width" value="" /> 
</p>

যে কারণেই হোক না কেন, প্রতিটি মেটাবক্সের জন্য একটি একক পোস্টমেটা এন্ট্রি থাকার ধারণাটি আমি পছন্দ করেছি। উপর save_postহুক, আমি রক্ষা তথ্য এত পছন্দ:

update_post_meta($post_id, '_coordinates', $_POST['coordinates']);

আমি এটি করেছি কারণ আমার তিনটি মেটাবক্স রয়েছে এবং আমি প্রতিটি পোস্টের জন্য 3 টি পোস্টমেটা মান পছন্দ করি; যাইহোক, আমি এখন এটি দিয়ে একটি সম্ভাব্য সমস্যা বুঝতে পেরেছি। এই মেটা মানগুলির উপর ভিত্তি করে নির্দিষ্ট পোস্টগুলি কেবল টেনে আনতে আমি WP_Query ব্যবহার করতে চাই। উদাহরণস্বরূপ, আমি 50% এর উপরে অক্ষাংশ মানের সমস্ত পোস্ট পেতে latitudeচাইব।

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => '50',
            'compare' => '>'
        )
    )
 );
$query = new WP_Query( $args );

যেহেতু _coordinatesপোস্টমেটার অংশ হিসাবে আমার কাছে অক্ষাংশ আছে, এটি কাজ করবে না।

সুতরাং, আমার প্রশ্নটি হল, meta_queryএই দৃশ্যে আমার মতো সিরিয়ালযুক্ত অ্যারেটি অনুসন্ধান করার জন্য কি কোনও উপায় আছে?

উত্তর:


37

না, এটি সম্ভব নয় এবং এটি বিপজ্জনকও হতে পারে।

আমি আপনাকে দৃ strongly়ভাবে পরামর্শ দিচ্ছি যে আপনি আপনার ডেটা আনসিরিয়ালাইজ করুন এবং আপনার সংরক্ষণের রুটিনটি সংশোধন করুন। এর অনুরূপ কিছুতে আপনার ডেটাটিকে নতুন ফর্ম্যাটে রূপান্তর করা উচিত:

$args = array(
    'post_type' => 'my-post-type',
    'meta_key' => '_coordinates',
    'posts_per_page' => -1
 );
$query = new WP_Query( $args );
if($query->have_posts()){
    while($query->have_posts()){
        $query->the_post();
        $c = get_post_meta($post->id,'_coordinates',true);
        add_post_meta($post->ID,'_longitude',$c['longitude']);
        add_post_meta($post->ID,'_latitude',$c['latitude']);
        delete_post_meta($post->ID,'_coordinates',$c);
    }
}

তারপরে স্বতন্ত্র কীগুলির সাথে আপনি যেমন চান তেমন প্রশ্ন করতে সক্ষম হবেন

আপনার যদি একাধিক দ্রাঘিমাংশ এবং একাধিক অক্ষাংশ সংরক্ষণ করতে হয় তবে আপনি একই নামে একাধিক পোস্ট মেটা সংরক্ষণ করতে পারেন। কেবলমাত্র তৃতীয় প্যারামিটার ব্যবহার করুন get_post_metaএবং এটি তাদেরকে অ্যারে হিসাবে ফিরিয়ে দেবে

সিরিয়ালযুক্ত ডেটার ভিতরে আপনি কেন জিজ্ঞাসা করতে পারবেন না?

মাইএসকিউএল এটিকে কেবল একটি স্ট্রিং হিসাবে দেখে এবং এটি কাঠামোগত ডেটাতে আলাদা করতে পারে না। কাঠামোগত ডেটাতে এটিকে বিচ্ছিন্ন করা উপরের কোডটি ঠিক কী করে

আপনি তারিখের আংশিক অংশগুলির জন্য জিজ্ঞাসা করতে সক্ষম হতে পারেন, তবে এটি সুপার অবিশ্বাস্য, ব্যয়বহুল, ধীর এবং খুব ভঙ্গুর হবে, প্রচুর প্রান্তের ক্ষেত্রে। সিরিয়ালযুক্ত ডেটা এসকিউএল প্রশ্নের জন্য নয়, নিয়মিত এবং ধ্রুবক উপায়ে ফর্ম্যাট করা হয় না।

আংশিক স্ট্রিং অনুসন্ধানগুলির ব্যয় বাদে, পোস্ট মেটা অনুসন্ধানগুলি ধীর গতিতে রয়েছে এবং সিরিয়ালযুক্ত তথ্যগুলি সামগ্রীর দৈর্ঘ্যের মতো বিষয়গুলির উপর নির্ভর করে পরিবর্তিত হতে পারে, অনুসন্ধানগুলি অবিশ্বাস্য ব্যয়বহুল করে তোলে, যদি আপনি যে মানটি অনুসন্ধান করছেন তার উপর নির্ভর করে অসম্ভব না হয়

মেটাতে সিরিয়ালযুক্ত অবজেক্ট হিসাবে রেকর্ডস / সত্তা / অবজেক্টগুলিকে সংরক্ষণ করার বিষয়ে একটি নোট

আপনি পোস্ট মেটাতে লেনদেনের রেকর্ড, বা ব্যবহারকারীর মেটাতে অন্য কোনও ধরণের ডেটা স্ট্রাকচার সংরক্ষণ করতে চান, তারপরে উপরের সমস্যাটিতে চলে আসুন।

সমাধান এখানে পৃথক পোস্ট মেটাতে ছড়িয়ে দেওয়া নয়, তবে বুঝতে হবে এটি কখনই শুরু হওয়া উচিত ছিল না, তবে একটি কাস্টম পোস্ট টাইপ। উদাহরণস্বরূপ, একটি লগ বা রেকর্ড একটি কাস্টম পোস্ট ধরণের হতে পারে, পিতামাতার হিসাবে মূল পোস্ট সহ, বা একটি ট্যাক্সনোমি পদের মাধ্যমে যোগদান

সুরক্ষা এবং সিরিয়ালাইজড অবজেক্টস

serializeক্রিয়াকলাপের মাধ্যমে সিরিয়ালযুক্ত পিএইচপি অবজেক্টগুলি সংরক্ষণ করা বিপজ্জনক হতে পারে , যা দুর্ভাগ্যজনক যে ওয়ার্ডপ্রেসে কোনও বস্তুর পাস করার অর্থ এটি সিরিয়ালায়িত হয়ে যায়। এটি কারণ যখন বস্তুটি ডি-সিরিয়ালযুক্ত করা হয় তখন একটি বস্তু তৈরি হয় এবং তার সমস্ত ঘুম থেকে ওঠার পদ্ধতি এবং নির্মাণকারী কার্যকর হয় exec এটি কোনও বৃহত্তর চুক্তির মতো না বলে মনে হতে পারে যতক্ষণ না কোনও ব্যবহারকারী সাবধানতার সাথে তৈরি কারুকর্মিত ইনপুটটি ঝাঁকুনির ব্যবস্থা করে, যখন ডেটাবেস থেকে ডেটা পাঠ করা হয় এবং ওয়ার্ডপ্রেস দ্বারা ডি-সিরিয়াল করা হয় তখন রিমোট কোড প্রয়োগের দিকে পরিচালিত করে।

এটি পরিবর্তে জেএসএন ব্যবহার করে এড়ানো যায়, যা প্রশ্নগুলি আরও সহজ করে তোলে তবে কেবলমাত্র সঠিকভাবে ডেটা সঞ্চয় করা এবং কাঠামোগত সিরিয়ালযুক্ত ডেটা শুরু করা এড়াতে এটি অনেক সহজ / দ্রুত।


5
পাশ কাটিয়ে যাওয়া লোকদের জন্য, পড়া বন্ধ করবেন না: আরও দরকারী (এবং সাম্প্রতিক) উত্তর নীচে পাওয়া গেছে
এরেনোর পাজ

আমার যদি সংরক্ষণ করার জন্য আইডিগুলির একটি অ্যারে থাকে - এবং তারা প্রত্যেকে আলাদা আলাদা কী উপস্থাপন করে না যা আমি তাদেরকে 'অক্ষাংশ' ইত্যাদির মতো সংরক্ষণ করতে পারি, এটি সবার জন্য কেবল একটি কী (যেমন সম্পর্ক সংরক্ষণের সময় ইত্যাদি)। তাহলে কি করব? @ রাবনি এর সমাধান?
ট্রিনোসিস

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

24

আমিও এই পরিস্থিতিতে পড়েছি। এখানে আমি কি করেছি:

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => sprintf(':"%s";', $value),
            'compare' => 'LIKE'
        )
    )
);

এই সাহায্য আশা করি


1
আমি এই সমাধানটি সত্যিই পছন্দ করেছি। দুর্ভাগ্যক্রমে, যখন এটি $valueআইডি হয় তখন এটি প্রযোজ্য নয় । সেক্ষেত্রে, আমি ডেটা সংরক্ষণ করার আগে প্রতিটি অ্যারে উপাদানটিতে একটি অক্ষর যুক্ত করার জন্য এবং ডেটা ব্যবহারের আগে অক্ষরটি অপসারণ করার জন্য অন্য একটি ফাংশনটিতে ফাংশন তৈরির পরামর্শ দিই। এই ওয়াট, সিরিয়ালযুক্ত i:2সূচকটি i:D2"আসল" ডেটার সাথে বিভ্রান্ত হবে না । এরপরে মেটা ক্যোয়ারী প্যারামিটারটি হওয়া উচিত 'value' => sprintf(':"D%s";', $value),এবং আপনি এই দুর্দান্ত উত্তরটির সঠিক কার্যকারিতা রাখবেন!
এরেনর পাজ

এই সমাধানটি আমার পক্ষে কাজ করছে
বিশাল

এটি আমার পক্ষেও পুরোপুরি কাজ করেছিল। যদিও আমি গৃহীত সমাধানটি দেখেছি তখনও একটি ক্ষুদ্র আতঙ্কের সৃষ্টি হয়েছিল
শেন জোন্স

@ ইরেনোর পাজ, আমি সবেমাত্র একটি সমাধান পোস্ট করেছি যা আইডি এবং স্ট্রিং উভয়ের সাথেই ভাল কাজ করে: ওয়ার্ডপ্রেস.স্ট্যাকেক্সচেঞ্জ
পাবলো এসজি পাচেকো

ব্যবহার LIKEআপনার সার্ভার ডাউন (মিথ্যা পজিটিভ উল্লেখ না) আপনি ভাল একটি খুব ভাল ক্যাশে আছে আনতে একটি মহান এবং দ্রুত উপায়।
মার্ক কপলুন

10

আপনি ডাব্লুপি ডেটাবেজে প্রবেশের সিরিয়াল করার সময় আপনার কার্যত কোনও দক্ষ পদ্ধতিতে ক্যোয়ারী করার ক্ষমতা হারাবেন।

সিরিয়ালাইজেশন দ্বারা আপনি অর্জন করছেন এমন সামগ্রিক কর্মক্ষমতা সংরক্ষণ এবং লাভ যে কোনও বৃহত পরিমাণে লক্ষণীয় হবে না। আপনি কিছুটা ছোট ডাটাবেস আকার পেতে পারেন তবে এসকিউএল লেনদেনের জন্য ব্যয় ভারী হতে চলেছে যদি আপনি যদি কখনও সেগুলি জিজ্ঞাসা করেন এবং কোনও কার্যকর, অর্থবহ উপায়ে তাদের তুলনা করার চেষ্টা করেন।

পরিবর্তে, সেই প্রকৃতিতে কোয়েরি করার আপনার ইচ্ছা নেই এমন ডেটার জন্য সিরিয়ালাইজেশন সংরক্ষণ করুন, তবে কেবলমাত্র ডাব্লুপিআই এপিআই কল দ্বারা প্যাসিভ ফ্যাশনে অ্যাক্সেস get_post_meta()করতে পারবেন - সেই ফাংশন থেকে আপনি এর অ্যারের বৈশিষ্ট্যগুলিতে অ্যাক্সেস পাওয়ার জন্য সিরিয়ালযুক্ত এন্ট্রি আনপ্যাক করতে পারেন।

আসলে হিসাবে সত্য হিসাবে মান নির্ধারিত ;

$meta = get_post_meta( $post->ID, 'key', true );

অ্যারে হিসাবে ডেটা ফেরত দেবে, আপনার স্বাভাবিক হিসাবে পুনরাবৃত্তি করার জন্য অ্যাক্সেসযোগ্য।

আপনি অন্যান্য ডাটাবেস / সাইট অপ্টিমাইজেশনের উপর ফোকাস করতে পারেন যেমন ক্যাচিং, সিএসএস এবং জেএস মিনিফিকেশন এবং আপনার প্রয়োজন হলে এই জাতীয় পরিষেবাগুলি সিডিএন হিসাবে ব্যবহার করে। নাম রাখুন তবে কয়েকটি .... ওয়ার্ডপ্রেস কোডেক্স সেই বিষয়ে আরও উদঘাটন করার জন্য একটি ভাল সূচনা পয়েন্ট: এখানে ER


3

আমি কেবল সিরিয়ালযুক্ত ক্ষেত্রগুলির সাথে চুক্তি করেছি এবং সেগুলি অনুসন্ধান করতে পারি। মেটা_কিউরি ব্যবহার না করে একটি এসকিউএল কোয়েরি ব্যবহার করে।

global $wpdb; 

$search = serialize('latitude').serialize(50);

$query = $wpdb->prepare("SELECT `post_id`
FROM `wp_postmeta`
WHERE `post_id` IN (SELECT `ID` FROM `wp_posts` WHERE `post_type` = 'my-post-type')
AND `meta_key` = '_coordinates'
AND `meta_value` LIKE '%s'",'%'.$search.'%');

$ids = $wpdb->get_col($query);

$args = array(
    'post__in' => $ids
    'post_type' => 'team' //add the type because the default will be 'post'
);

$posts = get_posts($args);

কোয়েরিটি প্রথম পোস্টের সাথে মেলে পোস্ট_ টাইপের সাথে অনুসন্ধান করে তাই wp_postmeta রেকর্ডের পরিমাণ ফিল্টার করতে কম হবে to তারপরে আমি আরও ফিল্টার করে সারিগুলি আরও কমাতে একটি বিবৃতি যুক্ত করেছিmeta_key

আইডিগুলি get_posts জন্য প্রয়োজনীয় হিসাবে একটি অ্যারে সুন্দরভাবে শেষ হয়।

গীত। ভাল সাবকিউরি পারফরম্যান্সের জন্য মাইএসকিউএল ভি 5.6 বা তার বেশি প্রয়োজন


1

এই উদাহরণটি আমাকে সত্যিই সাহায্য করেছিল। এটি বিশেষত এস 2 মেম্বার্স প্লাগইনের জন্য (যা ব্যবহারকারী মেটাডেটা সিরিয়ালাইজ করে)। তবে এটি আপনাকে মেটা_কির মধ্যে সিরিয়ালযুক্ত অ্যারের অংশটি জিজ্ঞাসা করতে দেয় allows

এটি মাইএসকিউএল আরজিএক্সএক্সপি ফাংশনটি ব্যবহার করে কাজ করে।

উত্স এখানে

এখানে কোডটি যা মার্কিন যুক্তরাষ্ট্রে বসবাসকারী সকল ব্যবহারকারীকে জিজ্ঞাসা করে। আমি আমার কাস্টম নিবন্ধের ক্ষেত্রগুলির মধ্যে একটিকে জিজ্ঞাসা করতে খুব সহজেই এটি সংশোধন করেছিলাম এবং এটি কোনও সময়েই কাজ করে না।

  <?php
global $wpdb;
$users = $wpdb->get_results ("SELECT `user_id` as `ID` FROM `" . $wpdb->usermeta . 
          "` WHERE `meta_key` = '" . $wpdb->prefix . "s2member_custom_fields' AND 
           `meta_value` REGEXP '.*\"country_code\";s:[0-9]+:\"US\".*'");
if (is_array ($users) && count ($users) > 0)
    {
        foreach ($users as $user)
            {
                $user = /* Get full User object now. */ new WP_User ($user->ID);
                print_r($user); /* Get a full list of properties when/if debugging. */
            }
    }
?>

1

আমি মনে করি যে 2 টি সমাধান রয়েছে যা স্ট্রিং এবং ইন্টিজার উভয় হিসাবে সঞ্চিত ফলাফলের সমস্যার সমাধানের চেষ্টা করতে পারে। তবে এটি বলা বাহুল্য, অন্যরা যেমন উল্লেখ করেছেন, এটি পূর্ণসংখ্যার হিসাবে সঞ্চিত ফলাফলের অখণ্ডতার গ্যারান্টি দেওয়া সম্ভব নয়, কারণ এই মানগুলি সিরিয়ালযুক্ত অ্যারে হিসাবে সংরক্ষণ করা হয়, সূচক এবং মানগুলি একই প্যাটার্নের সাথে হুবহু সঞ্চিত থাকে। উদাহরণ:

array(37,87);

এটি সিরিয়ালযুক্ত অ্যারে হিসাবে সংরক্ষণ করা হয়

a:2:{i:0;i:37;i:1;i:87;}

i:0অ্যারের প্রথম অবস্থান এবং i:37প্রথম মান হিসাবে নোট করুন । প্যাটার্ন একই। তবে এর সমাধানে যাওয়া যাক


1) REGEXP সমাধান

এই সমাধানটি মেটা মানকে স্ট্রিং বা নম্বর / আইডি হিসাবে সংরক্ষণ না করেই আমার পক্ষে কাজ করে। তবে এটি ব্যবহার করে REGEXP, যা ব্যবহারের মতো দ্রুত নয়LIKE

$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => '\;i\:' . $value . '\;|\"' . $value . '\";',
            'compare' => 'REGEXP'
        )
    )
);

2) সমাধান পছন্দ

আমি পারফরম্যান্সের পার্থক্য সম্পর্কে নিশ্চিত নই তবে এটি এমন একটি সমাধান যা ব্যবহার করে LIKEএবং সংখ্যা এবং স্ট্রিং উভয়ের জন্যই কাজ করে

 $args = array(
        'post_type' => 'my-post-type',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'latitude',
                'value' => sprintf(':"%s";', $value),
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'latitude',
                'value' => sprintf(';i:%d;', $value),
                'compare' => 'LIKE'
            )
        )
    );

REGEXPনির্দিষ্ট পরিস্থিতিতে দুর্দান্ত, তবে আপনি যদি LIKEএটি ব্যবহার করতে পারেন তবে আমার কাছে মনে হয় এটি পছন্দনীয় পদ্ধতি। একটি পুরানো লিঙ্ক, তবে এখনও আমার মতে এটি বেশ কার্যকর: thingsilearn.wordpress.com/2008/02/28/… :-)
এরেনোর পাজ

@ ErenorPaz আপনি ঠিক বলেছেন LIKEদ্রুততর. তবে এটি এমন একটি সমাধান যা উভয় স্ট্রিং এবং সংখ্যাগুলির জন্য কাজ করে
পাবলো এসজি পাচেকো

হ্যাঁ ... সুতরাং, উত্তরটি (সর্বদা হিসাবে): পরিস্থিতির উপর নির্ভর করে, যদি আপনি "লাইক" ব্যবহার করতে পারেন; এটি অগ্রাধিকারযোগ্য, অন্যথায় REGEXP পাশাপাশি করবে :-)
এরেনর পাজ

@ ইরেনোরপাজ, আমি আমার উত্তরটি সম্পাদনা করে একটি নতুন সমাধান যুক্ত করেছি যা ব্যবহার করে LIKEতবে সংখ্যা এবং স্ট্রিং উভয়ের জন্যই কাজ করে। আমি পারফরম্যান্স সম্পর্কে নিশ্চিত নই কারণ এটি ব্যবহার করে ফলাফলগুলির তুলনা করতে হবেOR
পাবলো এসজি পাচেকো

একদম !!! যা আমার এভাবে ফলাফল পেতে হবে .... ধন্যবাদ ম্যান !!!
কুলদীপ মাকাদিয়া

0

WP_Queryসিরিয়ালযুক্ত অ্যারে দ্বারা ফিল্টারিং চালনার জন্য একগুচ্ছ টিপস পড়ার পরে , আমি শেষ পর্যন্ত এটি কীভাবে করেছি: অনুরোধকৃত মানটির জন্য কমা পৃথকীকরণ তালিকার সন্ধানের জন্য $wpdbকাস্টম এসকিউএল ক্যোয়ারীর সাথে মিলিত করে কমা বিভাজিত মানগুলির একটি অ্যারে তৈরি করে FIND_IN_SET

(এটি টমাসের উত্তরের মতো, তবে এসকিউএল কোয়েরির জন্য এটি কিছুটা কম পারফরম্যান্স)

ফাংশন.এফপি ইন:

আপনার ফাংশন.এফপি ফাইলটিতে (বা যেখানে আপনি মেটা বক্স সেটআপ করছেন) yourname_save_post()ফাংশনটি ব্যবহার করুন

update_post_meta($post->ID, 'checkboxArray', implode(",", $checkboxArray)); //adding the implode

কমা দ্বারা পৃথক মান সহ অ্যারে তৈরি করতে।

আপনি yourname_post_meta()অ্যাডমিন মেটা বক্স নির্মাণ ফাংশনে আপনার আউটপুট পরিবর্তনশীলটিও পরিবর্তন করতে চান

$checkboxArray = explode(",", get_post_custom($post->ID)["checkboxArray"][0]); //adding the explode

২. টেমপ্লেটে পিএইচপি ফাইল:

পরীক্ষা: আপনি যদি একটি চালনা করেন তবে আপনাকে সিরিয়ালযুক্ত অ্যারের পরিবর্তে আপনার কমা দ্বারা পৃথক করা মান রয়েছে এমন একটি অ্যারে হিসাবে get_post_meta( $id );দেখতে checkboxArrayহবে।

এখন, আমরা ব্যবহার করে আমাদের কাস্টম এসকিউএল কোয়েরি তৈরি করি $wpdb

global $wpdb;

$search = $post->ID;

$query = "SELECT * FROM wp_posts
          WHERE FIND_IN_SET( $search, (
              SELECT wp_postmeta.meta_value FROM wp_postmeta
              WHERE wp_postmeta.meta_key = 'blogLocations'
              AND wp_postmeta.post_id = wp_posts.ID )
          )
          AND ( wp_posts.post_type = 'post' )
          AND ( wp_posts.post_status = 'publish' );";

$posts = $wpdb->get_results($query);

foreach ($posts as $post) {
    //your post content here
}

লক্ষ্য করুন FIND_IN_SET, সেখানে যাদুটি ঘটে।

এখন ... যেহেতু আমি ব্যবহার করছি SELECT *এই আয় পোস্ট তথ্য সব এবং মধ্যে foreachকি আপনি আপনি যে (ক না কাছ থেকে কি চান ইকো করতে print_r($posts);আপনি কি না জানি না অন্তর্ভুক্ত রয়েছে। এটা জন্য "লুপ" সেট আপ না আপনি (আমি এটি এটিকে পছন্দ করি) তবে আপনি সহজেই লুপটি সেট আপ করতে সংশোধন করতে পারেন আপনি যদি পছন্দ করেন ( setup_postdata($post);কোডেক্সে একবার দেখুন, আপনাকে SELECT *কেবল পোস্টের আইডি এবং $wpdb->get_resultsসঠিক $wpdbটাইপ নির্বাচন করতে পরিবর্তন করতে হবে - - সেই বিষয়ে $wpdbতথ্যের জন্য কোডেক্সও দেখুন )।

চাবুক, এটি কিছুটা প্রচেষ্টা নিয়েছে, তবে যেহেতু সিরিয়ালযুক্ত বা কমা দ্বারা পৃথক করা মানগুলি wp_queryসমর্থন করে না 'compare' => 'IN'এই শিমটি আপনার সেরা বিকল্প!

আশা করি এটি কাউকে সাহায্য করবে।


0

আপনি যদি likeনিজের মেটা ক্যোয়ারিতে তুলনা অপারেটরটি ব্যবহার করেন তবে এটি সিরিয়ালযুক্ত অ্যারের ভিতরে দেখতে ভাল কাজ করা উচিত।

$wp_user_search = new WP_User_Query(array(
    'meta_query' => array(
        array(
            'key'     => 'wp_capabilities',
            'value'   => 'subscriber',
            'compare' => 'not like'
            )
        )
    )
);

ফলাফল স্বরূপ:

[query_where] => WHERE 1=1 AND (
  ( wp_usermeta.meta_key = 'wp_capabilities' 
  AND CAST(wp_usermeta.meta_value AS CHAR) NOT LIKE '%subscriber%' )

0

যদি আমার মেটা ডেটা অ্যারের ধরণের হয় তবে আমি মেটা দ্বারা ক্যোয়ারির জন্য এই পদ্ধতিটি ব্যবহার করছি:

$args = array(
    'post_type' => 'fotobank',
    'posts_per_page' => -1,
    'meta_query' => array(
            array(
                   'key' => 'collections',
                   'value' => ':"'.$post->ID.'";',
                   'compare' => 'LIKE'
            )
     )
);
$fotos = new WP_Query($args);

এটি যখন কোনও পোস্ট আইডির
ক্রমিকযুক্ত

0

আমি উপরের উত্তরগুলি সম্পর্কে কৌতূহল পেয়েছি, যেখানে পরিবর্তে meta_queryকীটি টার্গেট করা হয়েছে । সিরিয়ালাইজড অ্যারের ভিতরে একটি নির্দিষ্ট কী টার্গেট করা যদি মেটা ক্যোয়ারিতে সত্যিই সম্ভব হয় তবে গিয়ে পরীক্ষা করতে হয়েছিল। :)latitude_coordinates

স্পষ্টত ঘটনাটি ছিল না।

সুতরাং, লক্ষ্য করুন যে লক্ষ্যটির সঠিক কী এর _coordinatesপরিবর্তে latitude

$args = array(
     'post_type' => 'my-post-type',
     'meta_query' => array(
         array(
             'key' => '_coordinates',
             'value' => sprintf(':"%s";', $value),
             'compare' => 'LIKE'
         )
     )
 );

নোট:

  1. এই পদ্ধতির ফলে কেবল সঠিক মিলগুলি লক্ষ্য করা সম্ভব হয়েছে। 50 এর চেয়ে বেশি সমস্ত অক্ষাংশের মতো জিনিসগুলি সম্ভব নয়।

  2. সাবস্ট্রিং ম্যাচগুলি অন্তর্ভুক্ত করতে, একটি ব্যবহার করতে পারে 'value' => sprintf(':"%%%s%%";', $value),। (পরীক্ষা করা হয়নি)


-1

আমারও একই প্রশ্ন. হয়তো আপনার 'টাইপ' প্যারামিটার দরকার? এই সম্পর্কিত প্রশ্নটি দেখুন: কাস্টম ফিল্ড ক্যোয়ারী - মেটা মান অ্যারে

সম্ভবত চেষ্টা করুন:

    gs আরোগুলি = অ্যারে (
    'post_type' => 'আমার পোস্ট-টাইপ',
    'মেটা_কিউরি' => অ্যারে (
        অ্যারে (
            'কী' => 'অক্ষাংশ',
            'মান' => '50',
            'তুলনা' => '>',
            'টাইপ' => 'সংখ্যাসূচক'
        )
    )
    );

পরামর্শের জন্য ধন্যবাদ, তবে আমি পরে যা করছি এটি ঠিক তা নয়। সমস্যাটি হ'ল আমি যে মানটির সাথে মেলে যাবার চেষ্টা করছি সেটি হ'ল একটি অ্যারের অংশ যা ডাটাবেসের মধ্যে ক্রমিক করা হয়।
টোলম্যান্জ

হ্যাঁ, আপনি ঠিক বলেছেন। আমি আজ সকালে এটি চেষ্টা করেছি এবং এটি আমার পক্ষেও কার্যকর হয়নি। আমি একই সমস্যা আছে। অ্যারে হিসাবে একটি মেটা কী এর মান সংরক্ষণ করা। আমি এটি শুরু করতে পারি না ভেবে শুরু করছি এবং এর পরিবর্তে আমি তাদের পৃথক মেটা ক্ষেত্র হিসাবে একই নামের সাথে সঞ্চয় করতে পারি ... এবং কেবল সেগুলি মুছতে / আপডেট করার ব্যবস্থা করি।
ব্যবহারকারী4356

@ user4356 ... আমি ঠিক তাই করতে যাচ্ছি। আমি প্রতিটি পোস্টের জন্য যে সারিগুলি সন্নিবেশ করবো তা হ্রাস করার আশাবাদী ছিলাম তবে আমি অনুমান করি যে এটি সম্ভব নয়।
টোলম্যান্জ

-1

ম্যাজিক ফিল্ডস প্লাগইন ব্যবহার করার সময় আমি একই জাতীয় কিছুতে ছুটে এসেছি। এটি কৌশলটি করতে পারে

$values_serialized = serialize(array('50'));
$args = array(
    'post_type' => 'my-post-type',
    'meta_query' => array(
        array(
            'key' => 'latitude',
            'value' => $values_serialized,
            'compare' => '>'
        )
    )
);

1
পরামর্শের জন্য ধন্যবাদ! আমি মনে করি এটি যতটা পেতে পারে তত কাছাকাছি, তবে এটি আসলে কাজ করবে না কারণ একটি সিরিয়ালযুক্ত অ্যারের সাথে অন্য সিরিয়ালযুক্ত অ্যারের সাথে তুলনা করা অর্থহীন নয় যতক্ষণ না আমি একটি সঠিক ম্যাচের সন্ধান করতাম for
টোলম্যান্জ

5
তাহলে এটিকে সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত নয় এবং এটি করা আপনার দায়িত্বহীন। সুতরাং সঠিক উত্তরটি হবে 'না, এটি সম্ভব নয়'
টম জে নোয়েল

1
সম্মত হন, এছাড়াও ডাব্লুপি আপনার জন্য সিরিয়ালাইজেশন পরিচালনা করে, serialize()এই উদাহরণে প্রয়োজন হয় না ...
অ্যাডাম

2
আসলে "ম্যাজিক ফিল্ডস" প্লাগইন ব্যবহার করে তিনি যা বলেছিলেন ঠিক তা করতে গিয়ে @ সেট-স্টিভেনসন উত্তরটি দুর্দান্ত। যেহেতু এই প্লাগইনটি ডেটা ডিফল্টভাবে নির্দিষ্ট ডেটা ধরণের সিরিয়ালাইজ করে, ঠিক একটি ম্যাচ করার সেরা উপায় এটি best
zmonteca

@ টমজেউওয়েল সম্পন্ন! আমাকে মাত্র 5 মাস সময় নিয়েছে;)
টোলম্যান্জ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.