Obținerea unui tip de postare personalizat după categorie într-un șablon de pagină

16 iul. 2011, 11:09:06
Vizualizări: 25.4K
Voturi: 4

Am creat un tip de postare personalizat cu categorii și subcategorii, și am nevoie să afișez titlurile și imaginile postărilor pentru o anumită subcategorie sau categorie într-un șablon de pagină.

Am reușit să obțin toate elementele listate în tipul de postare personalizat, dar nu sunt sigur cum să continui... orice ajutor este apreciat.

<?php 
$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;
?>

Funcția care creează tipul de postare personalizat și taxonomia arată astfel:-

<?php

// TIP DE POSTARE PERSONALIZAT 1
add_action('init', 'portfolio_register');

function portfolio_register() {
    $args = array(
        'label' => __('Portofoliu'),
        'singular_label' => __('Portofoliu'),
        '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" => "Galerii", 
        "singular_label" => "Galerii", 
        "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", "Opțiuni Galerie", "portfolio_meta_options", "portfolio", "normal", "low");
    add_meta_box("portfoliometa", "Opțiuni Element Portofoliu", "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
Comentarii

FYI, register_post_type are un argument register_meta_box_cb care acceptă o funcție de callback pentru a înregistra metabox-uri aplicabile acelui tip (deci nu este nevoie să le înregistrați pe acțiunea init, care oricum ar fi acțiunea incorectă pentru înregistrarea lor)..

t31os t31os
16 iul. 2011 15:28:55
Toate răspunsurile la întrebare 4
0

Aceasta este o versiune a unei funcții pe care o folosesc în cadrul la care lucrez, cu un exemplu HTML care înlocuiește o altă funcție care conține ceva similar.

// Buclă Personalizată

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();
}

Deci, apoi ai putea folosi funcția cu argumentele create:

arrr_custom_loop( 'portfolio', 10, 'galleries', 'pirates' );
22 iul. 2011 23:36:17
1

Puteți obține acest lucru dacă aveți/cunoașteți slug-ul categoriei/subcategoriei...

Doar treceți-l în array-ul args pentru query_posts.

$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10 ,'taxonomy_name'=>'slug-ul categoriei/subcategoriei');

query_posts($args); 
16 iul. 2011 11:19:49
Comentarii

Se pare că nu funcționează, știu slug-urile, dar acest lucru afișează toate postările din portofoliu. Am postat funcția care creează tipul personalizat de postare mai sus, dacă asta ajută. Categoriile sunt galerii și cea pe care încerc să o extrag este "aerial".

toomanyairmiles toomanyairmiles
16 iul. 2011 11:47:29
1

Am folosit acest cod anterior pentru a face mai mult decât ai nevoie, dar dacă elimini a doua taxonomie, va lista toate articolele dintr-o anumită categorie pentru tine:

<?php
                    // setează taxonomiile
                    $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 ) : // listează toate categoriile

                            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 ) :  // listează toate brandurile în fiecare categorie

                                                $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() ) : // dacă există articole în brandul și categoria curentă, afișează-le

                                                    echo '<li><a href="'.get_term_link( $term->slug, $tax_two ).'">'.$term->name.'</a></li>';

                                                endif;

                                            endforeach; ?>

                            <?php echo '</ul></li>';

                        endforeach; ?>

Deci, adaptându-l pentru situația ta:

<?php
                    // setează taxonomiile
                    $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 ) : // listează toate categoriile

                            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() ) : // dacă există articole în categoria curentă, afișează-le

                                                foreach($the_posts as $post) :

                                                    echo '<li>Conținutul articolului tău aici</li>';
                                                endforeach;                                    
19 iul. 2011 09:12:42
Comentarii

Din păcate, nu am reușit.

toomanyairmiles toomanyairmiles
20 iul. 2011 00:26:33
0

Răspunsul lui Rajeev a funcționat pentru mine folosind codul tău. Într-o instalare goală, am făcut următoarele:

  1. am creat un fișier functions.php care conținea doar funcția ta portfolio_register și hook-ul add_action care o apelează
  2. am creat două galerii - "aerial" și "not aerial".
  3. am creat patru portofolii - "aerial 1", "aerial 2", "not aerial" și "no gallery", plasându-le în galeriile pe care numele le sugerează (sau nicio galerie, în cazul "no gallery").
  4. am creat index.php care conținea doar primul bloc de cod pe care l-ai inserat. Singura modificare pe care am făcut-o a fost adăugarea lui 'galleries'=>'aerial' în variabila ta $args:

$args = array( 'post_type' => 'portfolio', 'posts_per_page' => 10, 'galleries'=>'aerial' );

Doar "aerial 1" și "aerial 2" au fost afișate.

Există vreo posibilitate ca codul tău să nu fie apelat (poate un șablon diferit)?

21 iul. 2011 19:42:42