আপনি যা চান তা সম্ভব তবে আপনার এসকিউএল অনুসন্ধান করা প্রয়োজন যা আমি যখনই সম্ভব এড়াতে পছন্দ করি (কারণ এটি আমি জানি না, আমি একজন অগ্রিম এসকিউএল বিকাশকারী, তবে কারণ ওয়ার্ডপ্রেসে আপনি যখনই সম্ভব API ব্যবহার করতে চান) ভবিষ্যতের সম্ভাব্য ডাটাবেস কাঠামোর পরিবর্তনের সাথে সম্পর্কিত ভবিষ্যতের সামঞ্জস্য সমস্যাগুলি কমাতে))
UNION
অপারেটরের সাথে এসকিউএল হ'ল সম্ভাবনা
এসকিউএল ব্যবহার করার জন্য আপনাকে কি একটি প্রয়োজন UNION
আপনার ক্যোয়ারীতে অপারেটর, এই আপনার বিভাগ বর্জ্য বুকে অভিমানী ভালো কিছু হয় "category-1"
, "category-1"
এবং "category-3"
:
SELECT * FROM wp_posts WHERE ID IN (
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-1'
LIMIT 5
UNION
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-2'
LIMIT 5
UNION
SELECT tr.object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='category-3'
LIMIT 5
)
আপনি একটি posts_join
ফিল্টার সহ এসকিউএল ইউনিয়ন ব্যবহার করতে পারেন
উপরের ব্যবহার করে আপনি হয় সরাসরি কল করতে পারেন বা আপনি নীচের মতো একটি posts_join
ফিল্টার হুক ব্যবহার করতে পারেন ; নোট আমি একটি পিএইচপি হেরডোক ব্যবহার করছি তাই নিশ্চিত হয়ে নিন SQL;
যে ফ্লাশ বামে রয়েছে। এছাড়াও নোট করুন আমি আপনাকে একটি অ্যারেতে বিভাগ স্লাগগুলি তালিকাভুক্ত করে হুকের বাইরের বিভাগগুলি সংজ্ঞায়িত করার জন্য বিশ্বব্যাপী বিভিন্ন ব্যবহার করেছি। আপনি এই কোডটি একটি প্লাগইনে বা আপনার থিমের functions.php
ফাইলটিতে রাখতে পারেন:
<?php
global $top_5_for_each_category_join;
$top_5_for_each_category_join = array('category-1','category-2','category-3');
add_filter('posts_join','top_5_for_each_category_join',10,2);
function top_5_for_each_category_join($join,$query) {
global $top_5_for_each_category_join;
$unioned_selects = array();
foreach($top_5_for_each_category_join as $category) {
$unioned_selects[] =<<<SQL
SELECT object_id
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
WHERE tt.taxonomy='category' AND t.slug='{$category}'
LIMIT 5
SQL;
}
$unioned_selects = implode("\n\nUNION\n\n",$unioned_selects);
return $join . " INNER JOIN ($unioned_selects) categories ON wp_posts.ID=categories.object_id " ;
}
তবে পার্শ্ব প্রতিক্রিয়া হতে পারে
অবশ্যই ক্যোরি মডিফিকেশন হুকগুলি ব্যবহার করা posts_join
সর্বদা পার্শ্ব-প্রতিক্রিয়াগুলিকে আমন্ত্রণ জানায় যে তারা বিশ্বব্যাপী প্রশ্নের উপর ক্রিয়া করে এবং সুতরাং সাধারণত আপনার পরিবর্তনগুলি এমন একটিতে আবৃত করা প্রয়োজন যা প্রয়োজন হয় if
যখন এটি ব্যবহার করে এবং পরীক্ষার জন্য কোন মানদণ্ড জটিল হতে পারে।
পরিবর্তে অপ্টিমাইজেশন উপর ফোকাস?
তবে, আমি ধরে নিই যে আপনার প্রশ্নটি উদ্বিগ্ন, শীর্ষস্থানীয় 5 বার 3 টি ক্যোয়ারী করতে সক্ষম হওয়ার চেয়ে অপ্টিমাইজেশনের বিষয়ে বেশি? যদি তা হয় তবে অন্য কোনও বিকল্প রয়েছে যা ওয়ার্ডপ্রেস এপিআই ব্যবহার করে?
ক্যাচিংয়ের জন্য ট্রান্সিয়েন্টস এপিআই ব্যবহার করা ভাল?
আমি ধরে নিলাম আপনার পোস্টগুলি প্রায়শই পরিবর্তন হবে না, তাই না? যদি আপনি পর্যায়ক্রমে তিনটি (3) কোয়েরি হিট গ্রহণ করেন এবং তারপরে ট্রান্সিয়েন্টস এপিআই ব্যবহার করে ফলাফলগুলি ক্যাশে করেন ? আপনি রক্ষণাবেক্ষণযোগ্য কোড এবং দুর্দান্ত পারফরম্যান্স পাবেন; UNION
উপরের ক্যোয়ারীর চেয়ে ভাল কিছুটা ভাল কারণ ওয়ার্ডপ্রেস wp_options
সারণির এক রেকর্ডে সিরিয়ালযুক্ত অ্যারে হিসাবে পোস্টগুলির তালিকা সংরক্ষণ করবে ।
এটি পরীক্ষা করার জন্য আপনি নিম্নলিখিত উদাহরণটি নিতে এবং আপনার ওয়েবসাইটের মূলের মধ্যে ফেলে দিতে test.php
পারেন:
<?php
$timeout = 4; // 4 hours
$categories = array('category-1','category-2','category-3');
include "wp-load.php";
$category_posts = get_transient('top5_posts_per_category');
if (!is_array($category_posts) || count($category_posts)==0) {
echo "Hello Every {$timeout} hours!";
$category_posts = array();
foreach($categories as $category) {
$posts = get_posts("post_type=post&numberposts=5&taxonomy=category&term={$category}");
foreach($posts as $post) {
$category_posts[$post->ID] = $post;
}
}
set_transient('top5_posts_per_category',$category_posts,60*60*$timeout);
}
header('Content-Type:text/plain');
print_r($category_posts);
সারসংক্ষেপ
যদিও হ্যাঁ আপনি এসকিউএল UNION
কোয়েরি এবং posts_join
ফিল্টার হুক ব্যবহারের জন্য যা বলেছিলেন তা করতে পারেন তবে পরিবর্তে ট্রান্সিয়েন্টস এপিআইয়ের সাহায্যে ক্যাচ ব্যবহার করে আপনি সম্ভবত আরও ভাল প্রস্তাব দিচ্ছেন ।
আশাকরি এটা সাহায্য করবে?