Wp_query ব্যবহার করে ট্যাক্সনোমি অর্ডার করা সম্ভব?


49

আমার প্রশ্নটি সহজ, আমি ট্যাক্স_কোয়ারি ব্যবহার করে একটি শ্রেণীবদ্ধ দ্বারা ফিল্টারিং করা কিছু কাস্টম ধরণের পোস্টগুলি পুনরুদ্ধার করতে ডাব্লুপিউকিউয়ারি ব্যবহার করছি।

এখন আমার সমস্যাটি হচ্ছে আমি শৃঙ্খলা অর্ডার করতে চাই, তবে ওয়েবে ডকুমেন্টেশন এবং অনুসন্ধান থেকে আমি এর সমাধান খুঁজে পাচ্ছি না।

ডব্লিউপি_কিউয়ারিতে অর্ডারবাই আপনাকে একগুচ্ছ ক্ষেত্র এমনকি কাস্টম মেটা ক্ষেত্র দ্বারা অর্ডার দেয় তবে এটি কর শৃঙ্খলা সমর্থন করে বলে মনে হয় না।

সঠিক দিকে কোন পয়েন্টার?

সবাইকে ধন্যবাদ.

উত্তর:


12

না, শ্রমশৃঙ্খলা দ্বারা অর্ডার করা সম্ভব নয় কারণ একটি নির্দিষ্ট ধরণের দৃষ্টিকোণ থেকে, এটি আসলে খুব বেশি বোঝায় না।

শ্রেণীবদ্ধগুলি জিনিসকে একসাথে গ্রুপ করার উপায় ways সুতরাং পোস্টগুলিতে একটি শ্রেণিবদ্ধ থাকার বিষয়টি সত্যিকার অর্থে পোস্টের মধ্যে ভাগ করা শৈলীর শর্তাবলী। যদি কোনও শ্রেণীবদ্ধের শর্তাদি থাকে যা কেবলমাত্র প্রতিটি পোস্টে ব্যবহৃত হত, তবে এটি শৈলীর বিন্যাসকে অর্থহীন করে তুলবে। এবং যদি শর্তগুলি তাদের মতো হওয়াতে ভাগ করে নেওয়া হয়, তবে এটির মাধ্যমে অর্ডার দেওয়া বিশেষত কার্যকর কিছু তৈরি করতে পারে না।

এমন পরিস্থিতিতে আপনার কী ব্যবহার করা উচিত তা হ'ল পোস্ট মেটা। আপনি পোস্ট মেটা দ্বারা অর্ডার করতে পারেন, এবং এটি প্রতিটি পোস্টে অনন্য।

সম্পাদনা: এটি বলেছে যে আপনি একটি ফিল্টার ব্যবহার করে একটি কাস্টম এসকিউএল ক্যোয়ারী তৈরি করে শৃঙ্খলা দ্বারা অর্ডার করতে পারেন, আপনি কেবল এটি কোনও অপরিবর্তিত WP_Query থেকে করতে পারবেন না: http://scribu.net/wordpress/sortable-taxonomy-colutes.html

তবে, আপনি যদি এই ধরণের কাজটি করতে অবলম্বন করতে থাকেন তবে আপনার ডেটা ডিজাইনের কাঠামোটি প্রথম স্থানে ভুল। বিভাগে "শর্তাদি" প্রকৃত "ডেটা" নয়। শর্তগুলির নিজস্ব কোনও অন্তর্নিহিত অর্থ নেই, তারা যে নির্দিষ্ট গোষ্ঠীটির বর্ণনা দিচ্ছেন তার কেবলমাত্র লেবেল। আপনি যদি তাদের অর্থবহ ডেটা হিসাবে গণ্য করে থাকেন তবে আপনার অন্তর্নিহিত ডিজাইনের ত্রুটি রয়েছে।

বিষয়শ্রেণীগুলিকে শর্তাবলী বরাদ্দ করে তাদের গোষ্ঠীভুক্ত করে। এই গোষ্ঠীকরণটি ট্যাক্সনোমির পুরো বিন্দু, শর্তাবলী গ্রুপিংয়ের ঠিক সুন্দর মুখ। আপনার যদি কোনও পোস্টকে অর্পণ করার জন্য অর্থপূর্ণ মেটাডেটা থাকে তবে তার পরিবর্তে আপনার পোস্ট মেটাটি ব্যবহার করা উচিত। এবং আপনি এটি অর্ডার করতে পারেন , কারণ পোস্ট মেটা তথ্য সংরক্ষণের জন্য কী এবং মান উভয়ই ব্যবহার করে। একটি শ্রেণিবদ্ধের সাহায্যে, আপনি সত্যিকার অর্থে কেবল কীগুলি সংরক্ষণ করছেন, যার মানগুলি এই পদটির সাথে একত্রে পোস্ট করা হয়েছে।

আপনি যদি এর জন্য সঠিক পদ্ধতির ব্যবহার করেন তবে দীর্ঘমেয়াদে জিনিসগুলি আরও সহজ। যদিও আমি বলছি না যে আপনি শ্রমশৃঙ্খলা নিয়ে অদ্ভুত কিছু করতে পারবেন না, আপনি এটিকে ভুল ব্যবহার করে দীর্ঘমেয়াদে নিজের জন্য আরও কঠিন করে তুলছেন।


হ্যালো ওট্টো, উত্তরের জন্য আপনাকে ধন্যবাদ। আমি আপনার বক্তব্যটি দেখতে পাচ্ছি এবং সম্ভবত আমি এটি দিয়ে ভুল পথে যাচ্ছি। আমার উদাহরণে টিভি শোগুলির একটি সাইট, আমি সিরিজ 1, সেরি 2, সেরি 3 ইত্যাদির জন্য শ্রমশক্তি পেয়েছি So সুতরাং আমি সিরিজের সংখ্যা অনুসারে বিভিন্ন টিভি শোকে গ্রুপ করতে পারি। তারপরে আমার কাছে এপিসোড, পর্ব 01, পর্ব 02, ইত্যাদির জন্য একই আছে episode সমস্ত পর্বের একটি তালিকা পর্ব এবং সিরি অনুসারে অর্ডার করার জন্য আমি কী চাই। আমি মেটা এবং কাস্টম ক্ষেত্রগুলি পোস্ট করার পরে বিশ্লেষণ করব। ধন্যবাদ অটো
ইয়েপ

@ আইওপ, আপনার শ্রমশক্তিটি সিরিজ হওয়া উচিত এবং আপনার পদগুলি সিরিজ 1, সিরিজ 2 হওয়া উচিত ep পর্ব 2 ইত্যাদির মূল শব্দটি "সিরিজ এক্স" হবে। তারপরে আপনি এপিসোডগুলিতে যেখানে পড়তে হবে তার সাথে ক্রমে পুরো সিরিজটি জিজ্ঞাসা করতে পারেন।
ক্রিস_ও

@ ক্রিস_ও আমি দেখছি, আপনি হয়ত সেখানে অর্থের বিনিময়ে থাকবেন! কেবলমাত্র আমি দেখতে পাচ্ছি সমস্যাটি হ'ল প্রতিটি সিরিজের জন্য "পর্ব 1", "পর্ব 2" পদটি পুনরাবৃত্তি করা। এছাড়াও সিরিজের উপর নির্ভর করে সমস্ত পর্ব 1 টি গ্রুপ করতে সক্ষম না হওয়া, তবে আমি মনে করি এটির চারপাশে সম্ভবত একটি উপায় রয়েছে। আপনাকে ধন্যবাদ Chris_O
yeope

2
এপিসোডগুলির জন্য একটি শ্রমশক্তি ব্যবহার করা আসলে কোনও তাত্পর্যপূর্ণ নয়, কারণ গ্রুপিংটি মূল্যহীন। এটি ভাবুন, যদি আপনার কাছে শব্দ হিসাবে "পর্ব 1" থাকে তবে আপনি প্রতিটি টিভি পর্বের 1 টি পর্বের সাথে 1 পর্বকে গ্রুপ করছেন। পর্ব এবং সিরিজ সংখ্যা পোস্ট_মেটা হিসাবে আরও বোঝায়, কারণ তারা সেই বিশেষ শোতে নির্দিষ্ট, এবং গ্রুপ হিসাবে দরকারী নয়। টিভি শোয়ের নামটি একটি টিভি শো শো শ্রদ্ধার শব্দ হিসাবে কার্যকর হবে, কারণ তখন আপনি পুরো শোটিকে একসাথে ভাগ করে নিচ্ছেন।
অটো

1
অট্টো এটি একটি আকর্ষণীয় ব্লগ পোস্টের সাথে অনুসরণ করেছে: কখন কাস্টম ট্যাক্সোনমি ব্যবহার করবেন (নয়)
জান ফ্যাব্রি

47

এই প্রশ্নের জন্য গৃহীত উত্তর অগ্রহণযোগ্য। এটি অনুমান করা অযৌক্তিক যে ট্যাক্স দ্বারা অর্ডার দেওয়ার "অর্থ হয় না"। তিনি যে উত্তরটি দিয়েছিলেন তা বোধগম্য নয়।

একটি মেনু পোস্ট টাইপ থাকার বিবেচনা করুন। তারপরে আপনার কাছে "ফুডক্যাটরিজগুলি" এর একটি কাস্টম ট্যাক্স রয়েছে। ফুড ক্যাটাগরিজ ট্যাক্সটিতে "প্রাতঃরাশ", "মধ্যাহ্নভোজন" এবং "রাতের খাবার" শর্ত রয়েছে। আপনি যদি ট্যাক্স_কোয়ারী পরম ব্যবহার করে কোনও কোয়েরি জমা দেন তবে আপনার এখন সমস্ত শর্তাদির সাথে ফলাফল নির্ধারণ করা হয়েছে, তবে সেগুলি পোস্টের তারিখ অনুসারে অর্ডার করা হয়েছে।

এগুলির থেকে সঠিক অর্ডারটি পেতে, তাদের শর্তগুলির সাথে সামঞ্জস্য রেখে এবং তারপরে পোস্টগুলি তাদের বিভিন্ন বিভাগে আলাদাভাবে যথাযথভাবে প্রদর্শন করতে আপনাকে ফলাফলের সেটটি দিয়ে লুপ করতে হবে, তারপরে প্রতিটি পৃথক পোস্টকে জিজ্ঞাসা করতে হবে ফলাফলটি এর শর্তাদি সন্ধান করতে এবং বর্তমান পদটির সাথে তুলনা করে একটি অ্যারেতে ফিল্টার করে এবং সর্বদা চালিয়ে যায়। তারপরে আপনাকে প্রদর্শনের জন্য আবার নতুন অ্যারে দিয়ে লুপ করতে হবে। এটি উত্পাদনশীল নয়।

এটি চমৎকার হবে যদি ডব্লিউপি একটি "কর__ইন" অর্ডারবাই বিকল্প থাকে যেমন এটি "পোস্ট_ইন" একটি হিসাবে থাকে, তবে যেহেতু এটি না হয়, আপনাকে হয় উপরের হাস্যকর প্রক্রিয়াটি করতে হবে; অর্ডারবাই পদ্ধতিটি সামঞ্জস্য করতে এবং যথাক্রমে ফলাফল সেটটিতে শব্দটি যুক্ত করতে 'পোস্ট_সর্ডারবি' ফিল্টার এবং 'পোস্ট_জয়িন' ফিল্টারের মাধ্যমে ক্যোয়ারীটি নিজেকে কাস্টমাইজ করুন; অথবা এই শর্তগুলির সাথে সম্পর্কিত এইচটিএমএল বিভাগের মধ্যে আপনি যে শব্দটির জন্য ফিল্টার করছেন তার জন্য আপনাকে একটি নতুন ক্যোয়ারী তৈরি করতে হবে।

ফিল্টারগুলির মাধ্যমে ক্যোয়ারী স্ট্রিংটি পরিবর্তন করা সবচেয়ে দক্ষ হবে। সবচেয়ে সহজ হবে তিনটি পৃথক অনুসন্ধান করা। ডাব্লুপিপি এপিআই কর বা কোনও বিধিনিষেধক কোয়েরি পরামিতি দ্বারা অর্ডারিং করা উচিত hand আপনি যদি কিছু শর্তের ভিত্তিতে কোনও ক্যোয়ারিকে সীমাবদ্ধ করে থাকেন তবে অনেকেরই একই শর্ত অনুসারে অর্ডার করা দরকার এমন উচ্চ সম্ভাবনা রয়েছে।


2
দুঃখিত, কিন্তু আপনি ভুল। শ্রমশৃঙ্খলা দ্বারা আদেশ দেওয়া আপনার ক্ষেত্রেও কোনও অর্থবোধ করে না। আপনি কি দেখাতে চান? প্রথমে সমস্ত প্রাতঃরাশ, তারপরে সমস্ত ডিনার, তারপরে সমস্ত মধ্যাহ্নভোজ? আপনি যা চান সেটি এবং আপনি যে ক্রমটি চান তা নির্বাচন করা উচিত, তবে বিভাগটি কেবল একটি গ্রুপিং লেবেল। এটি অর্থপূর্ণ "ডেটা" নয় যা আপনার দ্বারা অর্ডার করা উচিত। যদি এটি হয়, তবে এটি কোনও শ্রেণীবিন্যাসের শব্দ হওয়া উচিত নয়, পরিবর্তে আপনার এটিকে একটি পোস্ট-মেটা করা উচিত।
অটো

15
চূড়ান্তভাবে অবশ্যই কিছু উদাহরণ রয়েছে যা আপনি ট্যাক্সনোমি শব্দ দ্বারা পোস্ট অর্ডার করতে চান। আর একটি উদাহরণ একটি মুভি পোস্ট ধরণের যা রেটিং রেজিস্ট্রেশন সহ। চলচ্চিত্রের তালিকায়, সমস্ত জি-রেটেড, তারপরে পিজি-রেটেড ইত্যাদির মুভিগুলি শীর্ষে প্রদর্শিত হয় এমন লোকেরা মুভিগুলির একটি তালিকা অর্ডার করতে চায় এমন কল্পনা করা খুব সহজ। (এটি এবং খাবারের উদাহরণে তাদের নামের পরিবর্তে টার্ম_আইড দিয়ে অর্ডার করা যেতে পারে)) উদাহরণস্বরূপ এমন একটি বৃহত ধূসর ক্ষেত্র রয়েছে যেখানে আপনি সম্ভবত একটি শ্রমশাস্ত্র দ্বারা মেটা না করেই সবচেয়ে ভাল পরিবেশন করেছেন, তবে সম্ভবত এই শ্রেণীবদ্ধের অর্ডার হওয়াও এটি সহায়ক helpful -able।
সপ্তম স্টিল 20

2
পিজি এবং জি রেটিং এবং এগুলি হ'ল একটি নির্দিষ্ট শ্রেণীবিন্যাস পছন্দ, কেবলমাত্র তারা নির্দিষ্ট চলচ্চিত্র সম্পর্কিত ডেটা। সুতরাং, তারা মেটা। এগুলি ডেটা, বিভাগ নয়। কেবলমাত্র সীমিত সংখ্যক পছন্দ করা কোনও শ্রমশাসন নয়। যদি এটি অনুসারে বাছাই করা দরকার, তা হয় এটি মেটা তৈরি করুন, বা শ্রেণীবিন্যাস দ্বারা সারণিকে বাধ্যতামূলকভাবে নির্দিষ্ট কোডের মাধ্যমে বাধ্য করুন। বিটিডাব্লু, এনসি 17 পিজির পরে আসে। সুতরাং, যেভাবেই হোক অর্ডার করার জন্য আপনার কোড দরকার।
অটো

আমি জানি আমি এই মন্তব্যটি দিয়ে পার্টিতে দেরি করে ফেলেছি, তবে এই বিষয়ে ঝাঁপিয়ে পড়েছি। শ্রমশৃঙ্খলা দ্বারা আদেশ কিছু পরিস্থিতিতে বোঝা যায়। আমাদের পোস্টের ধরণ হিসাবে একটি প্রকল্পে জব তালিকা রয়েছে এবং তারপরে রাজ্য এবং শহর যেখানে কাজটি কর আদায় করা ies আমরা চাই যে সেগুলি সহজেই গ্রাপযোগ্য হয়ে উঠুক (একটি রাজ্যে সমস্ত কাজ দেখান বা কোনও শহরে সমস্ত চাকরি দেখান) তাই শৈল্পিকাই ছিল সর্বোত্তম সমাধান। একই সময়ে সেখানে সাধারণ কাজের সন্ধান রয়েছে যেখানে আমরা এগুলি প্রথমে শিরোনাম অনুসারে, তারপরে রাষ্ট্র দ্বারা, পরে নগরীতে বাছাই করতে চাই।
ডেনিস পুজাক

অন্য ব্যবহারের ক্ষেত্রে: ক্লায়েন্টের একাধিক নিবন্ধ রয়েছে, যার প্রত্যেকটির একটি বিভাগ রয়েছে। ক্লায়েন্টটি সেখানে সমস্ত নিবন্ধ তালিকাবদ্ধ করার একটি পৃষ্ঠা থাকতে চান, যা তারিখ অনুসারে বা বিভাগ অনুসারে বর্ণমালা অনুসারে বাছাই করা যায়। বিভাগগুলিও ফিল্টার করা যায়, তবে বর্ণ অনুসারে বিভাগের সমস্ত নিবন্ধ তালিকাভুক্ত করা কোনও ব্যবহারের ক্ষেত্রে যে পাগল তা নয় এবং আপনি দেখতে পান যে এটি প্রায়শই পপ আপ হয়।
উইলসন বিগস

15

হ্যাঁ, তবে এতে বেশ জড়িত ...

আপনার থিমে ফাংশন.এফপি যুক্ত করুন:

function orderby_tax_clauses( $clauses, $wp_query ) {
    global $wpdb;
    $taxonomies = get_taxonomies();
    foreach ($taxonomies as $taxonomy) {
        if ( isset( $wp_query->query['orderby'] ) && $taxonomy == $wp_query->query['orderby'] ) {
            $clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
            $clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
        }
    }
    return $clauses;
}

    add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );

এটি আমি খুঁজে পাওয়া কিছু জিনিস এবং কিছু জিনিস থেকে খোলামেলা। ব্যাখ্যাটি বেশ শক্ত, তবে নীচের লাইনটি এই দৌড়ের সাথেই রয়েছে, আপনি রাখতে পারেন? অর্ডারবাই = (শ্রেণীবিন্যাস ক্যোয়ারী ভ্যার) এবং অর্ডার = এএসসি (বা ডিইএসসি) এবং তিনি ঠিক এখনই নেবেন!


আপনাকে ধন্যবাদ ধন্যবাদ, আমি একবার যেতে পারি এবং সেই এসকিউএল চালানোর চেষ্টা করব, কিছুটা সম্পাদনা করা দরকার, তবে এটি কার্যকর হতে পারে। আমার এখন একমাত্র সমস্যা হ'ল আমি কি অটো দ্বারা নির্দেশিত হিসাবে ভুল পথে চলতে পারি। আপনাকে ধন্যবাদ। সম্পাদনা করুন - সম্পাদনা করার দরকার নেই যেখানে এটির
টুইটগুলি

যদি আপনি এটি শেষ দুই মিনিটের মধ্যে ধরেন তবে এটি কাজ করবে না, এগিয়ে যান এবং এখনই এটি ধরুন, আমি এটি ঠিক করেছি। এটি দুটি নির্দিষ্ট ট্যাক্সনোমির জন্য সেট করা হয়েছিল, আমি সমস্ত নিবন্ধিত ট্যাক্সনোমিতে কাজ করার জন্য কোডটি উন্নত করেছিলাম।
ড্রয় গৌলি

আবার আপনাকে ধন্যবাদ. আমি যদি আপনার সমাধানটি চেষ্টা করেছিলাম তবে এটি একধরণের কাজ করে। অন্য কেউ এটা ব্যবহার করতে চায় এছাড়াও আপনি পরিবর্তন করতে হবে add_filter('posts_clauses', 'orderby_tax_clauses', 10, 2 );করতে add_filter('posts_clauses', 'todo_tax_clauses', 10, 2 );আপনাকে ধন্যবাদ :)
yeope

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

1
আপনি কি জানেন যে নামের পরিবর্তে আইডি দিয়ে কর বিভাগগুলি অর্ডার করা সম্ভব কিনা? আমি একই ফলাফলটি আইডি দ্বারা
জাভিয়ের ভিলানুয়েভা

9

আমি এখানে খেলতে দেরি করে আসছি, তবে এটি করার আরও একটি সহজ ওয়ার্ডপ্রেসি উপায় রয়েছে।

আপনার ট্যাক্স ক্যোয়ারী স্বাভাবিকের মতো তৈরি করুন।

$tax_query = array();
$tax_query['relation']="OR";
$tax_query[] = array(
    'taxonomy' => 'product_cat',
    'field'    => 'slug',
    'terms'    => $cat_terms,
);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

ক্যোয়ারী_পোস্ট বা ডব্লিউপি_কিউয়ের জন্য আপনার আরগগুলি সেট আপ করুন

$args = array(
    'post_type'=>'post',
    'posts_per_page'=>12,
    'paged'=>$paged,
    'tax_query' => $tax_query,
);

আপনি আপনার ক্যোয়ারী_পোস্ট / ডব্লিউপি_কিউয়ারি কল করার আগে, অর্ডারবাই ফিল্টারটিতে হুক করুন এবং এটিকে ওভাররাইড করুন

add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) {
    $orderby_statement = " term_taxonomy_id ASC ";
    return $orderby_statement;
}
query_posts($args);
remove_filter('posts_orderby', 'edit_posts_orderby');

পরে ফিল্টার অপসারণ করতে ভুলবেন না ...

এই কাজ করে খ / সি কর_উইকি আপনার জন্য যোগ দেয় ইত্যাদি তৈরি করে, আপনাকে যোগদানের জন্য কেবল একটি ক্ষেত্র দিয়ে অর্ডার করতে হবে।


2
টার্ম_ট্যাক্সনমি_আইডি পরিবর্তে নাম দিয়ে অর্ডার করবেন কীভাবে কোনও ধারণা? ক্রমবর্ধমান মেয়াদে_ট্যাক্সনমি_আইড পরিবর্তন করে ত্রুটি ছুঁড়ে
21

আগ্রহী যে কারও পক্ষে এটি সঠিক উত্তর!
মায়রা এম

2

ভাল, আমি কাস্টম / শ্রেণিবৃত্তি দ্বারা কাস্টম পোস্ট ধরণের বাছাইয়ের আমার অভিজ্ঞতাটি প্রকাশ করতে চাই।

ওয়েব

  1. ওয়ার্ডপ্রেসে চলছে একটি ট্র্যাভেল এজেন্সি ওয়েব সাইট
  2. কাস্টম পোস্টের ধরণের প্রধান বিষয়বস্তু যা 'রুটা' নামে পরিচিত
  3. এই কাঠামোর সাথে শ্রমশক্তি ভ্রমণ-প্রকার> মহাদেশ> দেশ

কেস

সংরক্ষণাগার বিভাগের তালিকা পৃষ্ঠাগুলিতে, ক্লায়েন্টটি পোস্টগুলি বাছাই করতে চেয়েছিল

  1. মহাদেশটি, প্রতিটিটিতে কয়েকটি সংখ্যক রুট অনুসারে অর্ডার করা হয়েছে।
  2. দেশ, বর্ণানুক্রমিক অর্ডার।

পদক্ষেপ

প্রথমত , আমি অশোধিত আর্কাইভ পৃষ্ঠা কোয়েরি থেকে অনুরোধটি পেয়েছি যা এরকম হয়েছিল:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) )
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC LIMIT 0, 20

দ্বিতীয়ত , আমি আমার প্রয়োজনীয়তা অনুসারে ডাটাবেসের বিরুদ্ধে সিকোয়েল প্রোতে বেকার কোড সম্পাদনা করেছি। আমি এটি নিয়ে বেরিয়ে এসেছি (হ্যাঁ, সম্ভবত এটি উন্নতি করা যেতে পারে: মাইএসকিউএল সম্পর্কিত আমার জ্ঞানটি অসামান্য):

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id =  tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    ) AS Total
FROM  wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id =      wp_term_relationships.term_taxonomy_id )
INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )
WHERE 1=1  
AND ( wp_term_relationships.term_taxonomy_id IN (5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,26,28,29,31,32,33,35,38,95,101,102,193) ) 
AND wp_posts.post_type IN ('ruta', 'nav_menu_item') 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 45 
AND wp_posts.post_status = 'private') 
GROUP BY wp_posts.ID 
ORDER BY
total DESC,
wp_terms.name  

তৃতীয় , আমি জিজ্ঞাসাটি ফাংশন.পিএইচপি ফাইলটিতে তিনটি ফিল্টার সহ পোস্ট করেছি: পোস্ট_ফিল্ডস, পোস্ট_জাইন এবং পোস্টসর্ডারবাই

ফাংশন.এফপি কোড:

function xc_query_fields( $fields ) {

   $fields = "wp_posts.ID, wp_posts.post_title, wp_terms.name, tt1.parent AS pare,
    (
    SELECT COUNT(*) 
    FROM  wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
    INNER JOIN wp_term_taxonomy AS tt2 ON ( tt2.term_taxonomy_id = tt1.term_taxonomy_id )
    WHERE 1=1  
    AND tt1.parent = pare
    )
    AS Total";
     return $fields;
}


function xc_query_joins( $join ) {
$join .= "INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
   INNER JOIN wp_term_taxonomy AS tt1 ON ( tt1.term_taxonomy_id = wp_term_relationships.term_taxonomy_id )
   INNER JOIN wp_terms ON ( tt1.term_id = wp_terms.term_id )";
 return $join;
}


function xc_query_orderby( $join ) {
    $join = "total DESC, wp_terms.name ";
    return $join;
 }

অবশেষে কিছু শর্ত অনুযায়ী আমি pre_get_post হুক থেকে ফিল্টারগুলি ট্রিগার করেছিলাম

function filtra_queries( $query )
{

  if (  is_archive()  && $query->is_main_query() && !is_admin()  ) {

$rutes = array('viajes-privados', 'asia', 'africa', 'oceania', 'america', 'oriente-proximo');

if  ( in_array( $query->get('category_name'), $rutes ) ) 
  {
  add_filter( 'posts_fields', 'xc_query_fields' );
  add_filter( 'posts_join', 'xc_query_joins' );
  add_filter( 'posts_orderby', 'xc_query_orderby' );
}// end if in_array

  }// end if is_archive

}
 add_filter('pre_get_posts', 'filtra_queries');

আশা করি এটি কারও সাহায্য করতে পারে


খুব সুন্দর কাজ, হাস্যকর যে কোনও শৃঙ্খলা দ্বারা কিছু সাজানোর জন্য এই পরিমাণ কোডটি নেওয়া হয়। ডব্লিউপি নিয়ে বিশাল সমস্যা।
সেরোসায়েস

2

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

সমস্যা মন্তব্য:

1) ওয়ার্ডপ্রেস আপনাকে কোনও বুদ্ধিমান উপায়ে ট্যাক্সনোমির অর্ডার দেওয়ার অনুমতি দেয় না।

2) ওয়ার্ডপ্রেস কেবল orderbyপোস্ট-টাইপ ডব্লুপি_কিউয়ারি (অটো দ্বারা বানান অনুসারে) উপর কর বিভাগ ব্যবহার করার অনুমতি দেয় না ।

সমাধান:

1) এই মুহুর্তে কাস্টম ট্যাক্সনোমি অর্ডার এনই প্লাগইন দ্বারা ট্যাক্সোনমিগুলি বাছাই করা সর্বোত্তমভাবে সম্পন্ন হয় । এটি আপনাকে ডাব্লুওয়াইএসআইওয়াইওয়াইজি এর মাধ্যমে কর শৃঙ্খলা অর্ডার করার অনুমতি দেয় যাতে wp-adminআমি এটি কীভাবে করব না তবে এর চেয়ে ভাল আর কিছু পাই নি।

আপনি প্লাগইন সেটআপ করার সময়, আমি এখানে যা করেছি তার অনুরূপ কিছু পাবেন। বিকল্পটি নোট করুন Auto-sort Queries of this Taxonomy- এটিতে সেট করুন Custom Order as Defined Above; এটি আপনাকে আপনার প্রয়োজনীয় ক্রমটি অর্ডার করে। স্ক্রীনশট:

কাস্টম টেকনোমির অর্ডার এনই ডিসপ্লে

২) স্থানে থাকা বাছাই করা বিভাগের সাহায্যে, আপনি এখন ডাব্লুপিউকিউয়ারি কলগুলির একটি সিরিজ তৈরি করতে পারেন যা প্রতিটি শর্তের মধ্য দিয়ে চলে, কার্যকরভাবে বিভাগের আদেশ অনুসারে একটি সংরক্ষণাগার তৈরি করে। get_terms()সমস্ত কর শর্তাদি একটি অ্যারে তৈরি করতে ব্যবহার করুন , তারপরে foreachপ্রতিটি শর্তে একটি চালান । এটি WP_Queryপ্রতিটি টার্ম আইটেমের জন্য একটি তৈরি করে যা একটি নির্দিষ্ট মেয়াদে সমস্ত পোস্ট ফেরত দেবে, কার্যকরভাবে ট্যাক্সনোমির শব্দ দ্বারা আদেশযুক্ত একটি সংরক্ষণাগার তৈরি করে। এটি ঘটানোর জন্য কোড:

  // Get your terms and put them into an array
  $issue_terms = get_terms([
    'taxonomy' => 'issues',
    'hide_empty' => false,
  ]);

  // Run foreach over each term to setup query and display for posts
  foreach ($issue_terms as $issue_term) {
    $the_query = new WP_Query( array(
      'post_type' => 'post',
      'tax_query' => array(
        array(
          'taxonomy' => 'issues',
          'field' => 'slug',
          'terms' => array( $issue_term->slug ),
          'operator' => 'IN'
        )
      )
    ) );

    // Run loop over each query
    while($the_query->have_posts()) :
      $the_query->the_post();

      // YOUR TEMPLATE OUTPUT FOR EACH POST

    endwhile;
  }

এই সাইটে সম্পর্কিত পঠন: একটি কাস্টম শৈলীরশ্রেণীর দ্বারা দলবদ্ধ কাস্টম পোস্ট ধরণের সমস্ত পোস্ট প্রদর্শন করুন


2

আমি নিশ্চিত নই কেন এখানে সমস্ত সমাধান খুব বেশি পরিমাণে চাপিয়েছে। ঠিক আছে, এটি অর্ধ দশক আগের, তবে আমি বর্তমানে নিম্নলিখিত কোডটি চালাচ্ছি এবং এটি কার্যকর:

   <?php // Default
    $wheels_args = array(
        'post_type' => 'wheels',
        'posts_per_page' => '96',
        'orderby' => 'taxonomy, name', // Just enter 2 parameters here, seprated by comma
        'order'=>'ASC'
    );
    $loop = new WP_Query($wheels_args);
    ?>

এটি প্রথমে আপনার সিপিটি এর বিভাগসমূহকে বর্ণানুক্রমিকভাবে শ্রেণিবদ্ধ করে এবং এই শ্রেণিবদ্ধ গ্রুপগুলিতে বর্ণানুক্রমিক ক্রম অনুসারে বাছাই করবে।


@ আইওপ কেন এটি গৃহীত উত্তর !? godশ্বরের ধন্যবাদ আমি স্ক্রল করেছি
হুয়ান সোলানো

1

আমি এই বিশেষ সমস্যার জন্য সমাধানটি ব্যবহার করেছি। এই সমাধানটি চূড়ান্ত ক্ষেত্রে যেখানে pre_get_postsফিল্টার ব্যবহার করা উভয়ই সম্ভব নয় এবং ক্যোয়ারীতে বিদ্যমান পৃষ্ঠা রয়েছে (যেমন: WooCommerce):

global $wpdb;

$taxonomies = array('my-tax-1', 'my-tax-2', 'my-tax-3');

$orderby = "'".implode("', '", array_keys($taxonomies))."'";
$id_sql = $GLOBALS['wp_query']->request;

$id_sql = preg_replace('/LIMIT\s+\d+\s?,?\s\d*/', '', $id_sql);
$id_sql = str_replace('SQL_CALC_FOUND_ROWS', '', $id_sql);

$term_sql = "SELECT
  tt.taxonomy AS `taxonomy`,
  t.name AS `term_name`,
  t.slug AS `term_slug`,
  count(*) AS `term_count`
FROM ({$id_sql}) p 
JOIN wp_term_relationships tr
  ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt
  ON tr.term_taxonomy_id = tt.term_taxonomy_id
JOIN wp_terms t
  ON tt.term_id = t.term_id
WHERE tt.taxonomy IN ({$orderby})
GROUP BY t.slug
ORDER BY
  FIELD(tt.taxonomy, {$orderby})"; // Add further specific ordering here

$results = $wpdb->get_results($term_sql, ARRAY_A);

আমি এটি ট্যাক্সনমি, টার্ম এবং প্রতি-পদে পোস্টের গণনার দ্বারা অর্পিত একটি নেভ মেনু তৈরি করতে ব্যবহার করেছি।

আপনি যদি কেবল পোস্টগুলি চান তবে ক্যোয়ারীটি SELECT p.*এবং এ পরিবর্তন করুনGROUP BY p.ID


0

এটি ক্যোয়ারির আগে একটি প্রশ্নের মতো, তবে আমরা খুব বেশি পোস্ট জিজ্ঞাসা না করে বিরক্ত করব না ... ধারণাটি মূল ক্যোয়ারীটি সংশোধন করার জন্য যাতে আমাদের এমনকি টেম্পলেটগুলিতে গিয়ে নতুন কোয়েরি তৈরি করার প্রয়োজন হয় না এবং loops ...

function grouped_by_taxonomy_main_query( $query ) {

    if ( $query->is_home() && $query->is_main_query() ) { // Run only on the homepage

        $post_ids = array();

        $terms = get_terms('my_custom_taxonomy');

        foreach ( $terms as $term ) {
            $post_ids = array_merge( $post_ids, get_posts( array( 
                'posts_per_page' => 4, // as you wish...
                'post_type' => 'my_custom_post_type', // If needed... Default is posts
                'fields' => 'ids', // we only want the ids to use later in 'post__in'
                'tax_query' => array( array( 'taxonomy' => $term->taxonomy, 'field' => 'term_id', 'terms' => $term->term_id, )))) // getting posts in the current term
            );
        }

        $query->query_vars['post_type'] = 'my_custom_post_type'; // Again, if needed... Default is posts
        $query->query_vars['posts_per_page'] = 16; // If needed...
        $query->query_vars['post__in'] = $post_ids; // Filtering with the post ids we've obtained above
        $query->query_vars['orderby'] = 'post__in'; // Here we keep the order we generated in the terms loop
        $query->query_vars['ignore_sticky_posts'] = 1; // If you dont want your sticky posts to change the order

    }
}

// Hook my above function to the pre_get_posts action
add_action( 'pre_get_posts', 'grouped_by_taxonomy_main_query' );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.