বুলিয়ান সত্য / মিথ্যা মান সহ মেটা কোয়েরি


11

আমি প্রথমে ভাড়া দেওয়া হয়নি এমন সমস্ত সম্পত্তি দ্বারা এবং তারপরে বর্তমানে ভাড়া দেওয়া সমস্ত সম্পত্তি দ্বারা সমস্ত ভাড়া সম্পত্তি দেখানোর চেষ্টা করছি। ভাড়া দেওয়ার জন্য কাস্টম পোস্ট মেটা সহ একটি কাস্টম পোস্ট টাইপ 'ভাড়া' রয়েছে (_প্রাইস_রেটেড) যা একটি চেকবাক্স (যদি সত্য হয় বা মিথ্যা ... যদি এটি ভাড়া দেওয়া হয় তবে সত্য)। প্রথমে উপস্থিত (নন-ভাড়া) বৈশিষ্ট্যগুলি এবং তারপরে ভাড়া দেওয়া বৈশিষ্ট্য উপস্থিত রয়েছে এমন সমস্ত বৈশিষ্ট্য দেখানোর জন্য আমার ক্যোয়ারী পরিবর্তন করতে হবে।

এখানে আমার জিজ্ঞাসা:

$ts_properties = new WP_Query( 
    array( 
    'post_type' => 'rent', 
    'paged' => $paged, 
    'posts_per_page' => -1,
    'meta_key' => '_price_rented',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_query' => array(
        array(
        'key' => '_price_rented',
        'value' => false,
        'type' => 'BOOLEAN',
        ),
    ) 
) 
);

কিছু কারণে এই কোয়েরিতে ভাড়া দেওয়া সমস্ত বৈশিষ্ট্য দেখায়। যখন আমি মেটা_কোয়রিতে 'মিথ্যা' থেকে 'সত্য' তে মান পরিবর্তন করি তবে এটি কোনও বৈশিষ্ট্য দেখায় না।

সুতরাং, তখন আমি ভেবেছিলাম, রিটার্নের মানটি মিথ্যা (যে সম্পত্তিগুলি ভাড়া দেওয়া হয় তার জন্য) বা নুল (যে সম্পত্তিগুলির জন্য ভাড়া দেওয়া হয় না), তবে কীভাবে নূন্য ফলাফলের জন্য জিজ্ঞাসা করতে হবে তা নিশ্চিত নয় (মিথ্যা নয়), আমি একটি যুক্ত করেছি ' 'মেটা_কিউয়ের সাথে যুক্তিটির তুলনা করুন এবং মানটিকে'! = 'তে সেট করুন কিন্তু এটি কোনও কাজ করে নি।

সম্পাদনা: var_dump একটি উপলভ্য, নন-ভাড়া অ্যাপার্টমেন্টের জন্য নিম্নলিখিতগুলি প্রদান করে: string(0) ""এবং কোনও অ-উপলভ্য, ভাড়া, অ্যাপার্টমেন্টের জন্য:string(1) "1"


মান 1 এবং 0 সম্ভবত ব্যবহার করছেন?
রিক্যৌসিন

মেটা_কোয়েরি টাইপ => স্ট্রিং। সম্ভাব্য মানগুলি হ'ল 'অ্যাসেরিক', 'বিনারি', 'চার', 'তারিখ', 'তারিখটাইম', 'নির্ধারিত', 'স্বাক্ষরিত', 'সময়', 'অসম্পূর্ণ'। ডিফল্ট মান 'CHAR'।
আইমানুয়েল

@ রিরিক্যসিন: একটি '1' ব্যবহার করে সমস্ত ভাড়া দেওয়া সম্পত্তি ফিরে আসে, এবং '0' কোনও সম্পত্তি ফেরত দেয় না।
কেগান কুইম্বি

1
@ আইমানুয়েল: পরিবর্তনের ফলে মনে হচ্ছে এর কোনও প্রভাব নেই (আমি একই জিনিসটি ভেবেছিলাম)। আমি এই নিবন্ধটি থেকে দেখেছি: thethemefoundry.com/blog/…
কেগান কুইম্বি

1
_price_rentedআসলেই কি উভয় trueএবং falseমানগুলির জন্য সেট করা আছে , বা এটি কেবলমাত্র জন্য সেট করা আছে true? দয়া করে ডাটাবেস চেক করুন। আমি জিজ্ঞাসা করেছি কারণ একটি চেক করা চেক বাক্সটি একেবারেই পাস করা হয় নি POSTতাই আমি ভাবছি যে এই ক্ষেত্রেগুলির জন্য মানটি সেট করা ঠিক আছে কিনা।
s_ha_dum 15

উত্তর:


4

WP_Meta_Query মূলতে এটি কোনওভাবে "এতটা স্থিতিশীল নয়" অংশ এবং আপনি যদি ভেরির প্রতি বেশি মনোযোগ না দেন তবে এটি বিভ্রান্ত হওয়া থেকে সহজেই ভেঙে যেতে পারে।

যখন আপনি একটি করছেন new WP_Query()এবং meta_query => array()যুক্তি বা এর একক কী / মান জুটির সমতুল্য হন, তারপরে new WP_Meta_Query()তত্ক্ষণাত পার্সিংয়ের পরে লাফিয়ে।

$this->meta_query = new WP_Meta_Query();
$this->meta_query->parse_query_vars( $q );

অনুমোদিত মান

আপনি যখন মেটা ডেটা জিজ্ঞাসা করেন, তারপরে boolবিকল্প রয়েছে। এবং যদি আপনি এটি ব্যবহার করতে চান, তবে এটি আবার পড়ে যাবে CHAR, যা অনুমোদিত মানগুলির অ্যারে হিসাবে ডিফল্ট মান:

'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'

যেখানে NUMERICপুনরায় সেট করা হবে SIGNED

ডিবাগ

এমন অনেকগুলি ফিল্টার রয়েছে যা পোস্ট সংরক্ষণের প্রক্রিয়াটিকে প্রভাবিত করতে পারে, তাই প্রথম কাজটি হ'ল কিছু লুপের ভিতরে বিভিন্ন মানগুলি পরীক্ষা করা:

var_dump( get_post_meta( get_the_ID(), '_price_rented', true ) );

তারপর, ফেরত মান উপর নির্ভর করে, আপনি হয় ব্যবহার করতে হবে SIGNED, যদি ফল 0বা 1, বা "true"অথবা "false"যদি ফলাফলের একটি পংক্তি। যদি সত্যিই বুলিয়ান হয়, তাহলে আমি এখনও ব্যবহার করতে প্রস্তাব করব stringঠিক নিশ্চিত এটি পাস করতে $GLOBALS['wpdb'], যা শুধুমাত্র পাস করতে পারেন %sSTRING এবং %dমাধ্যমে অঙ্ক।

অতিরিক্ত নোট

আমি শুধু আপডেট হিসাবে জন্য কোডেক্স এন্ট্রিWP_Meta_Query আজ দেখলাম বিভিন্ন আউটপুট নির্মাণ করে চলেছি প্রচুর (অপ্রয়োজনীয় বহু পরিমাণে যোগ JOINSযার উপর আলোচনা করা হয়েছে, ট্র্যাক এখানে এবং এখানে দিয়ে আউট সম্ভব একটি একক প্যাচ কোর স্থানান্তরিত)। ( এখানেAND অংশগুলির জন্য টিকিট ফলোআপ করুন ) পয়েন্টটি হ'ল অ্যারে এবং এর সাবারিগুলির পাশাপাশি যুক্তির সংমিশ্রণ ব্যবহার করা সম্ভব । আপনি এটি ডাম্প না করলে ফলাফল বেশ অজানা, সুতরাং আইএমএইচও আপনি ইনপুট যুক্ত করার এক বা অন্য উপায় ব্যবহার না করেই ভাল । বিশেষত যখন আপনি কেবলmeta_*meta_queryব্যবহারের meta_keyফলে এটি কিছু ক্ষেত্রে "কী কেবলমাত্র প্রশ্নের জন্য" ফলাফল দেয়।

সমাধান

মতামত হিসাবে ইশারা:

(...) var_dumpউপলভ্য, নন-ভাড়া অ্যাপার্টমেন্টের জন্য নিম্নলিখিতগুলি প্রদান করে: string(0) ""এবং কোনও অ-উপলভ্য, ভাড়া, অ্যাপার্টমেন্টের জন্য:string(1) "1"

এখন meta_queryব্যবহার করতে হবে

'meta_query' => array( 'relation' => 'OR', array(
    'meta_key'     => '_price_rented',
    'meta_value'   => '1',
    'meta_compare' => '='
) );

আপনি যদি "অ উপলভ্য, ভাড়া নেওয়া অ্যাপার্টমেন্ট" পেতে চান বা '!='"অ ভাড়া দেওয়া" অ্যাপার্টমেন্টগুলি পুনরুদ্ধার করতে চান তবে

নোট: সম্ভাব্য মান meta_compareহয় '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP'বা 'RLIKE'। ডিফল্ট মান '='


3

আমি একই সমস্যার মুখোমুখি হয়েছি এবং অনুসন্ধানের এক ঘন্টা পরে মান "NOT EXISTS"এবং "EXISTS"মান খুঁজে পেয়েছি ( only in WP >= 3.5 )। সুতরাং একটি মেটা মান জিজ্ঞাসা করার দরকার নেই কেবল মেটা_কি উপস্থিত আছে কিনা তা পরীক্ষা করে দেখুন:

'meta_key'     =>   '_price_rented'  ,
'meta_compare' =>   'NOT EXISTS'     ,

এটা আমার জন্য নিখুঁতভাবে কাজ করছে।


3

টিএল; ডিআর: এই সমস্যাটি সম্ভবত বেশিরভাগ ক্ষেত্রে ঘটে যখন একটি বুলিয়ান ক্ষেত্রটি asচ্ছিক হিসাবে তৈরি করা হয়। আপনি এটি প্রয়োজনীয় করে বা ডিফল্ট কেসটি পুনরুদ্ধার করার জন্য আরও জটিল কোয়েরি ব্যবহার করে এটি ঠিক করতে পারেন।

আরো বিস্তারিত:

এখানে দুটি ডেটা উপস্থাপনের সমস্যা চলছে: একটি হ'ল ডেটা মানগুলি সত্য / মিথ্যা উপস্থাপনের জন্য ব্যবহার করা হচ্ছে এবং অন্যটি হল ক্ষেত্রটি আদৌ সংরক্ষণ করা হচ্ছে কিনা তা যদি ডিফল্ট (সাধারণত মিথ্যা) মান হয়।

পার্ট 1: আমি WP_Meta_Queryসত্য এবং মিথ্যা তুলনা করার জন্য উত্পন্ন এসকিউএলটির দিকে চেয়েছিলাম এবং দেখেছি যে এটি সত্যের জন্য '1' এবং মিথ্যা '"(খালি স্ট্রিং) এর বিকল্প দেয়। সুতরাং আপনি ডাটাবেজে যা কিছু লিখুন তার সাথে একমত হওয়া দরকার যদি আপনি প্রকৃত সত্য এবং মিথ্যা মানগুলির সাথে তুলনা করে কোয়েরি করেন। বিশেষত, আপনি মিথ্যা বলে '0' লিখতে চান না। পরিবর্তে 0 এবং 1 এর জন্য লিখিতভাবে এবং পরীক্ষা করা আরও বোকামি হতে পারে (এবং অনেক ফর্ম নির্মাতারা এটি করে)। তবে ডাটাবেসে কী লেখা হচ্ছে তা পরীক্ষা করে দেখুন এবং আপনার ক্যোয়ারী তৈরি করার সময় এটি মনে রাখবেন।

পার্ট 2: মিথ্যাটিকে ডিফল্ট মান বলে ধরে নেওয়া, যার মান সত্য তা রেকর্ড করা সহজ:

... 'meta_key' => 'my_key', 'meta_value' => 1 (বা সত্য)

তবে অন্য পক্ষটি চ্যালেঞ্জিং: এখানে একটি ভুয়া মান হতে পারে, বা এর কোনও মানও নাও থাকতে পারে। এটি ঘটতে পারে যদি মানটি কোনও আকারে alচ্ছিক হিসাবে তালিকাভুক্ত করা হয় --- তবে যতক্ষণ না ব্যবহারকারী সুস্পষ্টভাবে এটি সেট বা পরিবর্তন না করে, এটি ডাটাবেসে যুক্ত হবে না। মনে রাখবেন যে আপনি যদি get_post_metaএটি ব্যবহার করেন তবে এটি ঠিক এইভাবে কাজ করবে: একটি মিথ্যা মান ফেরত দেওয়া এবং কোনও মূল্য ফেরত দেওয়া একই জিনিসটি সম্পাদন করবে।

আপনি যখন ব্যবহার করছেন তখন WP_Queryএটি এত সহজ নয়। (বা যদি এটি হয় তবে আমি এখনও বুঝতে পারি নি)।

আপনার কাছে দুটি (বা তিনটি হতে পারে) বিকল্প রয়েছে:

  1. ক্ষেত্রটি সর্বদা স্পষ্টরূপে একটি আসল মান থেকে শুরু হয় তা নিশ্চিত করুন। কিছু ফর্ম বিল্ডারগুলিতে আপনি ক্ষেত্রটি প্রয়োজনীয় করে এবং এটির একটি ডিফল্ট মান দিয়ে এটি করেন। তারপরে আপনি ...'meta_value' => 0 নির্ভরযোগ্যভাবে পরীক্ষা করতে পারেন ।

  2. দুটি জিজ্ঞাসা করুন, প্রথমটি কোন মিথ্যা মানের জন্য পরীক্ষা করে এবং দ্বিতীয়টি কোন মানটির জন্য পরীক্ষা করে। এগুলি এই জাতীয় একক WP_Query এ একত্রিত করা যেতে পারে:

    meta_query => {
        relation => 'OR'
        array(
            'key'     => 'my_key',
            'value'   => 0,
            'compare' => '='
        ),
        array(
            'key'     => 'my_key',
            'compare' => 'NOT EXISTS',
        ),
    )

এটি সম্ভবত একটি দক্ষ ক্যোয়ারী নয়। অনেকগুলি বিষয়ের উপর নির্ভর করে সমস্ত বস্তু ফিরিয়ে দেওয়া এবং সেগুলি আপনার নিজের কোডে ফিল্টার করা ভাল।

  1. মিথ্যা বোঝাতে 'কোনও মূল্য নেই' ব্যবহার করা সম্ভব। এটি করার জন্য, যখনই মানটি মিথ্যাতে সেট করা উচিত, আপনাকে মেটা মান আপডেট করার পরিবর্তে মুছতে হবে।

'NOT EXISTS'সেক্ষেত্রে একটি একক ক্যোয়ারী নির্ভরযোগ্যভাবে সঠিক বস্তুগুলি ফিরিয়ে দেবে। (আমি মনে করি না যে অনেক ফর্ম বিল্ডার বা প্লাগইনগুলি এই আচরণকে সমর্থন করে, তাই আমি কেবল এটি কেবলমাত্র কাস্টম কোডে ব্যবহার করব))

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