Archive für benutzerdefinierte Post-Typen (ohne Seiten)

Ich bin im Grunde um das Standard-Archiv-Widget zu erweitern, so dass es nicht nur eine {Monat: Jahr} Liste der Standard-Posts zeigt, sondern auch meine neue benutzerdefinierte Post-Typ.

Aus diesem Beispiel konnte ich die neuen {Monat: Jahr} -Elemente in der Archivliste anzeigen lassen, aber nicht auf irgendetwas klicken.

Dann zeigte dieses Beispiel , wie Sie Elemente aus benutzerdefinierten Post-Typen in die Schleife einbeziehen und ihnen erlauben, sich durchzuklicken und die tatsächlichen Ergebnisse zurückzugeben.

Das letzte Problem, das ich habe, besteht darin, dass beim Klicken auf das Element {Monat: Jahr} in der Liste auch Ergebnisse von Seiteneinträgen zurückgegeben werden. Ich muss wissen, wie man Seiten aus meinen Ergebnissen herausfiltert, also sind es nur Post-Typen.

Der Code, den ich in functions.php habe, ist:

/** * Add custom Post Types to the Archives. */ add_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 ); function ucc_getarchives_where_filter( $where , $r ) { $args = array( 'public' => true , '_builtin' => false ); $output = 'names'; $operator = 'and'; $post_types = get_post_types( $args , $output , $operator ); $post_types = array_merge( $post_types , array( 'post' ) ); $post_types = "'" . implode( "' , '" , $post_types ) . "'"; return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where ); } /** * Add Custom Post Types to The Loop results. */ add_filter( 'request' , 'ucc_request_filter' ); function ucc_request_filter( $query ) { // Preview does not like having post_type set; feed is my personal preference. if ( empty( $query['preview'] ) && empty( $query['feed'] ) ) { $my_post_type = $query['post_type']; if ( empty( $my_post_type ) ) { $query['post_type'] = 'any'; } } return $query; } 

Solutions Collecting From Web of "Archive für benutzerdefinierte Post-Typen (ohne Seiten)"

ersetzen:

 return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where ); 

mit:

 return str_replace( "post_type = 'post'" , "post_type = 'YOUR_CUSTOM_TYPE'" , $where ); 

und ändern Sie YOUR_CUSTOM_TYPE zu Ihrem tatsächlichen benutzerdefinierten Post-Typ-Namen.

Aktualisieren:

Wenn Sie alle Arten außer Seiten möchten, dann ändern Sie Ihre function ab hier:

 add_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 ); function ucc_getarchives_where_filter( $where , $r ) { $args = array( 'public' => true , '_builtin' => false ); $output = 'names'; $operator = 'and'; $post_types = get_post_types( $args , $output , $operator ); $post_types = array_merge( $post_types , array( 'post' ) ); $post_types = "'" . implode( "' , '" , $post_types ) . "'"; //if page is somewhere in the middle then remove it $post_types = str_replace("'page',","", $post_types); //if page is somewhere the last type then remove it $post_types = str_replace("'page'","", $post_types); return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where ); } 

und um Ergebnisse in der Schleife zu erhalten, benutze dies:

 add_filter( 'pre_get_posts' , 'ucc_include_custom_post_types' ); function ucc_include_custom_post_types( $query ) { global $wp_query; /* Don't break admin or preview pages. This is also a good place to exclude feed with !is_feed() if desired. */ if ( !is_preview() && !is_admin() && !is_singular() ) { $args = array( 'public' => true , '_builtin' => false ); $output = 'names'; $operator = 'and'; $post_types = get_post_types( $args , $output , $operator ); $post_types = array_merge( $post_types , array( 'post' ) ); //remove page form array: foreach($post_types as $key => $val){ if ($val =='page'){ unset($post_types[$key]); } } if ($query->is_feed) { /* Do feed processing here if you did not exclude it previously. This if/else * is not necessary if you want custom post types included in your feed. */ } else { $my_post_type = get_query_var( 'post_type' ); if ( empty( $my_post_type ) ) $query->set( 'post_type' , $post_types ); } } return $query; }