Cum interoghez un tip de postare personalizat cu o taxonomie personalizată?
Trebuie să preiau orice postări care folosesc o taxonomie personalizată.
$args = array(
'post_type' => 'adverts',
'advert_tag' => 'politics' // Nu pare să funcționeze.
);
query_posts($args);
while ( have_posts() ) : the_post();
//Afișează Postările
endwhile;
Declarația Taxonomiei:
add_action( 'init', 'add_custom_taxonomy', 0 );
function add_custom_taxonomy() {
register_taxonomy('advert_tag', 'Adverts',
array(
'hierarchical' => true,
'labels' => array(
'name' => _x( 'Etichete Anunțuri', 'nume general taxonomie' ),
'singular_name' => _x( 'Etichetă Anunț', 'nume singular taxonomie' ),
'search_items' => __( 'Caută Etichete Anunțuri' ),
'all_items' => __( 'Toate Etichetele Anunțurilor' ),
'parent_item' => __( 'Etichetă Anunț Părinte' ),
'parent_item_colon' => __( 'Etichetă Anunț Părinte:' ),
'edit_item' => __( 'Editează Etichetă Anunț' ),
'update_item' => __( 'Actualizează Etichetă Anunț' ),
'add_new_item' => __( 'Adaugă Etichetă Anunț Nouă' ),
'new_item_name' => __( 'Nume Nou Etichetă Anunț' ),
'menu_name' => __( 'Etichete Anunțuri' ),
),
'rewrite' => array(
'slug' => 'advert-tags',
'with_front' => false,
'hierarchical' => true
),
);
}
Declarația Tipului de Postare Personalizat:
add_action( 'init', 'create_post_type' );
function create_post_type() {
register_post_type( 'Adverts',
array(
'labels' => array(
'name' => __( 'Anunțuri' ),
'singular_name' => __( 'Anunț'),
'add_new' => __( 'Adaugă Nou' ),
'add_new_item' => __( 'Adaugă un Anunț Nou' ),
'edit' => __( 'Editează' ),
'edit_item' => __( 'Editează Anunț' ),
'new_item' => __( 'Anunț Nou' ),
'view' => __( 'Vizualizează' ),
'view_item' => __( 'Vizualizează Anunț' ),
'search_items' => __( 'Caută Anunțuri' ),
'not_found' => __( 'Nu s-au găsit Anunțuri' ),
'not_found_in_trash' => __( 'Nu s-au găsit Anunțuri în Coșul de Gunoi' ),
),
'supports' => array(
'title',
'thumbnail',
),
'has_archive' => true,
'menu_position' => 10,
'public' => true,
'rewrite' => array(
'slug' => 'adverts'
),
'taxonomies' => array('advert_tag')
)
);
}
În primul rând nu folosiți niciodată query_posts()
, citiți mai multe despre asta aici: Când ar trebui să folosiți WP_Query vs query_posts() vs get_posts()?.
Trebuie să folosiți WP_Query
pentru a prelua postările de care aveți nevoie. Citiți documentația pentru aceasta. În cazul dvs., interogarea ar putea arăta astfel:
$the_query = new WP_Query( array(
'post_type' => 'Adverts',
'tax_query' => array(
array (
'taxonomy' => 'advert_tag',
'field' => 'slug',
'terms' => 'politics',
)
),
) );
while ( $the_query->have_posts() ) :
$the_query->the_post();
// Afișare Postări ...
endwhile;
/* Restaurează Datele Originale ale Postării
* NB: Deoarece folosim new WP_Query nu intervenim asupra
* $wp_query original și nu trebuie să fie resetat.
*/
wp_reset_postdata();

Tocmai am observat că pare să extragă toate postările cu tipul de postare personalizat 'Adverts'. Totuși, următorul cod pare să funcționeze:
$the_query = new WP_Query( array( 'post_type' => 'Adverts', 'advert_tag' => 'politics' ));

@Stephen {tax} a fost depreciat începând cu versiunea 3.1 în favoarea {tax_query} și {tax_query} a fost introdus. Acest lucru încă funcționează, dar nu ar trebui să folosim funcțiile depreciate.
tax_query este utilizat cu un array de interogări pentru taxonomie. Am lucrat la tipul de postare personalizat FAQs și a funcționat pentru mine în același mod în care argumentul slug-ului taxonomiei {tax} funcționează în WP_Query.

Folosesc această interogare pentru a prelua postări personalizate (Postări FAQ) împreună cu taxonomia lor personalizată (faq_category). Deoarece parametrul {taxonomy} din argumentele WP_Query a fost depreciat începând cu v.3.1 și s-a introdus {tax_query}. Mai jos este codul care funcționează perfect.
$query = new WP_Query( array(
'post_type' => 'faqs', // numele tipului de postare
'tax_query' => array(
array(
'taxonomy' => 'faq_category', // numele taxonomiei
'field' => 'term_id', // term_id, slug sau name
'terms' => 48, // id-ul termenului, slug-ul termenului sau numele termenului
)
)
) );
while ( $query->have_posts() ) : $query->the_post();
// adaugă codul aici....
endwhile;
/**
* resetează interogarea originală
* ar trebui să folosim acest lucru pentru a reseta wp_query
*/
wp_reset_query();

Acesta este răspunsul corect - răspunsul acceptat nu va filtra după taxonomie deoarece tax_query necesită un array de array-uri. Această metodă imbricată este esențială pentru a face acest lucru să funcționeze. Mulțumesc pentru răspunsul tău )

Da, și acesta m-a ajutat să fac șablonul taxonomiilor să funcționeze. Mulțumesc!

Salut @AamerShahzad Am exact aceeași întrebare și am folosit răspunsul tău, dar pagina nu afișează niciun articol. Mă poți ajuta? https://stackoverflow.com/questions/55783769/how-do-i-pull-only-one-category-from-custom-post-type-in-a-template

Iată codul care funcționează ca prin magie. Preiau toate articolele pentru tipul de postare personalizat "university_unit" cu taxonomia personalizată "unit_type" și termenii taxonomici multipli precum "directorate" și "office". Sper că acest lucru va fi de ajutor.
<?php
// Argumentele pentru interogare
$args = array(
'post_type' => 'university_unit', // Tipul de postare personalizat
'posts_per_page' => -1, // Afișează toate postările
'orderby' => 'title', // Ordonează după titlu
'order' => 'ASC', // Ordine ascendentă
'tax_query' => array(
array(
'taxonomy' => 'unit_type', // Taxonomia personalizată
'field' => 'slug', // Câmpul după care se face filtrarea
'terms' => array('directorate', 'office') // Termenii taxonomici
)
)
);
$Query = new WP_Query($args);
if($Query -> have_posts()):
while($Query -> have_posts()):
$Query -> the_post();
?>
<div class="cm-post-list-item">
<article>
<div class="cm-post-head">
<h3 class="cm-text-blue">
<a href="<?php the_permalink(); ?>"><?php the_title();?></a>
</h3>
</div>
<div class="cm-post-body"><?php the_excerpt();?></div>
</article>
</div>
<?php
endwhile;
else:
"Nu s-au găsit Birouri Administrative. Încercați din nou mai târziu";
endif;
wp_reset_postdata();
?>

Acest cod m-a ajutat să obțin toate articolele listate sub fiecare termen pentru taxonomia personalizată pentru CPT
<?php
// Obține lista tuturor termenilor taxonomiei -- În titluri simple de categorii
$args = array(
'taxonomy' => 'project_category',
'orderby' => 'name',
'order' => 'ASC'
);
$cats = get_categories($args);
// Pentru fiecare Termen din taxonomia personalizată obține articolele după term_id
foreach($cats as $cat) {
?>
<a href="<?php echo get_category_link( $cat->term_id ) ?>">
<?php echo $cat->name; ?> <br>
<?php // echo $cat->term_id; ?> <br>
</a>
<?php
// Argumentele pentru interogare
$args = array(
'post_type' => 'portfolio', // tipul de postare
'tax_query' => array(
array(
'taxonomy' => 'project_category', // vocabularul personalizat
'field' => 'term_id', // term_id, slug sau name (Definește după ce vrei să cauți termenul de mai jos)
'terms' => $cat->term_id, // furnizează slug-urile termenilor
),
),
);
// Interogarea
$the_query = new WP_Query( $args );
// Bucla
if ( $the_query->have_posts() ) {
echo '<h2>Lista articolelor etichetate cu această etichetă</h2>';
echo '<ul>';
$html_list_items = '';
while ( $the_query->have_posts() ) {
$the_query->the_post();
$html_list_items .= '<li>';
$html_list_items .= '<a href="' . get_permalink() . '">';
$html_list_items .= get_the_title();
$html_list_items .= '</a>';
$html_list_items .= '</li>';
}
echo $html_list_items;
echo '</ul>';
} else {
// nu s-au găsit articole
}
wp_reset_postdata(); // resetează variabila globală $post;
?>
<?php } ?>

Acest răspuns nu mai este valid deoarece WordPress și-a schimbat informațiile despre parametrii taxonomiei. Vă rugăm să folosiți această metodă. Va funcționa. Pentru mine funcționează. "tax_query" este înlocuit cu "tax". Sper că va funcționa.
$the_query = new WP_Query( array(
'post_type' => 'Adverts',
'tax' => array(
array (
'taxonomy' => 'advert_tag',
'field' => 'slug',
'terms' => 'politics',
)
),
) );
while ( $the_query->have_posts() ) :
$the_query->the_post();
// Afișare Articole ...
endwhile;
/* Restaurează Datele Originale ale Articolului
* NB: Deoarece folosim new WP_Query nu interferăm cu
* $wp_query original și nu trebuie să fie resetat.
*/
wp_reset_postdata();

Este exact opusul - tax
era vechea metodă, tax_query
este metoda curentă (v3.1+).

WordPress este faimos pentru compatibilitatea cu versiunile anterioare. Vechea metodă încă funcționează, dar a fost depreciată, așa că eventual ar putea fi eliminată și este mai sigur să folosești metoda mai nouă.
