Получение записей произвольного типа по категории в шаблоне страницы

16 июл. 2011 г., 11:09:06
Просмотры: 25.4K
Голосов: 4

Я создал произвольный тип записей с категориями и подкатегориями. Мне нужно вывести заголовки постов и изображения для заданной подкатегории или категории в шаблоне страницы.

Я смог получить все элементы произвольного типа записей, но не уверен, как двигаться дальше... буду благодарен за помощь.

<?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];
?>
1
Комментарии

К вашему сведению, register_post_type имеет аргумент register_meta_box_cb, который принимает callback-функцию для регистрации метабоксов, применимых к этому типу записи (так что вам не нужно регистрировать их на действии init, что в любом случае было бы неправильным действием для их регистрации)...

t31os t31os
16 июл. 2011 г. 15:28:55
Все ответы на вопрос 4
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' );
22 июл. 2011 г. 23:36:17
1

Вы можете получить записи, если у вас есть/известен слаг категории/подкатегории...

Просто передайте его в массиве аргументов для query_posts.

$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 ,'taxonomy_name'=>'слаг категории/подкатегории');

query_posts($args); 
16 июл. 2011 г. 11:19:49
Комментарии

Кажется, это не работает. Я знаю слаги, но код выводит все записи из портфолио. Выше я разместил функцию, которая создает пользовательский тип записи, если это поможет. Категории - это галереи, и та, которую я пытаюсь вывести - это aerial.

toomanyairmiles toomanyairmiles
16 июл. 2011 г. 11:47:29
1

Я использовал этот код раньше для более сложных задач, но если убрать вторую таксономию, он будет выводить все записи в заданной категории:

<?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;                                    
19 июл. 2011 г. 09:12:42
Комментарии

Боюсь, безрезультатно.

toomanyairmiles toomanyairmiles
20 июл. 2011 г. 00:26:33
0

Ответ Rajeev сработал для меня, используя ваш код. В чистой установке я сделал следующее:

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

$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10, 'galleries'=>'аэросъемка' );

Отображались только "аэросъемка 1" и "аэросъемка 2".

Есть вероятность, что ваш код не вызывается (может быть, используется другой шаблон)?

21 июл. 2011 г. 19:42:42