получение категорий для пользовательского типа записей с прикрепленной пользовательской таксономией
В основном у меня есть пользовательский тип "товаров", к которому прикреплены две таксономии... обычная "категория" и пользовательская таксономия под названием "бренды".
У меня есть страница, специфичная для "бренда". На этой странице я хотел бы перечислить все "категории", в которых есть "продукт", с термином "бренд", на странице которого я нахожусь.
Например, скажем, я на странице "Nike". Я хочу, чтобы в нем были перечислены все категории, в которых есть "продукт" с "брендом" "Найк" прикреплен к ним.
Мои первоначальные мысли - использовать get_categories, но теперь есть способ определить конкретную таксономию или "бренд"?
$categories = get_categories('orderby=name&depth=1&hide_empty=0&child_of='.$cat);
Кто-нибудь делал это раньше или знает способ напрямую запросить базу данных для получения требуемых результатов?
Любая помощь очень важна, спасибо
3 answers
Привет @давеаспи:
То, что вы хотите сделать, распространено, но плохо обрабатывается в ядре WordPress. Вероятно, есть способы сделать это без пользовательского SQL, но я не думаю, что они будут масштабироваться для большого количества сообщений. Ниже приведена функция, которую я написал, под названием get_cross_referenced_terms()
, которая даст вам то, что вы хотите, в комплекте с примером того, как ее использовать.
Этот следующий код можно поместить в корень вашего сайта WordPress в файле test.php
, чтобы
увидеть, как он работает. Затем вы можете скопировать функцию get_cross_referenced_terms()
в файл functions.php
вашей темы или в файл .php
плагина, над которым вы, возможно, работаете:
<?php
include('wp-load.php');
$nike = get_term_by('slug','nike','brand'); // This here just to illustrate
$terms = get_cross_referenced_terms(array(
'post_type' => 'product',
'related_taxonomy' => 'brand',
'term_id' => $nike->term_id,
));
foreach($terms as $term) {
echo "<p>{$term->name}</p>";
}
function get_cross_referenced_terms($args) {
global $wpdb;
$args = wp_parse_args($args,array(
'post_type' => 'post',
'taxonomy' => 'category',
'related_taxonomy' => 'post_tag',
'term_id' => 0,
));
extract($args);
$sql = <<<SQL
SELECT DISTINCT
{$wpdb->terms}.*,
COUNT(*) AS post_count
FROM
{$wpdb->terms}
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id={$wpdb->term_taxonomy}.term_id
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
INNER JOIN {$wpdb->posts} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
INNER JOIN {$wpdb->term_relationships} related_relationship ON {$wpdb->posts}.ID=related_relationship.object_id
INNER JOIN {$wpdb->term_taxonomy} related_term_taxonomy ON related_relationship.term_taxonomy_id=related_term_taxonomy.term_taxonomy_id
INNER JOIN {$wpdb->terms} related_terms ON related_term_taxonomy.term_id=related_terms.term_id
WHERE 1=1
AND (related_term_taxonomy.taxonomy<>{$wpdb->term_taxonomy}.taxonomy OR related_terms.term_id<>{$wpdb->terms}.term_id)
AND {$wpdb->posts}.post_type='%s'
AND {$wpdb->term_taxonomy}.taxonomy='%s'
AND related_term_taxonomy.taxonomy='%s'
AND related_terms.term_id=%d
GROUP BY
{$wpdb->terms}.term_id
SQL;
$sql = $wpdb->prepare($sql,$post_type,$taxonomy,$related_taxonomy,$term_id);
$terms = $wpdb->get_results($sql);
return $terms;
}
Если вы хотите перечислить все доступные категории для пользовательского типа публикации, этот фрагмент может вам помочь.
Просто используйте стандартную функцию get_categories()
и передайте $args
, относящуюся к таксономии, которую вы зарегистрировали для своего CPT. Итак, если вы определили свою таксономию следующим образом:
register_taxonomy( 'the_taxonomy_named_in_your_CPT' );
Затем вы бы показали таксономию конечным пользователям через:
$args = array(
'taxonomy' => 'the_taxonomy_named_in_your_CPT',
'orderby' => 'name',
'show_count' => 1,
'pad_counts' => 1,
'hierarchical' => 1,
'echo' => 0
);
$allthecats = get_categories( $args );
echo ( '<pre>' );
print_r( $allthecats );
echo ( '</pre>' );
Вы увидите объект, который поможет вам на вашем пути.
Вы можете либо закодировать пользовательский sql-запрос, либо запросить тип публикации для этого "бренда", собрать категории и затем отобразить их, что-то вроде:
//get all your post of that type fo that spesific brand
$my_query = new WP_Query();
$my_query->query(array(
'post_type' => 'products',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'brand',
'field' => 'slug',
'terms' => $wp_query->query_vars['brand']
)
)
));
$my_cats = array();
if ($my_query->have_posts()){
//loop over all post and collect the categories in to an array
while ($my_query->have_posts()){
$my_query->the_post();
foreach((get_the_category($post->ID)) as $category) {
if (!in_array($category->cat_ID ,$my_cats)){
$my_cats[] = $category->cat_ID;
}
}
}
}
И здесь у вас есть список идентификаторов всех категорий в массиве $my_cats. из которого вы можете получить всю необходимую информацию