Je travaille avec des types de publication personnalisés depuis quelque temps déjà, mais hier, j’ai tenté ma chance avec une taxonomie personnalisée pour les coupler.
Voici ma taxonomie 'société':
function create_company_taxonomy() {
$labels = array(
'name' => _x( 'Companies', 'taxonomy general name' ),
'singular_name' => _x( 'Company', 'taxonomy singular name' ),
'search_items' => __( 'Search Companies' ),
'all_items' => __( 'All Companies' ),
'parent_item' => __( 'Parent Company' ),
'parent_item_colon' => __( 'Parent Company:' ),
'edit_item' => __( 'Edit Companies' ),
'update_item' => __( 'Update Companies' ),
'add_new_item' => __( 'Add New Company' ),
'new_item_name' => __( 'New Company Name' ),
'menu_name' => __( 'Company' ),
);
$args = array(
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'company' ),
'public' => true,
'hierarchical' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'query_var' => true,
'publicly_queryable' => true,
'capability_type' => 'post',
'hierarchical' => true,
'has_archive' => true
);
register_taxonomy( 'company', array( 'brochures','business-cards','post','websites' ), $args );
}
add_action( 'init', 'create_company_taxonomy', 0 );
Comme vous pouvez le constater, j'essaie de l'utiliser avec des "messages" ainsi que trois types de messages personnalisés: "brochures", "cartes de visite", "sites Web".
Lorsque je crée un modèle taxonomy-company.php (basé sur archive.php) et que je donne à chacun de ces post_types un terme de la taxonomie, seules les publications s'affichent sur la page. Je ne parviens pas à afficher les types d'articles personnalisés.
Ai-je besoin d'une requête personnalisée? Toute idée serait appréciée.
EDIT: Voici un de mes register_post_types aussi
add_action( 'init', 'create_custom_post_types' );
function create_custom_post_types() {
$labels = array(
'name' => __( 'Websites' ),
'singular_name' => __( 'Website' )
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'websites'),
'taxonomies' => array( 'category','company','post_tag' ),
'supports' => array( 'title', 'editor', 'thumbnail' , 'custom-fields', 'excerpt' ),
'exclude_from_search' => true
);
register_post_type( 'websites', $args);
}
Par défaut, tous les types de publication publique sont inclus dans la requête principale principale sur les pages de taxonomie. Si vous examinez le paramètre register_post_type()'s
public lorsqu'il est défini sur true
'true'
Implique
exclude_from_search
: false,publicly_queryable
: true,show_in_nav_menus
: true etshow_ui
: true.
Lorsque vous enregistrez votre type de publication, définissez exclude_from_search
sur true
. Cela supprime non seulement le type de publication personnalisé de la recherche, mais également de la requête principale de la page de taxonomie. Encore une fois, à partir du codex pour le paramètre exclude_from_search
Remarque: Si vous souhaitez afficher la liste des publications associées aux termes de taxonomie, vous devez définir exclude_from_search sur false (c'est-à-dire: pour l'appel
site_domaine/?taxonomy_slug=term_slug
ousite_domaine/taxonomy_slug/term_slug
). Si vous définissez la valeur sur true, WordPress ne trouvera pas vos publications sur la page taxonomie (ex:taxonomy.php
) et/ou la pagination générera une erreur 404.
Vous devez définir exclude_from_search
sur false, effacer vos permaliens et votre bon départ. Si vous devez exclure un type de publication de la page de recherche, vous pouvez utiliser pre_get_posts
pour supprimer le type de publication de la requête principale.
Juste pour votre intérêt, voici le morceau de code dans la classe WP_Query
(dans wp-includes/query.php) qui est chargé d'inclure et d'exclure les types de publication de la requête principale sur les pages d'archive de terme de taxonomie
if ( $this->is_tax ) {
if ( empty($post_type) ) {
// Do a fully inclusive search for currently registered post types of queried taxonomies
$post_type = array();
$taxonomies = array_keys( $this->tax_query->queried_terms );
foreach ( get_post_types( array( 'exclude_from_search' => false ) ) as $pt ) {
$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
if ( array_intersect( $taxonomies, $object_taxonomies ) )
$post_type[] = $pt;
}
if ( ! $post_type )
$post_type = 'any';
elseif ( count( $post_type ) == 1 )
$post_type = $post_type[0];
$post_status_join = true;
} elseif ( in_array('attachment', (array) $post_type) ) {
$post_status_join = true;
}
}
La partie importante ici est: get_post_types( array( 'exclude_from_search' => false )
. C'est ici que la requête obtient tous les types de publication publique où exclude_from_search
est défini sur false
. Tous les types de publication correspondants avec exclude_from_search
défini sur true
seront exclus de la requête. C'est pourquoi vos types de publication personnalisés ne sont pas inclus dans la page d'archivage des termes de taxonomie.