web-dev-qa-db-fra.com

Les types de publication personnalisés n'apparaissant pas sur la page d'archive Taxonomie personnalisée

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);
}
5
jkd540

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()'spublic lorsqu'il est défini sur true

  • 'true'

  • Implique exclude_from_search: false, publicly_queryable: true, show_in_nav_menus: true et show_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 ou site_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.

SOLUTION

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.

MODIFIER

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.

3
Pieter Goosen