Cum interoghez un tip de postare personalizat cu o taxonomie personalizată?

7 feb. 2013, 15:01:12
Vizualizări: 267K
Voturi: 53

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')
        )
    );
}
0
Toate răspunsurile la întrebare 5
2
83

Î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();
7 feb. 2013 15:11:45
Comentarii

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 Stephen
7 feb. 2013 16:21:14

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

Aamer Shahzad Aamer Shahzad
19 nov. 2015 22:56:32
4
25

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();
19 nov. 2015 23:04:52
Comentarii

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 )

Tom Dyer Tom Dyer
29 iul. 2016 00:36:21

da, ai dreptate, bun venit Tom Dyer

Aamer Shahzad Aamer Shahzad
19 aug. 2016 00:11:12

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

user3135691 user3135691
16 feb. 2018 12:34:36

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

Desi Desi
22 apr. 2019 00:34:24
0

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();
?>
29 apr. 2020 02:03:47
0

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 } ?>
14 iun. 2020 15:22:49
4
-1

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();
26 sept. 2018 17:09:57
Comentarii

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

WebElaine WebElaine
4 ian. 2019 00:50:07

Păi eu lucrez cu v4.5 și funcționează pentru mine

mamunuzaman mamunuzaman
5 ian. 2019 14:22:29

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

WebElaine WebElaine
7 ian. 2019 15:40:12

Da, acum s-a schimbat din tax în tax_query..

mamunuzaman mamunuzaman
11 dec. 2019 12:58:14