( ملاحظة المراقبين : كانت في الأصل بعنوان "كيفية الحصول على get_posts لنوع منشور مخصص موجود في تصنيفين مخصصين؟" )
لديّ نوع منشور مخصص له تصنيفان منفصلان ، أحدهما يسمى "نوع المشروع" والآخر يسمى "الحزمة" . أحتاج إلى الحصول على قائمة بالمشروعات ذات "نوع المشروع" A
و "Package" A
. حاولت استخدام الكود التالي:
$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);
$my_posts = get_posts($args);
ولكن هذا يحصل على جميع المنشورات التي هيإمافي نوع المشروع A OR Package A.
هل هناك أي طريقة لأقول في get_posts()
أنني أريد أن أعيد فقط المشاركات الموجودة فيكلاهماالتصنيف؟
اعتبارًا من الإصدار 1.3 ، يعمل استعلام التصنيفات المتعددة المكون الإضافي بشكل رائع مع WP_Query. الحجج الأصلي الخاص بك العمل كما هو.
$args = array(
'post_type' => 'portfolio',
'numberposts' => -1,
'project_type' => 'A',
'package' => 'A'
);
ثم قم بإجراء استعلام جديد وتحقق منه:
$foo = new WP_Query($args);
var_dump($foo->posts);
لقد اختبرت ذلك في إعداد التصنيف المخصص الخاص بي ، وأرجعت فقط المشاركات التي تطابق كلاهما المصطلحات في الاستعلام.
هناك طريقة أخرى مناسبة لاقتناص شروط التصنيف المتعددة مع QMT وهي بناء استعلامات URL بسيطة:
site.com/?post_type=portfolio&package=foo&project=bar
لقد استخدمت هذه الطريقة مع الدالة add_query_args()
لإنشاء ارتباطات على صفحة تقوم بتعديل الاستعلام الحالي ، مع تحسينه بإضافة مصطلحات وتصنيفات إضافية. يعمل بناء الجملة أيضًا بشكل رائع مع إدخال البحث ، حيث يتم نشر كلمات متعددة في حقل الإدخال على شكل foo + bar ، والتي تعمل بشكل رائع مع QMT:
site.com/?post_type=portfolio&project=alpha&colors=red+blue+green
التي تُرجع فقط المشاركات التي تلبي الكل هذه المعايير - النوع: محفظة/مشروع: ألفا/ألوان: أحمر + أزرق + أخضر
مرحبًاshaun :
(Rarst محق في أنها تضيف هذه الوظيفة إلى WordPress v3.1 ، لكنها لن تكون هنا لفترة من الوقت وأنا متأكد أنك بحاجة إليها الآن. يمكنك محاولة الحصول على الكود الذي تعمل عليه ومحاولة جعله يعمل ، يمكنك استخدام المكوّن الإضافي كلاهما Rarst و somatic الذكر أو يمكنك فقط تضمين الشفرة التي تحتاجها في نسختك أدناه.
التعليمة البرمجية التالية عبارة عن ربط posts_where
لإضافة متغير استعلام tax_terms
مع قيمة التنسيق ((colon-commas)} حيث تكون القيم هي term slugs :
"{$varname1}:{$value1},{$varname2}:{$value2},...{$varnameN}:{$valueN}"
هذا .php
قائم بذاته ، يمكنك الدخول إلى جذر موقع الويب الخاص بك لاختباره قبل سحب مكالمة add_action
وظيفة tax_terms_where()
في ملف functions.php
الخاص بمظهرك (أو في ملف .php
الخاص بأحد الإضافات الخاصة بك. )
<?php
/*
* Adds "tax_terms" to WP_Query()
*
* See: http://lists.automattic.com/pipermail/wp-hackers/2010-October/035258.html
* See: http://wordpress.stackexchange.com/questions/2255/
*
*/
header('Content-Type:text/plain');
include "wp-load.php";
add_action('posts_where','tax_terms_where',10,2);
$result = new WP_Query('post_type=portfolio&tax_terms=project_type:A,package:A');
foreach($result->posts as $post) {
echo "{$post->post_title}\n";
}
function tax_terms_where($where,$wp_query) {
if (isset($wp_query->query)) {
$query = $wp_query->query;
if (is_string($query))
parse_str($query,$query);
if (is_array($query) && isset($query['tax_terms'])) {
global $wpdb;
$tax_terms = explode(',',$query['tax_terms']);
foreach($tax_terms as $tax_term) {
list($taxonomy,$term) = explode(':',$tax_term);
$sql = <<<SQL
AND $wpdb->posts.ID IN (
SELECT tr.object_id
FROM $wpdb->term_relationships AS tr
INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
WHERE tt.taxonomy='%s' AND t.slug='%s'
)
SQL;
$where .= $wpdb->prepare($sql,$taxonomy,$term);
}
}
}
return $where;
}
إذا لم يكن هذا هو ما تحتاجه بالضبط ، على سبيل المثال ، تفضل مطابقة $term->term_id
بدلاً من مطابقة $term->slug
، فلن يكون من الصعب للغاية تعديل الرمز لتلبية احتياجاتك ، على افتراض أنك مرتاح لـ SQL و .php
.
قديم Q ، ولكن يبدو أنه يأتي هنا هو الوضع الحالي - استفسارات التصنيف تحسنت كثيرا في 3.1 وأكثر منذ ذلك الحين.
في هذه الأيام ، سيتم التعامل معها بسهولة من خلال الاستعلام الضريبي باستخدام علاقة AND
، على سبيل المثال من Codex:
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'movie_genre',
'field' => 'slug',
'terms' => array( 'action', 'comedy' ),
),
array(
'taxonomy' => 'actor',
'field' => 'term_id',
'terms' => array( 103, 115, 206 ),
'operator' => 'NOT IN',
),
),
انظر معايير التصنيف للحصول على وثائق كاملة.
إخلاء المسؤولية المعتادة - أنا لم أفسد الأشياء المخصصة بنفسي حتى الآن.
أعتقد أن استعلامات التصنيف المعقدة لا يتم تنفيذها في WP الأساسية (حتى الآن). جرب الاستعلام تصنيفات متعددة البرنامج المساعد.