আমি @Manny Fleurmond এর উত্তর প্রয়োগের চেষ্টা এবং @Jake আমি টাইপো যে সংশোধন করার পরেও কাজ বুঝে উঠতে পারতাম না 'orderby' => 'meta_key'
হওয়া উচিত 'orderby' => 'meta_value'
। (এবং সম্পূর্ণতার জন্য এটি হওয়া উচিত 'posts_per_page'
নয় 'post_per_page'
তবে এটি যে বিষয়টি দেখেছে তাতে প্রভাব ফেলবে না))
আপনি যদি @ ম্যানি ফ্লেয়ারমন্ডের উত্তর (টাইপস সংশোধন করে) দ্বারা উত্পন্ন এসকিউএল ক্যোয়ারীটি লক্ষ্য করেন তবে এটিই আপনি পাবেন:
SELECT wp_{prefix}_posts.* FROM wp_{prefix}_posts
LEFT JOIN wp_{prefix}_postmeta ON (wp_{prefix}_posts.ID = wp_{prefix}_postmeta.post_id AND wp_{prefix}_postmeta.meta_key = 'custom_author_name' )
LEFT JOIN wp_{prefix}_postmeta AS mt1 ON ( wp_{prefix}_posts.ID = mt1.post_id )
WHERE 1=1 AND (
wp_{prefix}_postmeta.post_id IS NULL
OR
mt1.meta_key = 'custom_author_name'
) AND wp_{prefix}_posts.post_type = 'news' AND
(wp_{prefix}_posts.post_status = 'publish' OR wp_{prefix}_posts.post_author = 1 AND wp_{prefix}_posts.post_status = 'private')
GROUP BY wp_{prefix}_posts.ID ORDER BY wp_{prefix}_postmeta.meta_value ASC
এটি ডাব্লুপি কীভাবে কোয়েরি ওয়ার্সকে পার্স করছে তা চিত্রিত করে: এটি প্রতিটি মেটা_কিউরি ক্লোজের জন্য একটি টেবিল তৈরি করছে, তারপরে কীভাবে যুক্ত হবে এবং কী অর্ডার করবেন তা নির্ধারণ করুন। অর্ডারিং ঠিকঠাক কাজ করবে যদি আপনি কেবলমাত্র একটি একক ধারা ব্যবহার করে থাকেন 'compare' => 'EXISTS'
তবে 'compare' => 'NOT EXISTS'
ওআর (যেমন আমাদের অবশ্যই) দিয়ে দ্বিতীয় ধারাটিতে যোগ দিলে ক্রমটি অর্জিত হয়। ফলাফলটি হচ্ছে প্রথম বাম / টেবিল এবং দ্বিতীয় ধারা / টেবিল উভয়কে যোগ দিতে বাম জয়েন্ট ব্যবহার করা হয় - এবং ডাব্লুপি যেভাবে সমস্ত কিছু একসাথে রাখে তার অর্থ হ'ল যে টেবিলটি তৈরি করে 'compare' => 'EXISTS'
তা আসলে কোনও কাস্টম ক্ষেত্র থেকে মেটা_ভ্যালুতে পপুলেটেড হয় না 'custom_author_name'
ক্ষেত্রটি আমরা আগ্রহী So সুতরাং আমি মনে করি cla ধারা / সারণি অনুসারে অর্ডার করলে কেবলমাত্র 'নিউজ'-এর নির্দিষ্ট পোস্ট_প্রকারের একটিমাত্র কাস্টম ক্ষেত্র থাকলে পছন্দসই ফলাফল পাওয়া যাবে।
আমার পরিস্থিতির জন্য যে সমাধানটি কাজ করেছিল তা হ'ল অন্য ধারা / সারণি দ্বারা অর্ডার করা - এটির অস্তিত্ব নেই। আপাতদৃষ্টিতে পাল্টা স্বজ্ঞাত আমি জানি, তবে ডাব্লুপি কোয়েরি ওয়ার্সকে যেভাবে পার্স করেছে তা এই টেবিলটি যেখানে meta_value
কেবলমাত্র আমাদের পরে থাকা কাস্টম ফিল্ড দ্বারা জনবহুল।
(আমি এটি আবিষ্কার করার একমাত্র উপায় ছিল আমার মামলার জন্য এই কোয়েরির সমতুল্য চালানো:
SELECT wp_{prefix}_posts.ID, wp_{prefix}_postmeta.meta_value, mt1.meta_value FROM wp_{prefix}_posts
LEFT JOIN wp_{prefix}_postmeta ON (wp_{prefix}_posts.ID = wp_{prefix}_postmeta.post_id AND wp_{prefix}_postmeta.meta_key = 'custom_author_name' )
LEFT JOIN wp_{prefix}_postmeta AS mt1 ON ( wp_{prefix}_posts.ID = mt1.post_id )
WHERE 1=1 AND (
wp_{prefix}_postmeta.post_id IS NULL
OR
mt1.meta_key = 'custom_author_name'
) AND wp_{prefix}_posts.post_type = 'news' AND
(wp_{prefix}_posts.post_status = 'publish' OR wp_{prefix}_posts.post_author = 1 AND wp_{prefix}_posts.post_status = 'private')
ORDER BY wp_{prefix}_postmeta.meta_value ASC
আমি যা কিছু করেছি তা হ'ল কলামগুলি দেখানো হচ্ছে এবং দফা দ্বারা গ্রুপ অপসারণ করা হয়েছে। এটি তখন আমাকে কী ঘটছে তা দেখিয়েছিল - যে postmeta.meta_value কলামটি সমস্ত মেটা_কিগুলি থেকে মানগুলি টানছিল, যখন mt1.meta_value কলামটি নিউজ কাস্টম ক্ষেত্র থেকে কেবল মেটা_ভ্যালুতে টানছিল))
সমাধান
যেমন @ ম্যানি ফ্লুরমন্ড বলেছেন, এটিই প্রথম ধারাটি যা অর্ডারবাইয়ের জন্য ব্যবহৃত হয়, সুতরাং উত্তরটি কেবল ক্লজগুলি সরিয়ে নেওয়ার জন্য দেওয়া হচ্ছে:
$args = array(
'post_type' => 'news',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'custom_author_name',
'compare' => 'NOT EXISTS'
),
array(
'key' => 'custom_author_name',
'compare' => 'EXISTS'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
বিকল্পভাবে আপনি کلاসকে মিশ্রিত অ্যারে করতে এবং সম্পর্কিত কী দ্বারা অনুরোধ করতে পারেন, যেমন:
$args = array(
'post_type' => 'news',
'orderby' => 'not_exists_clause',
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
'exists_clause' => array(
'key' => 'custom_author_name',
'compare' => 'EXISTS'
),
'not_exists_clause' => array(
'key' => 'custom_author_name',
'compare' => 'NOT EXISTS'
)
),
'posts_per_page' => -1
);
$query = new WP_Query($args);
'orderby' => 'meta_value'
এটি ক্রম পরিবর্তন করে, তবে আসল মেটা ক্ষেত্রের সাথে এর কোনও যোগসূত্র ছিল না।