WordPress

niestandardowa taksonomia – Wyświetlanie postów wyłącznie w swojej kategorii (nie nadrzędnej)

  • 11 grudnia, 2014
  • 5 min read
niestandardowa taksonomia – Wyświetlanie postów wyłącznie w swojej kategorii (nie nadrzędnej)


Oto ciekawe podejście do tego

POJĘCIE

Potrzebujemy listy terminów, w której posty są wymienione pod określonym terminem, ale przy użyciu konwencjonalnych metod posty są wymienione pod terminami rodzica, dziecka i wnuka. To, czego chcemy, to tylko wymień posty w ostatnim okresie, jeśli jest to wnuk, to post powinien być wymieniony tylko pod terminem wnuka

PROBLEMY Z AKTUALNYM KODEM

Ponieważ jest to tylko strona archiwum, która nie jest używana jako strona taksonomii, masz tutaj kilka poważnych błędów. Poniższy kod

<div id="content" class="site-content">    
    <?php if (category_description( $category ) == '') { ?>
    <?php } else { ?>
    <article class="single">
        <div id="subcats" class="entry-content">          
            <h2>Description</h2>
            <?php echo category_description( $category_id ); ?>
        </div> 
    </article> 
    <?php } ?>             
    <?php
        $term = get_queried_object();
        $children = get_terms( $term->taxonomy, array(
        'parent'    => $term->term_id,
        'hide_empty' => 0,
        'show_count' => 0
        ) );
    if($children) {
    ?>
    <article class="single">
        <div id="subcats" class="entry-content">             
            <?php 
            $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); 
            if ($term->parent == 0) { ?>
            <h2>Browse Sub-categories:</h2> 
            <ul>
                <?php wp_list_categories('taxonomy=wpl_documents_category&depth=1&title_li=&child_of=" . $term->term_id); ?>
            </ul>   
                <?php } else { ?>
            <h2>Browse Sub-categories:</h2> 
            <ul>
                <?php wp_list_categories("taxonomy=wpl_documents_category&&title_li=&child_of=" . $term->term_id); } ?>
            </ul>     
        </div> 
    </article> 
    <?php } ?>             
    <div>&nbsp;</div>
</div>  

należy usunąć. Prowadzi to do dużej listy błędów. Jeśli włączysz debugowanie, zobaczysz, o czym mówię. Ten kod będzie działał tylko w szablonie taksonomii lub kategorii z kilkoma poprawkami lub jeśli strona archiwum jest faktycznie używana jako strona taksonomii z odpowiednim tagiem warunkowym.

Warto przeczytać!  Wszystko, co musisz wiedzieć o zjeździe społeczności! – Wiadomości WordPressa

PRZEPŁYW PRACY

Jest to bardzo podstawowa lista, która zawiera terminy w porządku alfabetycznym, niezależnie od terminu rodzica, dziecka lub wnuka

To, co musimy zrobić, to uzyskać listę wszystkich postów dla określonego typu postów w archiwum specyficznym dla taksonomii. Odbędzie się to za pomocą a tax_query z WP_Query. get_terms() zostanie użyty do uzyskania listy terminów należących do określonej taksonomii. Zostanie to wykorzystane w tax_query aby dostać posty.

Zdecydowałem się napisać funkcję, której można używać globalnie do wyświetlania listy terminów.

Kiedy wszystkie posty zostaną zwrócone, musimy uzyskać warunki, do których należy każdy post. W tym celu korzystamy z get_the_terms()

Aby uwzględnić posty należące do terminu nadrzędnego i/lub podrzędnego i/lub wnuka, posortowałem zwróconą tablicę terminów za pomocą usort zgodnie z identyfikatorem terminu, tak aby ostatni termin w wierszu pojawił się jako pierwszy. Tym terminem będzie wnuk lub dziecko.

Post nie może jednak należeć do dwóch terminów na tym samym poziomie, na przykład mieć dwa terminy podrzędne. Gdy tak się stanie, termin z najwyższym identyfikatorem terminu będzie nadal używany

Warto przeczytać!  Jak zarządzać wieloma witrynami WordPress z jednego pulpitu nawigacyjnego

Pierwszy termin w posortowanej tablicy zostanie użyty do utworzenia tej listy i dodania pod nią tytułu posta

Ta nowa tablica, która zostanie utworzona, zostanie posortowana według ksort tak, aby lista terminów była posortowana alfabetycznie. Posty są sortowane według daty opublikowania

Dodałem również stan przejściowy, aby funkcja była szybsza i mniej obciążała zasoby. Ta lista będzie aktualizowana co 24 godziny, możesz po prostu zmienić ją w razie potrzeby, wydłużyć ją. Wybierz czas, który odpowiada częstotliwości dodawania nowych postów. Jeśli dodajesz nowe posty co tydzień, spraw, aby czas przejściowy wygasał raz w tygodniu

Aby mieć pewność, że lista jest aktualizowana za każdym razem, gdy post jest usuwany, publikowany lub aktualizowany, plik transition_post_status akcja służy do usuwania przejściowego za każdym razem, gdy post jest publikowany, usuwany lub aktualizowany

POZWALA KOD

Oto kod, wklej to wszystko do swojego functions.php

function get_term_post_list( $taxonomy = "category', $post_type="post" ) {

    if ( false === ( $q = get_transient( 'term_list' ) ) ) {

        $q = '';

        $term_ids = get_terms( $taxonomy, 'fields=ids' );
        if ( ! empty( $term_ids ) && ! is_wp_error( $term_ids ) ){

            $args = array( 
                'posts_per_page' => -1,
                'post_type' => $post_type,
                'fields' => 'names',
                'tax_query' => array(
                    array(
                        'taxonomy' => $taxonomy,
                        'field'    => 'term_id',
                        'terms'    => $term_ids,
                    ),
                ),
            );

            $query = new WP_Query($args); 
            ?><   
            if( $query->have_posts() ) {

                while ( $query->have_posts() ) { 

                    $query->the_post(); 

                    $a="<a href="". get_permalink() .'">' . get_the_title() .'</a>';

                    $all_terms = get_the_terms( $query->post->ID, $taxonomy );
                    $terms = array_values( $all_terms );        

                    usort( $terms, function ( $a, $b ) {
                        return ($a->term_id < $b->term_id) ? 1 : -1;
                    });

                    $b = ucfirst( $terms[0]->name );    

                    $q[$b][] = $a; // Create an array with the category names and post titles
                }

                /* Restore original Post Data */
                wp_reset_postdata();

            }

            ksort( $q );
        }

        set_transient( 'term_list', $q, 24 * HOUR_IN_SECONDS );
    }
    return $q;
}

add_action( 'transition_post_status', function ( $new_status, $old_status, $post )
{

    delete_transient( 'term_list' );

}, 10, 3 );

JAK UŻYWAĆ

W ten sposób kod zostanie użyty w pliku szablonu, archive-post_documents.php

$lists = get_term_post_list( $taxonomy = 'wpl_documents_category', $post_type="post_documents"  );
foreach ($lists as $key=>$values) {

    echo $key;

    echo '<ul>';
        foreach ($values as $value){
            echo '<li>' . $value . '</li>';
        }
    echo '</ul>';
}


Źródło

Warto przeczytać!  shortcode - Zmodyfikuj funkcję Shortcode_atts