Obținerea unui tip de postare personalizat după categorie într-un șablon de pagină
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];
?>

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' );

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

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".

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;

Răspunsul lui Rajeev a funcționat pentru mine folosind codul tău. Într-o instalare goală, am făcut următoarele:
- am creat un fișier functions.php care conținea doar funcția ta
portfolio_register
și hook-uladd_action
care o apelează - am creat două galerii - "aerial" și "not aerial".
- 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").
- 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)?
