8768 sujets

Développement web côté serveur, CMS

Bonsoir,

J'ai un phénomène bizarre sur un site WordPress:


J'ai déclaré un custom post type ( CPT ) 'lgmac_media' qui fonctionne parfaitement, avec un slug 'disc'.


//===================================================================
//==============   custom post type lgmac_media 
//===================================================================

//Initialize custom post type lgmac-media
function lgmac_media_init() {

	$labels = array(
		'name' => 'Discothèque',
		'singular_name' => 'CD',
		'add_new' => 'Ajouter un élément',
		'add_new_item' => 'Ajouter un élément de la Discothèque',
		'edit_item' => 'Modifier un élément de Discothèque',
		'new_item' => 'Nouveau media',
		'all_items' => 'Voir la liste',
		'view_item' => 'Voir l\'élément',
		'search_item' => 'Chercher un media',
		'not_found' => 'Aucun élément trouvé',
		'not_found_in_trash' => 'Aucun media dans la corbeille',
		'menu_name' => 'Discothèque'
		);

	$args = array(
		'labels' => $labels,
		'public' => true,
		'show_ui' => true,
		'show_in_menu' => true,
		'publicly_queryable' => true,
		'query_var' =>true,
		'rewrite' => array('slug' => 'disc'),
		'capability_type' => 'post',
		'has_archive' => true,
		'hierarchical' => false,
		'menu_position' => 5,
		'menu_icon' =>  get_stylesheet_directory_uri() . '/assets/disc_16.png',
		'exclude_from_search' => true,
		'supports' => array('title', 'editor', 'thumbnail')
	);


	register_post_type('lgmac_media', $args);	

}  // end function lgmac_media_init



//----------------Action hook to initialize the custom post type lgmac_media
add_action('init', 'lgmac_media_init');



le template que j'ai créé: archive-lgmac_media.php affiche parfaitement les éléments de ce CPT (avec le permalien http://mon-site/disc/ ).

Maintenant je créé une taxonomie 'genre_mus' pour mon CPT, avec un slug 'style'


//===================================================================
//==============   custom taxonomy pour lgmac-media 
//===================================================================
function lgmac_define_taxononomy_disco()  {

	$labels = array(
		'name' => 'Styles Musicaux',
		'singular_name' => 'style',
		'all_items' => 'tous les styles²',
		'edit_item' => 'modifier le style',
		'update_item' => 'mettre à jour le style',
		'add_new_item' => 'ajouter un style',
		'search_items' => 'Rechercher dans les styles',
		'new_item_name' => 'nouveau nom du style',
		'menu_name' => 'styles des disques'
	);


	$args = array(
		'labels' => $labels,
		'public' => true,
		'publicly_queryable' => true,
		'hierarchical' => true,
		'query_var' => true,
		'rewrite' => array('slug' => 'style'),
		'show_admin_column' => true
		);

	register_taxonomy('genre_mus','lgmac_media', $args);

}

// ----------Action hook to create taxonomy
add_action('init', 'lgmac_define_taxononomy_disco');



Je crée un template taxonomy.php et le permalien http://mon-site/style/rock/ utilise bien ce template taxonomy.php mais la boucle ne trouve rien à afficher.. (bien sur j'ai créé la valeur 'rock' dans la taxonomie genre_mus et j'ai affecté des éléments du CPT à cette taxonomie)

si je rajoute un var_dump( $wp_query); dans taxonomy.php, je vois que le CPT lgmac_media n'est pas dans wp_posts.post_type IN ('post', 'page', 'attachment')


// extrait du var_dump de $wp_query
//
public 'request' => string 'SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (18)
) AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 30' (length=433)
 


j'ai donc rajouté ce type de contenu à la requête via le hook pre_get_post, mon CPT s'affiche, mais je perds le menu, donc je rajoute ensuite nav_menu_item à la requête via pre_get_post et là je récupère aussi le menu..


//===================================================================
//        ajoute  lgmac_media et nav_menu_item 
//        à la requete par défaut pour taxonomy.php
//===================================================================
function lgmac_media_in_main_query($query) {
	if (is_tax( 'genre_mus') )  {
		$query->set( 'post_type', array( 'post', 'page', 'nav_menu_item', 'lgmac_media' ));	
	}
}

add_action('pre_get_posts', 'lgmac_media_in_main_query');


ça me parait bizarre d'avoir à faire cela: si le bon template est exécuté (taxonomy.php), ça veut bien dire que WordPress a déterminé qu'il devait afficher des éléments correspondants à une taxonomie me semble t-il...?
Et le pire c'est que sur un autre site j'avais déjà utilisé ce contexte et ça fonctionnait sans que j'intervienne sur pre_get_post...
Modifié par lionel_css3 (14 Mar 2017 - 22:31)
Alors là les gars, c'est fou ça....

ça fait 2 jours que je galèrais là dessus... et là après avoir écrit ce post, je le relis dans tous les sens en me disant 'ils vont bien comprendre ce que je veux dire.... ?' et là , bing, ça fait déclic.. j'ai vu le problème, c'est dans le code...

Alors, si certains veulent jouer à trouver, je donne pas la solution tout de suite Smiley smile
alors je donne la réponse, si ça peu aider..

en fait c'est le paramètre 'exclude_from_search' avec la valeur 'true', dans la création du custom post type, qui posait problème .

Ce paramètre ne fait pas qu'exclure le CPT de la recherche, mais aussi de la requête implicite d'une page appellée par un permalien... bizarre..
en tout cas c'est en remettant ce paramètre à false que tout est rentré dans l'ordre et que j'ai pu me passer de traficoter la requête via le hook 'pre_get_posts'.

donc ce paramètre exclude_from_search est à utliliser en connaissance de cause et avec une certaine précaution... Smiley smile
Modifié par lionel_css3 (17 Mar 2017 - 18:49)
Meilleure solution