Cum să afișezi postări obișnuite și tipuri personalizate de postări care aparțin unei categorii folosind doar șablonul generic de categorie?

28 aug. 2011, 11:37:50
Vizualizări: 14.5K
Voturi: 5

1) Site-ul meu are postări obișnuite și 2 tipuri personalizate de postări (știri și eseuri)

2) Toate folosesc categorii normale precum sport și sănătate (fără taxonomii personalizate)

3) Folosind șablonul generic category.php, cum pot face ca acest șablon să gestioneze toate categoriile afișând tot conținutul care aparține categoriei, indiferent de tipul de postare.

Sau mai simplu, aș dori ca șablonul generic category.php să gestioneze afișarea tuturor categoriilor, dar să includă și custom post types.

Poate fi o întrebare stupidă, dar m-am întors la WordPress după o pauză lungă și îmi e greu să înțeleg temele implicite pentru a face asta. Sunt doar confuz și frustrat acum.

Vă rog ajutați-mă

Pentru a rezolva această problemă, trebuie să modifici interogarea principală în fișierul category.php. Adaugă acest cod înainte de bucla WordPress:


// Modifică interogarea pentru a include custom post types
function add_custom_post_types_to_category_query($query) {
    if ($query->is_category() && $query->is_main_query()) {
        $query->set('post_type', array('post', 'news', 'essays')); // Adaugă aici toate tipurile de postări
    }
}
add_action('pre_get_posts', 'add_custom_post_types_to_category_query');

Acest cod va:

  • Intercepta interogarea principală WordPress
  • Verifica dacă este o pagină de categorie
  • Adăuga custom post types la interogare

Asigură-te că înlocuiești 'news' și 'essays' cu numele exact ale custom post types-urilor tale.

0
Toate răspunsurile la întrebare 6
1

Aruncați o privire la funcția query_posts() - prietenul vostru pentru modificarea interogării principale/implicită. Trebuie să apelați variabila globală $wp_query în prealabil pentru a modifica interogarea originală în loc să o înlocuiți.

Ceva de genul acesta ar trebui să funcționeze pentru voi. Puneți primele patru linii în fișierul dvs. category.php chiar înainte de începerea buclei principale:

// Modifică bucla implicită, include tipuri personalizate de articole
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'any' ) );
query_posts( $args );

// Începutul buclei arată astfel:
while ( have_posts() ) : the_post();

Dacă doriți să fiți mai selectivi în afișarea tipurilor de articole, puteți furniza un array cu tipurile dorite în loc de varianta generică 'post_type'=>'any':

$args = array_merge( $wp_query->query, array( 'post_type' => array('post','news','essays') ) );

Și bun venit înapoi în universul WordPress și comunitatea WPSE.
Sunt sigur că frustrarea va dispărea în curând ;)

28 aug. 2011 12:15:11
Comentarii

A funcționat! Mulțumesc mult, Maugly. Nu pot exprima suficientă recunoștință... a fost atât de frustrant. Te iubesc... ca un admirator platonic, desigur :p

damx damx
30 aug. 2011 10:18:41
0

La început am folosit soluția lui Maugly, dar apoi am găsit aceasta în codex-ul WordPress:

add_action( 'pre_get_posts', 'adauga_post_type_personalizat' );
/**
 * @param WP_Query $query
 * @return WP_Query
 */
function adauga_post_type_personalizat( $query ) {
    if ($query->is_main_query()) 
        $query->set( 'post_type', array( 'post', 'page', 'orice_tip_personalizat' ) );
    return $query;
}

Sper că va ajuta pe cineva.. poate nu este cea mai elegantă soluție, dar este puțin mai curată decât cea a lui Maugly..

22 ian. 2013 15:07:27
1

► Iată versiunea mea a sugestiei lui @Kower. Rezolvă câteva probleme în administrare.

add_action('pre_get_posts', 'add_my_custom_post_type');

/**
 * @param WP_Query $query
 * @return WP_Query
 */
function add_my_custom_post_type($query) {
    if(
        empty($query->query['post_type'])
        or $query->query['post_type'] === 'post'
    ){
        $query->set('post_type', array('post', 'my_custom_type'));
    }
}
15 mar. 2013 04:01:10
Comentarii

De asemenea posibil: $query->set('post_type', 'any');

tivnet tivnet
15 mar. 2013 05:53:12
0

Am vrut să adaug la acest lucru, referitor la răspunsul lui @tivnet. (Aș fi dorit să las un comentariu, dar reputația mea nu este suficient de mare)

Am constatat că soluțiile au funcționat, dar presupun că au avut consecința neintenționată de a afecta și zona de administrare, ceea ce înseamnă că vizitarea postărilor în wp-admin (wp-admin/edit.php) ar afișa și toate paginile și toate tipurile personalizate de postări în lista generică de postări. Poate confuz pentru alți utilizatori? Totuși, adăugarea:

and !is_admin()

în interiorul instrucțiunii if() pare să rezolve această problemă, păstrând în același timp modificarea pre_get_posts pe partea de front-end.

add_action('pre_get_posts', 'add_my_custom_post_type');

/**
 * @param WP_Query $query
 * @return WP_Query
 */
function add_my_custom_post_type($query) {
    if(
        empty($query->query['post_type'])
        or $query->query['post_type'] === 'post'
        and !is_admin()
    ){
        $query->set('post_type', 'any');
    }
}
13 dec. 2017 18:43:37
0

Pentru a include un tip personalizat de postare (custom post type) în bucla obișnuită (adică pe pagina de postări), adăugați următorul cod în fișierul index.php înainte de if ( have_posts() ) :

$args = array(
'post_type'   => array('post', 'custom_post_type'),
'post_status' => 'publish',
);
$new_post_loop = new WP_Query( $args );

apoi modificați următoarele două linii:

if ( have_posts() ) : schimbați în if ( $new_post_loop -> have_posts() ) :

și

while ( have_posts() ) : the_post(); în while ( $new_post_loop -> have_posts() ) : $new_post_loop -> the_post();

Această soluție evită problema afișării tipului personalizat de postare în ecranul cu toate postările din backend, care apare când se folosește add_action('pre_get_posts') ;)

13 dec. 2018 20:10:56
0
function namespace_add_custom_types( $query ) 
{
 // Verifică dacă este o categorie sau tag și dacă nu sunt suprimate filtrele
 if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) 
 {
   // Setează tipurile de postări de inclus în interogare
   $query->set( 'post_type', array(
  'post', 'nav_menu_item', 'your-custom-post-type-here' // Înlocuiește cu tipul tău personalizat de postare
   ));
  return $query;
}
}
// Adaugă filtrul la acțiunea pre_get_posts
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );
11 ian. 2019 11:08:53