web-dev-qa-db-fra.com

Inclure des types d'articles personnalisés dans le widget de catégories

J'ai donc une configuration assez simple, un CPT avec les variables par défaut category et post_tag comme taxonomies.

Supposons que 1 poste et 1 entrée CPT soient affectés à la même catégorie. J'ai besoin que cela soit également reflété dans le widget de catégorie.

J'ai réussi à les afficher tous les deux sur la page de catégorie via le filtre request pour que les liens générés par le widget fonctionnent.

Le problème est que si l'article n'existait pas, le widget ne générerait pas de lien pour la catégorie (le considérant vide).

En outre, le nombre d'éléments est incorrect, 1 au lieu de 2.

En fouillant dans le code du widget, c'est ce qui cause les problèmes:

wp_list_categories(apply_filters('widget_categories_args', $cat_args));

Je peux donc modifier les arguments via le filtre, mais wp_list_categories() ne dispose pas d'argument pour le type de message à utiliser.

J'ai déjà vu quelqu'un rencontrer le problème auparavant:

http://wordpress.org/support/topic/custom-post-types-and-category-widget - pas de chance

http://themehybrid.com/support/topic/custom-post-types-and-category-widget - même mec, je ne peux pas lire les réponses de Justin mais je suppose à nouveau que rien ne va plus. il a déposé un billet à la fin qui a été fermé

Réflexions sur la solution

J'aimerais vraiment ne pas copier/coller le code du widget par défaut et en créer un nouveau, mais résoudre ce problème en utilisant un filtre.

Cela étant dit, un marcheur personnalisé aiderait-il? Des idées?

En tant que note, j'ai résolu un problème similaire avec le widget Archives en utilisant ceci:

/*
* Add CPTs to wp_get_archives()
* http://bajada.net/2010/07/15/adding-custom-post-types-to-wp_get_archives
*/
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_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 ); 

À votre santé!

3
GreenDude

J'ai un cpt 'acteur' et il semble être automatiquement ajouté à la requête:

SELECT object_id, term_taxonomy_id
FROM wp_term_relationships INNER JOIN wp_posts ON object_id = ID 
WHERE term_taxonomy_id IN (38,40,30,11,32,34,29,39,35,9,31,19,33,37,42,41,27,25,36,1,26) 
AND post_type IN ('post', 'actor')
AND post_status = 'publish'

Call from: require, require_once, include, get_sidebar, get_template_part, locate_template, load_template, require, dynamic_sidebar, call_user_func_array, WP_Widget->display_callback, WP_Widget_Categories->widget, wp_list_categories, get_categories, get_terms, _pad_term_counts

(Utilisation de Requêtes de débogage plugin)

Et voici la définition du CPT:

register_post_type('actor', array(
  'public' => true,
  'labels' => $labels,
  'has_archive' => 'actors',
  'taxonomies' => array( 'category' )
));
1
scribu