Получение записей произвольного типа по категории в шаблоне страницы
Я создал произвольный тип записей с категориями и подкатегориями. Мне нужно вывести заголовки постов и изображения для заданной подкатегории или категории в шаблоне страницы.
Я смог получить все элементы произвольного типа записей, но не уверен, как двигаться дальше... буду благодарен за помощь.
<?php
// Получаем все записи типа portfolio, по 10 на страницу
$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
the_title();
echo '<div class="entry-content">';
the_content();
echo '</div>';
endwhile;
?>
Функция, которая создает произвольный тип записей и таксономию, выглядит так:
<?php
// ПРОИЗВОЛЬНЫЙ ТИП ЗАПИСЕЙ 1
add_action('init', 'portfolio_register');
function portfolio_register() {
$args = array(
'label' => __('Portfolio'),
'singular_label' => __('Portfolio'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => true,
'supports' => array('title', 'editor', 'thumbnail')
);
register_taxonomy("galleries", array("portfolio"), array(
"hierarchical" => true,
"label" => "Galleries",
"singular_label" => "Galleries",
"rewrite" => true)
);
register_post_type( 'portfolio' , $args );
}
add_action("admin_init", "admin_init");
add_action('save_post', 'save_portfolio_options');
add_action('save_post', 'save_portfolio_single_options');
function admin_init(){
add_meta_box("gallerymeta", "Gallery Options", "portfolio_meta_options", "portfolio", "normal", "low");
add_meta_box("portfoliometa", "Portfolio Item Options", "portfolio_single_meta_options", "portfolio", "side", "low");
}
function portfolio_meta_options(){
global $post;
$custom = get_post_custom($post->ID);
$excerpt = $custom["excerpt"][0];
$info = $custom["info"][0];
$linkto = $custom["linkto"][0];
?>

Это версия функции, которую я использую в фреймворке, над которым работаю, с примером HTML, заменяющим другую функцию, содержащую нечто подобное.
// Пользовательский цикл
function arrr_custom_loop( $r_type = 'post', $r_post_num, $r_tax = 'category', $r_terms = 'featured' ) {
$args = array(
'showposts' => $r_post_num,
'tax_query' => array(
array(
'post_type' => $r_type,
'taxonomy' => $r_tax,
'field' => 'slug',
'terms' => array(
$r_terms
),
)
)
);
query_posts( $args );
if (have_posts())
while ( have_posts() ) : the_post();
$more = 0;
?>
<article>
<header class="pagetitle">
<?php if ( is_singular() ) { ?>
<h1><?php the_title(); ?></h1>
<?php } else { ?>
<h2 class="entry"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php } ?>
</header>
<div class="content_wrapper">
<div class="content">
<?php the_content(); ?>
</div>
</div>
<?php if ( comments_open() && ! post_password_required() ) { ?>
<div class="comments_wrapper">
<div class="comments">
<?php comments_template(); ?>
</div>
</div>
<?php } ?>
</article>
<?php endwhile;
wp_reset_query();
}
Таким образом, вы можете использовать функцию с созданными аргументами:
arrr_custom_loop( 'portfolio', 10, 'galleries', 'pirates' );

Вы можете получить записи, если у вас есть/известен слаг категории/подкатегории...
Просто передайте его в массиве аргументов для query_posts.
$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 ,'taxonomy_name'=>'слаг категории/подкатегории');
query_posts($args);

Я использовал этот код раньше для более сложных задач, но если убрать вторую таксономию, он будет выводить все записи в заданной категории:
<?php
// настройка таксономий
$tax_one = 'project_category';
$tax_two = 'brand';
$post_type = 'project';
$categories = get_categories( array(
'type' => $post_type,
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 0,
'hierarchical' => 1,
'taxonomy' => $tax_one ));
foreach ( $categories as $category ) : // перебираем все категории
echo '<li><a href="'.get_term_link( $category->slug, $tax_one ).'">'.$category->name.'</a><ul>'?>
<?php $terms = get_terms( $tax_two, array( 'hide_empty' => 0 ) );
foreach ( $terms as $term ) : // перебираем все бренды в каждой категории
$myquery['tax_query'] = array(
array(
'taxonomy' => $tax_one,
'terms' => array($category->slug),
'field' => 'slug',
),
array(
'taxonomy' => $tax_two,
'terms' => array($term->slug),
'field' => 'slug',
)
);
$the_posts = new WP_Query($myquery);
if ( $the_posts->have_posts() ) : // если есть записи в текущем бренде и категории, выводим их
echo '<li><a href="'.get_term_link( $term->slug, $tax_two ).'">'.$term->name.'</a></li>';
endif;
endforeach; ?>
<?php echo '</ul></li>';
endforeach; ?>
Адаптируя его для вашего случая:
<?php
// настройка таксономий
$tax_one = 'category';
$post_type = 'portfolio';
$categories = get_categories( array(
'type' => $post_type,
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 0,
'hierarchical' => 1,
'taxonomy' => $tax_one ));
foreach ( $categories as $category ) : // перебираем все категории
echo '<li><a href="'.get_term_link( $category->slug, $tax_one ).'">'.$category->name.'</a><ul>'?>
<?php $the_posts = new WP_Query($myquery);
if ( $the_posts->have_posts() ) : // если есть записи в текущей категории, выводим их
foreach($the_posts as $post) :
echo '<li>Ваш вывод записей здесь</li>';
endforeach;

Ответ Rajeev сработал для меня, используя ваш код. В чистой установке я сделал следующее:
- Создал файл functions.php, содержащий только вашу функцию
portfolio_register
и хукadd_action
, который её вызывает - Создал две галереи - "аэросъемка" и "не аэросъемка"
- Создал четыре портфолио - "аэросъемка 1", "аэросъемка 2", "не аэросъемка" и "без галереи", разместив их в соответствующих галереях (или нигде, в случае "без галереи")
- Создал
index.php
, содержащий только первый блок кода, который вы вставили. Единственное изменение, которое я сделал - добавил'galleries'=>'аэросъемка'
в вашу переменную$args
:
$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10, 'galleries'=>'аэросъемка' );
Отображались только "аэросъемка 1" и "аэросъемка 2".
Есть вероятность, что ваш код не вызывается (может быть, используется другой шаблон)?
