গুরুত্বপূর্ণ অস্বীকৃতি: এটি করার সঠিক উপায়টি আপনার টেবিলের কাঠামোটি সংশোধন করা নয়, তবে wp_usermeta ব্যবহার করা। তারপরে আপনার পোস্টগুলি জিজ্ঞাসা করার জন্য আপনার কোনও কাস্টম এসকিউএল তৈরি করার প্রয়োজন হবে না (যদিও উদাহরণস্বরূপ, প্রশাসনের বিভাগে, বিশেষ তত্ত্বাবধায়কের প্রতিবেদন করা প্রত্যেকের একটি তালিকা পেতে আপনার কিছু কাস্টম এসকিউএল প্রয়োজন হবে)। যাইহোক, ওপি কাস্টম এসকিউএল লেখার বিষয়ে জিজ্ঞাসা করেছিল, তাই বিদ্যমান ওয়ার্ডপ্রেস ক্যোয়ারিতে কাস্টম এসকিউএল ইনজেকশন দেওয়ার জন্য বর্তমান সেরা অনুশীলন।
যদি আপনি জটিল যোগদান করে থাকেন তবে আপনি কেবল পোস্ট_এই ফিল্টার ব্যবহার করতে পারবেন না, কারণ আপনার যোগদানের ক্ষেত্রে, নির্বাচনটি এবং সম্ভবত কোয়েরির অংশগুলি অনুসারে গোষ্ঠী বা ক্রমটি সংশোধন করতে হবে।
আপনার সেরা বাজি 'পোস্ট_ক্লাউস' ফিল্টার ব্যবহার করা। এটি একটি অত্যন্ত কার্যকর ফিল্টার (এটির অপব্যবহার করা উচিত নয়!) যা আপনাকে এসকিউএলের বিভিন্ন অংশ সংযোজন / সংশোধন করতে দেয় যা ওয়ার্ডপ্রেস কোরের মধ্যে অনেকগুলি লাইনের কোডের দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হয়। ফিল্টার কলব্যাক স্বাক্ষর:
function posts_clauses_filter_cb( $clauses, $query_object ){ }
এবং এটি প্রত্যাশা করে আপনি ফিরে আসবেন $clauses
।
ক্লজ
$clauses
নিম্নলিখিত একটি কী রয়েছে এমন একটি অ্যারে; প্রতিটি কী একটি এসকিউএল স্ট্রিং যা ডাটাবেসে প্রেরিত চূড়ান্ত এসকিউএল বিবৃতিতে সরাসরি ব্যবহৃত হবে:
- কোথায়
- groupby
- যোগদানের
- orderby
- স্বতন্ত্র
- ক্ষেত্র
- সীমা
আপনি যদি ডাটাবেসে একটি সারণী যুক্ত করে থাকেন (কেবলমাত্র আপনি যদি পোস্ট_মেটা, ব্যবহারকারী_মেটা বা কর আদায় করতে না পারেন তবে এটি করুন) আপনাকে সম্ভবত এই ধারাগুলির একটিরও বেশি স্পর্শ করতে হবে, উদাহরণস্বরূপ, fields
"" নির্বাচন করুন " এসকিউএল স্টেটমেন্টের অংশ), join
(আপনার "FROM" ধারাটিতে থাকা আপনার সমস্ত টেবিল) এবং সম্ভবত orderby
।
ধারাগুলি সংশোধন করা হচ্ছে
এটি করার সর্বোত্তম উপায় হ'ল আপনি $clauses
ফিল্টার থেকে পাওয়া অ্যারে থেকে প্রাসঙ্গিক কীটিকে সাব্র্যাক্ট করে তুলুন :
$join = &$clauses['join'];
এখন, আপনি যদি সংশোধন করেন $join
, আপনি আসলে সরাসরি সংশোধন করবেন $clauses['join']
তাই আপনি $clauses
যখন এটি ফিরিয়ে দেবেন তখন পরিবর্তনগুলি আসবে ।
অরিজিনাল ক্লজগুলি সংরক্ষণ করা
সম্ভাবনাগুলি (না, গুরুত্ব সহকারে শুনুন) আপনি বিদ্যমান এসকিউএল সংরক্ষণ করতে চাইবেন যা ওয়ার্ডপ্রেস আপনার জন্য তৈরি করেছে generated যদি তা না হয় তবে এর posts_request
পরিবর্তে আপনার ফিল্টারটি সম্ভবত দেখা উচিত - এটি সম্পূর্ণ মাইএসকিউএল কোয়েরি হ'ল এটি ডেটাবেজে প্রেরণের ঠিক আগে, যাতে আপনি এটি নিজের নিজের সাথে পুরোপুরি ক্লোবার করতে পারেন। তুমি কেন এটা করতে চাও? আপনি সম্ভবত না।
সুতরাং, ধারাগুলিতে বিদ্যমান এসকিউএল সংরক্ষণের জন্য, অনুচ্ছেদগুলিতে সংযোজন করা মনে রাখবেন, তাদেরকে অর্পণ করবেন না (যেমন: ব্যবহার করবেন $join .= ' {NEW SQL STUFF}';
না $join = '{CLOBBER SQL STUFF}';
Note মনে রাখবেন যে $clauses
অ্যারের প্রতিটি উপাদান একটি স্ট্রিং, যদি আপনি এটিতে যুক্ত করতে চান, অন্য কোনও অক্ষর টোকেনের আগে আপনি সম্ভবত একটি স্থান সন্নিবেশ করতে চাইবেন, অন্যথায় আপনি সম্ভবত কিছু এসকিউএল সিন্ট্যাক্স ত্রুটি তৈরি করবেন।
আপনি অনুমান করতে পারেন যে প্রতিটি অনুচ্ছেদে সর্বদা কিছু না কিছু থাকবে এবং তাই প্রতিটি নতুন স্ট্রিং একটি স্থান দিয়ে শুরু করে মনে রাখবেন যেমন:: $join .= ' my_table
, বা আপনি সর্বদা একটি সামান্য রেখা যুক্ত করতে পারেন যা আপনার প্রয়োজন হলে কেবল একটি স্থান যুক্ত করে:
$join = &$clauses['join'];
if (! empty( $join ) ) $join .= ' ';
$join .= "JOIN my_table... "; // <-- note the space at the end
$join .= "JOIN my_other_table... ";
return $clauses;
এটি অন্য যে কোনও কিছুর চেয়ে স্টাইলিস্টিক জিনিস। গুরুত্বপূর্ণ বিটটি মনে রাখতে হবে: আপনার স্ট্রিংয়ের আগে সর্বদা একটি স্থান ছেড়ে যান যদি আপনি এমন কোনও ধারাটিতে যুক্ত হন যা ইতিমধ্যে এতে কিছু এসকিউএল রয়েছে!
একসাথে রেখে
ওয়ার্ডপ্রেস বিকাশের প্রথম নিয়মটি হ'ল যথাসম্ভব মূল কার্যকারিতাটি ব্যবহার করার চেষ্টা করা। এটি আপনার কাজের ভবিষ্যতের প্রমাণের সর্বোত্তম উপায়। ধরুন মূল দলটি সিদ্ধান্ত নিয়েছে যে ওয়ার্ডপ্রেস এখন এসকিউএলাইট বা ওরাকল বা অন্য কোনও ডাটাবেস ভাষা ব্যবহার করবে। কোনও হাতে লেখা মাইএসকিউএল অবৈধ হয়ে যেতে পারে এবং আপনার প্লাগইন বা থিমটি ভেঙে দিতে পারে! ডাব্লুপি নিজে থেকে যথাসম্ভব এসকিউএল উত্পন্ন করতে দেওয়া এবং আপনার প্রয়োজনীয় বিটগুলি যুক্ত করা আরও ভাল।
সুতরাং ব্যবসায়ের প্রথম ক্রম WP_Query
আপনার বেস ক্যোয়ারির যথাসম্ভব উত্পন্ন করার জন্য উপকৃত হচ্ছে । সঠিক পদ্ধতি আমরা এই কাজ করতে ব্যবহার করেন তার উপর মূলত নির্ভর করে যেখানে পোস্টের এই তালিকা প্রদর্শিত অনুমিত হয়। যদি এটি পৃষ্ঠার একটি উপ-বিভাগ (আপনার মূল ক্যোয়ারী নয়) আপনি ব্যবহার করবেন get_posts()
; যদি এটি মূল জিজ্ঞাসা হয় তবে আমি মনে করি আপনি এটি ব্যবহার করতে query_posts()
এবং এটি দিয়ে কাজটি করতে পারতেন তবে এটি করার সঠিক উপায়টি হ'ল মূল ক্যোয়ারীটি ডাটাবেসকে হিট করার আগে (এবং সার্ভার চক্র গ্রহণ করে) তাই request
ফিল্টারটি ব্যবহার করুন ।
ঠিক আছে, সুতরাং আপনি আপনার ক্যোয়ারী তৈরি করেছেন এবং এসকিউএল তৈরি হতে চলেছে। ঠিক আছে, আসলে এটি তৈরি করা হয়েছে, কেবল ডাটাবেসে প্রেরণ করা হয়নি। posts_clauses
ফিল্টারটি ব্যবহার করে , আপনি আপনার কর্মচারী সম্পর্কের টেবিলটি মিশ্রণে যুক্ত করতে যাচ্ছেন। আসুন এই টেবিলটিকে {$ wpdb-> উপসর্গ call বলুন} 'ব্যবহারকারী_ সম্পর্কিততা', এবং এটি একটি ছেদ টেবিল। (যাইহোক, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এই টেবিলের কাঠামোটি সাধারণীকরণ করুন এবং নীচের ক্ষেত্রগুলি সহ এটি একটি যথাযথ ছেদযুক্ত টেবিলে পরিণত করুন: 'সম্পর্ক_আইডি', 'ব্যবহারকারী_আইডি', 'সম্পর্কিত_ ব্যবহারকারী_আইডি', 'সম্পর্ক_প্রকার'; এটি অনেক বেশি নমনীয় এবং শক্তিশালী)। .. কিন্তু আমার দ্বিমত আছে).
আপনি যদি কী করতে চান তা যদি আমি বুঝতে পারি তবে আপনি কোনও নেতার আইডি পাস করতে চান এবং তারপরে সেই নেতার অনুসারীদের কেবল পোস্টগুলি দেখতে পাবেন। আমি আশা করি আমি অধিকার পেয়েছি। যদি এটি সঠিক না হয় তবে আপনাকে যা বলি তা গ্রহণ করতে হবে এবং এটি আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিতে হবে। আমি আপনার টেবিলের কাঠামোর সাথে লেগে থাকব: আমাদের একটি leader_id
এবং একটি রয়েছে follower_id
। সুতরাং {$wpdb->posts}.post_author
জয়ন আপনার 'ব্যবহারকারীর_সম্পর্ক' টেবিলে 'অনুসরণকারী_আইডি'-এর একটি বিদেশী কী হিসাবে চালু থাকবে ।
add_filter( 'posts_clauses', 'filter_by_leader_id', 10, 2 ); // we need the 2 because we want to get all the arguments
function filter_by_leader_id( $clauses, $query_object ){
// I don't know how you intend to pass the leader_id, so let's just assume it's a global
global $leader_id;
// In this example I only want to affect a query on the home page.
// This is where the $query_object is used, to help us avoid affecting
// ALL queries (since ALL queries pass through this filter)
if ( $query_object->is_home() ){
// Now, let's add your table into the SQL
$join = &$clauses['join'];
if (! empty( $join ) ) $join .= ' '; // add a space only if we have to (for bonus marks!)
$join .= "JOIN {$wpdb->prefix}employee_relationship EMP_R ON EMP_R.follower_id = {$wpdb->posts}.author_id";
// And make sure we add it to our selection criteria
$where = &$clauses['where'];
// Regardless, you always start with AND, because there's always a '1=1' statement as the first statement of the WHERE clause that's added in by WP/
// Just don't forget the leading space!
$where .= " AND EMP_R.leader_id={$leader_id}"; // assuming $leader_id is always (int)
// And I assume you'll want the posts "grouped" by user id, so let's modify the groupby clause
$groupby = &$clauses['groupby'];
// We need to prepend, so...
if (! empty( $groupby ) ) $groupby = ' ' . $groupby; // For the show-offs
$groupby = "{$wpdb->posts}.post_author" . $groupby;
}
// Regardless, we need to return our clauses...
return $clauses;
}