Sinds WordPress 3.0 is het mogelijk om op maat gemaakt bericht typen (custom post types) te definiëren. Deze op maat gemaakte bericht typen kunnen net als de standaard bericht typen ingedeeld / geclassificeerd worden met behulp van de WordPress taxonomie systeem. Dit kan op basis van de standaard ingebouwde taxonomieën van WordPress (categorieën en tags) of op maat gemaakte taxonomieën.
Tijdens het definiëren van een op gemaakt bericht type kun je aangeven welke taxonomieën beschikbaar moeten zijn voor het betreffende bericht type. In onderstaande code fragment wordt een op maat gemaakt bericht type ‘project’ gedefinieerd waarbij de standaard taxonomieën categorieën en tags beschikbaar worden gesteld:
register_post_type( 'project', array( 'label' => 'Projects' , 'public' => true , 'taxonomies' => array('category', 'post_tag') , 'has_archive' => true , 'rewrite' => array('slug' => 'projecten') ) );
Standaard worden deze op gemaakte berichten niet weergegeven op archief pagina’s zoals van categorieën, tags, auteurs, maanden, jaren, etc. In bepaalde gevallen is het wel gewenst om deze daar ook weer te geven. Op het WordPress support forum is een topic “Custom post type tags/categories archive page” te vinden waarin een aantal oplossingen worden beschreven. Ook op de WordPress Stack Exchange zijn verschillende vragen hierover te vinden: “Displaying custom post type on category pages but not on blog listings“.
Veel van de oplossing maken gebruik van de ‘pre_get_posts’ filter, maar zetten deze naar mijn idee verkeerd in. In veel gevallen worden namelijk functies gebruikt die gebruik maken van de globale $wp_query object. Het is echter netter en beter om gebruik te maken van het query object die wordt doorgegeven aan de filter functie. In onderstaand code fragment is daar een voorbeeld van te zien:
function prefix_archive_any_post($query) { if($query->is_archive() && !$query->get('suppress_filters')) { $postType = $query->get('post_type'); if(empty($postType)) { $postType = 'any'; } $query->set('post_type', $postType); } return $query; } add_filter('pre_get_posts', 'prefix_archive_any_post');