প্রতি বিভাগে সীমাবদ্ধ পোস্ট সহ একাধিক বিভাগ জিজ্ঞাসা করতে ডাব্লুপিউকিউয়ারি ব্যবহার করছেন?


10

প্রতি 15 টি পোস্টের সাথে আমার 3 টি বিভাগ রয়েছে, আমি প্রতিটি বিভাগের জন্য কেবল 5 টি প্রথম পোস্ট নিয়ে এসে ডিবিতে একটি প্রশ্ন করতে চাই, আমি কীভাবে এটি করতে পারি?

$q = new WP_Query(array( 'post__in' => array(2,4,8), 'posts_per_page' => **FIRST_5_OF_EACH_CAT** ));

যদি এটি সম্ভব না হয়, তবে আরও কার্যকর কী, পিতামাতার বিভাগের জন্য সমস্ত পদ পাওয়া এবং সেগুলির মধ্য দিয়ে লুপিং বা 3 টি ভিন্ন প্রশ্ন তৈরি করা?


আপনি কীভাবে তাদের অর্ডার করতে চান?
মাইকচিনকেল

সম্প্রতি প্রকাশিত .. এ বিভাগের সবচেয়ে সাম্প্রতিক 5 টি, বি বি বিভাগের অতি সাম্প্রতিক স্টাফ ..
অমিত

ঠিক আছে, নীচে আমার উত্তরটি দেখুন
মাইকচিন্কেল

উত্তর:


16

আপনি যা চান তা সম্ভব তবে আপনার এসকিউএল অনুসন্ধান করা প্রয়োজন যা আমি যখনই সম্ভব এড়াতে পছন্দ করি (কারণ এটি আমি জানি না, আমি একজন অগ্রিম এসকিউএল বিকাশকারী, তবে কারণ ওয়ার্ডপ্রেসে আপনি যখনই সম্ভব 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ফিল্টার হুক ব্যবহারের জন্য যা বলেছিলেন তা করতে পারেন তবে পরিবর্তে ট্রান্সিয়েন্টস এপিআইয়ের সাহায্যে ক্যাচ ব্যবহার করে আপনি সম্ভবত আরও ভাল প্রস্তাব দিচ্ছেন ।

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


2
স্থানান্তরের মাধ্যমে ক্যাশে করা সাইটে প্রভাব হ্রাস করার জন্য দুর্দান্ত জিনিস।
hakre

1
ট্রান্সিয়েন্টগুলি ব্যবহার করার জন্য @ মাইকে দুর্দান্ত ধারণা।
ক্রিস_ও

@ মাইক, আমি যদি আপনার মহাদেশে থাকতাম তবে আমি আপনার সাথে ক্লাস করতাম! আবার ধন্যবাদ!
অমিত

@ আমিট: লোল! :-)
মাইকচিন্কেল

1
আপনি কি এই ক্ষণস্থায়ীটিকে অনির্দিষ্টকালের জন্য বাঁচাতে এবং তারপরে সেভ_পোস্টে ফ্লাশ করতে পারেন? কোডেক্সে একটি ভাল উদাহরণ রয়েছে (edit_term হুক ব্যবহার করে)
হেলগাটিভিকিং

1

WP_Query()প্রতিটি বিড়ালের জন্য ফার্স্ট এক্স এর মতো কিছু সমর্থন করে না । পরিবর্তে WP_Query()আপনি get_posts()আপনার প্রতিটি বিভাগে ব্যবহার করতে পারেন , তাই তিনবার বলা:

<?php
$posts      = array():
$categories = array(2,4,8);
foreach($categories as $cat) {
  $posts[] = get_posts('numberposts=5&offset=1&category='.$cat);
}
?>

$posts এখন প্রতিটি বিভাগের জন্য প্রথম পাঁচটি পোস্ট রয়েছে।


ডিবিতে 3 হিট না? আমি জানতে চেয়েছিলাম আপনি যদি 1 টি হিট কারণে এটি করতে পারেন তবে আমি ভেবেছিলাম এটি আরও দক্ষ।
অমিত

আচ্ছা, ডিবি ঠিক তাই কি? এটি থেকে তথ্য জিজ্ঞাসা করুন। ডিবি যেমন স্টাফ জন্য তৈরি করা হয়। আপনি সম্ভবত জিজ্ঞাসা করছেন এমন জটিল স্কয়ার কোয়েরিটি চালানোর পরে এটি সম্ভবত দ্রুত। জিনিস ব্যবহার করতে ভয় পাবেন না। যদি এটি আপনার সাইটটি ভেঙে দেয় তবে এখানে এটি প্রতিবেদন করুন।
hakre

মিমি .. এটি পেয়েছি, আমি পিএইচপি / মাইএসকিএল / ডিবি দক্ষতা সম্পর্কে আরও কিছু জানি না (আরও পড়তে চাই), নিশ্চিত ছিল যে কম হিট ভাল এবং তারপরে ফলাফলটি নিজেই বিশ্লেষণ করুন।
অমিত

1
ভাল, সত্য, সাধারণত আরও বেশি এবং কম কম is তবে প্রথমে চেষ্টা করে দেখুন। আপনার সফ্টওয়্যারটি "খারাপ", এটির অপ্টিমাইজেশনের সম্ভাবনা তত বেশি। তাই আরও ভাল করে শিখুন, কারণ শেষ পর্যন্ত আপনি আরও ভাল সফটওয়্যার দ্রুত লিখবেন এবং আরও ভাল সফটওয়্যার লিখবেন।
hakre

0

আমি একক কোয়েরিতে প্রতিটি বিভাগের জন্য প্রথম পাঁচটি পোস্ট পাওয়ার কোনও উপায় জানি না। যদি আপনি কেবলমাত্র 45 টি পোস্ট পেতে চলেছেন তবে ডাটাবেস একবারে আঘাত করা এবং প্রতিটি বিভাগের জন্য আপনার পাঁচটি পোস্ট পাওয়া সম্ভবত সবচেয়ে কার্যকর পন্থা। তিনবার ডাটাবেস হিট করা এবং ফলাফলগুলি একত্রিত করা খারাপ জিনিস নয় thing

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