Afișarea arhivei de categorii pentru tipuri de postări personalizate

4 iul. 2012, 18:24:10
Vizualizări: 24.9K
Voturi: 6

Am început să folosesc Custom Post Types destul de recent și îmi cer scuze dacă întrebarea mea pare stupidă, dar nu pot găsi un răspuns la întrebarea mea.

Am configurat un tip de postare personalizat numit actors cu câteva câmpuri personalizate și, (foarte important), folosesc categorii standard pentru a separa acești actori în listări de bărbați, femei și copii:

'taxonomies' => array('category', 'post_tag')

...deoarece am crezut că ar fi o modalitate mult mai curată și mai ordonată de... ei bine, categorizare a actorilor. Cu toate acestea, sunt complet blocat în ceea ce privește modul de afișare a acestor categorii în orice fel.

Am un fișier personalizat archive-actors.php care afișează toți actorii, dar vreau să pot să îi filtrez după categorie; de exemplu să afișez doar bărbații. Totuși, dacă încerc un URL standard precum mysite.com/category/actors/men primesc doar

Ne pare rău, dar nu există încă nicio postare în categoria Bărbați.

Același lucru se întâmplă dacă încerc doar mysite.com/category/men - în niciunul dintre cazuri nu folosește template-ul archive-actors.php.

Poate cineva să mă ajute să-mi clarific această confuzie și să mă îndrume în direcția corectă pentru a putea filtra acești actori încăpățânați?

Editare:

Așa cum sugerează @mrwweb mai jos (și am uitat să menționez că am încercat), următorul cod poate fi adăugat în fișierul functions.php:

function query_post_type($query) {
    $post_types = get_post_types();

    if ( is_category() || is_tag()) {

        $post_type = get_query_var('actors');

        if ( $post_type ) {
            $post_type = $post_type;
        } else {
            $post_type = $post_types;
        }

        $query->set('post_type', $post_type);

        return $query;
    }
}

add_filter('pre_get_posts', 'query_post_type');

...așa cum este menționat aici, care funcționează în sensul că va afișa tipurile mele de postări personalizate categorizate pe pagina regulată archive.php, dar nu utilizează archive-actors.php, care este esențial.

5
Comentarii

archive-actors.php este șablonul tău de arhivă pentru tipul de postare, nu un șablon de arhivă pentru taxonomie. Acesta este un comportament normal și de așteptat.

Milo Milo
4 iul. 2012 19:16:42

@Milo Am înțeles. Cu acest lucru în minte, există ceva numit arhivă personalizată pentru taxonomie?

indextwo indextwo
4 iul. 2012 19:34:47

există, dar este specifică unei taxonomii personalizate. dacă vrei doar să forțezi utilizarea archive-actors.php pentru categorii, vezi răspunsul meu

Milo Milo
4 iul. 2012 19:48:50

Nu folosi get_query_var(), folosește $query->get(). De asemenea - vrei ca asta să afecteze doar interogarea principală? Dacă da, va trebui să adaugi o verificare $query->is_main_query() alături de (is_category() || is_tag())

Stephen Harris Stephen Harris
4 iul. 2012 19:53:35

6 ani mai târziu, aceasta este o întrebare stupidă și arată cât de slabă era înțelegerea mea despre CPT-uri. Mă învârtesc cu ochii la mine destul de tare chiar acum.

indextwo indextwo
16 apr. 2018 21:18:45
Toate răspunsurile la întrebare 4
0

Puteți forța utilizarea șablonului personalizat pentru categorii folosind filtrul category_template:

function wpa57439_category_template( $templates = '' ){
    if( !is_array( $templates ) && !empty( $templates ) ) {
        $templates = locate_template( array( 'archive-actors.php', $templates ), false );
    } 
    elseif( empty( $templates ) ) {
        $templates = locate_template( 'archive-actors.php', false );
    }
    else {
        $new_template = locate_template( array( 'archive-actors.php' ) );
        if( !empty( $new_template ) ) array_unshift( $templates, $new_template );
    }
    return $templates;
}
add_filter( 'category_template', 'wpa57439_category_template' );

adaptat după Filtrul ierarhiei din codex.

4 iul. 2012 19:49:24
2

Acesta este comportamentul așteptat al arhivelor de categorii. După cum se poate vedea aici pe forumurile de Suport, următorul fragment de cod ar trebui să rezolve problema (doar schimbați "article" cu tipul postului dvs.):

add_filter('pre_get_posts', 'query_post_type');
function query_post_type($query) {
  if(is_category() || is_tag()) {
    $post_type = get_query_var('post_type');
    if($post_type)
        $post_type = $post_type;
    else
        $post_type = array('post','articles','nav_menu_item');
    $query->set('post_type',$post_type);
    return $query;
    }
}

ACTUALIZARE: Ups. Am luat fragmentul greșit. Voiam să folosesc acesta.

4 iul. 2012 18:34:37
Comentarii

Singur, acel fragment de cod nu va face nimic; există o paranteză excesivă la sfârșit și $query este nedefinit. Am găsit discuția la care te-ai referit mai devreme și am încercat-o în contextul unui filtru pre_get_posts în fișierul meu functions.php; acest lucru pare să funcționeze, dar nu utilizează șablonul meu personal archive-actors.php, ceea ce este frustrant.

indextwo indextwo
4 iul. 2012 18:55:07

Linkul către discuție este greșit în mai multe locuri...

Stephen Harris Stephen Harris
4 iul. 2012 19:45:42
0

Alternativ, ceea ce poți face este să adaugi o nouă regulă wp_rewrite pentru a crea o structură de URL nouă pentru afișarea doar a postărilor dintr-un anumit CPT (tip de postare personalizată) și categorie. Ceva similar cu .gist-ul pe care l-am postat aici:

[edit: nu pot încorpora .gists așa că iată codul și link-ul ]

/**
* Acest exemplu poate fi extins și utilizat pentru etichete sau orice altă taxonomie.
*/

add_action('init', 'category_cpt_rewrites');

function category_cpt_rewrites() {
    $custom_post_types = array('video', 'audio', 'photo', 'file'); // exemple de tipuri de postări personalizate
    foreach ( $custom_post_types as $post_type ) {
        $rule = '^' . $post_type . '/category/(.+?)/?$';
        $rewrite = 'index.php?post_type=' . $post_type . '&category_name=$matches[1]';
        add_rewrite_rule($rule,$rewrite,'top');
    }
}

// asigură-te că resetezi regulile
// acest cod va prelua următoarea structură de URL (exemplu cu CPT video și categorie politică) -> video/category/politics și va returna postări din categoria politics care aparțin tipului de postare personalizată "video".

// reține că dacă dorești ca această soluție să fie cu adevărat eficientă, va trebui să creezi o funcție personalizată "the_category()" sau similară pentru a returna structura corectă de URL pentru o listă de categorii aparținând unei postări de tip personalizat.
28 oct. 2012 19:59:34
0

Șabloane de Taxonomie

https://developer.wordpress.org/themes/template-files-section/taxonomy-templates/#custom-taxonomy

Când slug-ul taxonomiei de categorie este "actors-category":

Creați-l din șablonul de categorie: taxonomy-actors-category.php

23 mar. 2023 21:52:36