<?php

/***********************************************************************************************************
*  ADMINISTRATION WORDPRESS
*   	ÉCRAN DES PUBLICATIONS (ARTICLES  PAGES CPT)
*	 		Ajout colonne Image En Avant & ID dans le back Office de wordpress pour les Pages & Articles & CPT
*			Ajouter une colonne de date de dernière modification pour les Articles & CPT
*	 		Afficher l'image en avant & ID & Date dernière modification pour les Pages & Articles & CPT dans le back office de wordpress
*	 		On organise les différentes colonnes de l'admin pour les articles & pages:  titre,ID,Catégories ...
*	 		On organise les différentes colonnes de l'admin pour les CPT: Image En Avant ,titre,ID,Catégories ...
*			Rendre la colonne Date de dernière modification triable pour les articles
*			Rendre la colonne Date de dernière modification triable pour les CPT
*	 		Enregistre la colonne taxonomy-slug-catégorie du CPT comme triable
*    		Ajouter des champs d'édition rapide en HTML pour l'Image Mise En Avant
*	 		Filtrer les publications par auteur 
*	 		Filtrer les publications personnalisées par catégories
*	 		Filtrer les publications & Médiathèque par plage de dates
*	 		Filtrer les Articles par status de publication
*	 		Ajout d'options status de publication pour les actions groupés des articles
*			Ajout option Dupliquer Pages & Articles & CPT
*		MÉDIATHÈQUE
*           Filtrer les images de la Médiathèque avec/sans texte ALTERNATIF
*	 		Ajouter des colonnes dans la médiathèque pour l'identifiant du Média & Dimensions (L,H) & Taille & Texte alternatif images
*	 		Enregistre les nouvelles colonnes Média & Dimensions (L,H) comme triable
*	 		Affichage du contenu des colonnes Média: ID & Dimensions (L,H) & Taille & Texte alternatif images
*    		Autoriser l'upload de tous types de format dans la bibliothèque médias
*	 		Définir automatiquement le titre, le texte alternatif et la légende de l'image lors du téléchargement
*				Attribuer des catégories aux médias et les filtrer par catégories
*				Edition en masse des catégories pour les médias
*			Ajouter catégories aux médias, filtrer les médias par catégories, edition en masse des catégories
*   	COMPTES UTILISATEURS
*	 		Ajout d'une colonne pour afficher la date d'enregistrement utilisateur 
*	 		Ajout d'une colonne pour afficher la date de dernière connexion
*	 		Autoriser les contributeurs a télécharger des médias dans la médiathèque
*			Masquer la barre d'administration WordPress pour les utilisateurs non administrateurs
*   	MODIFICATION DE LA PAGE CONNEXION WORDPRESS: LOGO & LIEN & MESSAGE D'ERREUR & SÉLECTEUR DE LANGUE
*	 		Désactiver le sélecteur de langues
*    		Afficher un message d'erreur personnalisé à vos utilisateurs
*    		Désactiver la demande de vérification de l’adresse e-mail administrateur
*	 		Changer l'URL du logo de la page de connexion afin qu'elle pointe vers la page d'accueil du site
*	 		Texte a afficher lors du survol du Logo
*	 		Personnalisation Style Formulaire de connexion
*	  		Logo personnalisé du formulaire de connexion
*	  		Personnalisation formulaire de connexion
*	  		Image de fond Personnalisé pour la page de connexion
*	 		Redirection aprés connexion
*	 		Redirection aprés déconnexion
*   	EMAIL WORDPRESS PAR DÉFAUT
*    		Modification du nom de l'expéditeur et de l'adresse e-mail WordPress Par défaut
*	 		Eviter que les mails de notification WordPress soit considéré comme des spams 
*   	TABLEAU DE BORD
*	 		Ajout dans le widget "d'un coup d'oeil" du tableau de bord du nombre de block réutilisable
*    		Ajout dans le widget "d'un coup d'oeil" du tableau de bord du nombre d'utilisateur
*    		Ajout dans le widget "d'un coup d'oeil" du tableau de bord du nombre pour les différents CPT 
*   	AUTRES PERSONNALISATION DE L'ADMIN WORDPRESS
*	 		Désactiver le sitemap de WordPress par défaut
*	 		Activer Lien Connexion/déconnexion Admin WordPress en Local ou en Ligne
*
*  DÉCLARATION DE MÉTA DE PUBLICATION
*	 	Ajout des Métas de publication dans des colonnes pour les écrans qui listent les publications
*	 	Ajouter des champs d'édition rapide en HTML pour les Métas de publication
*	 	Ajouter des champs d'édition groupé en HTML pour les Métas de publication
*    	Ajouter des metabox a la fin de l'edition des publications
*	  		Ajouter la métabox pour la barre progression de lecture
*	  		Ajout Metabox pour supprimer l'affichage des bloc réutilisables AVANT ET/OU APRÉS le contenu
*
*  CSS DYNAMIQUE POUR PERSONNALISER LES ÉCRANS D'ADMINISTRATION DE WORDPRESS
*		Écran de publication page & articles & CPT: colonne image en avant
*		Style Modification Rapide Articles & Pages & CPT pour l'édition de l'image mise en avant
*   	Suppression Notification Sur La Page De Réglage Du Plugin
*
*  MODIFIER L'AVATAR PAR DEFAUT
*
*************************************************************************************************************/


/***********************************************************************************************
                             ADMINISTRATION WORDPRESS          
***********************************************************************************************/

/*------------  AJOUT ET AFFICHAGE DU CONTENU DE NOUVELLES COLONNES DANS LE BACK OFFICE DE WORDPRESS --------------*/

/*-------------- Ajout colonne Image En Avant & ID dans le back Office de wordpress pour les Pages & Articles & CPT ---------------*/

/* Fonction Ajout de la colonne Image En Avant & ID */ 
function eccp_post_screen_add_columns($columns){
	
	 $columns ['featured_image']  = __( 'Featured Image', 'editor-custom-color-palette' );
	 $columns ['page_post_id']  = __( 'ID', 'editor-custom-color-palette' );
	 
	 return  $columns;
	 
}

if ( $custom_back_office_settings['eccp_settings_activate_post_featured_image_column_checkbox_field'] ==  true ) {
	//Ajout des colonnes & ID pour les articles
	add_filter('manage_posts_columns', 'eccp_post_screen_add_columns');
}

if ( $custom_back_office_settings['eccp_settings_activate_page_featured_image_column_checkbox_field'] ==  true ) {
	//Ajout des colonnes & ID pour les Pages
	add_filter('manage_pages_columns', 'eccp_post_screen_add_columns');
}


/*-------------- Ajouter une colonne de date de dernière modification pour les Articles & CPT ---------------*/

function eccp_add_last_modified_date_column($columns){
	
	$new_columns = array();
	
	// On ajoute la colonne "Mise à jour" aprés
	// la colonne "Date"
    foreach ($columns as $key => $value) {
        $new_columns[$key] = $value;
        if ($key === 'date') {
            $new_columns['date_modified'] = __( 'Updated', 'editor-custom-color-palette' );
        }
    }
	
    return $new_columns;
	 
}

if ( $custom_back_office_settings['eccp_settings_enable_last_modified_date_column_checkbox_field'] ==  true ) {
	add_filter('manage_posts_columns', 'eccp_add_last_modified_date_column');
}

/*-------------- Afficher l'image en avant & ID & Date dernière modification pour les Pages & Articles & CPT dans le back office de wordpress ---------------*/

function eccp_post_screen_value_columns( $column_name, $post_id ) {
   
    switch ( $column_name ) {
					
		// Ajout de l'image mise en avant pour l'article ou page ou CPT seulement si elle existe	
		case 'featured_image':
			if( has_post_thumbnail($post_id) ) {
				echo the_post_thumbnail( 'admin-post-featured-image' );
			}
			break;
			
		// Ajout de la date de dernière modification
		case 'date_modified':
			$post_modified = get_post_field('post_modified', $post_id);
			$formatted_date = date('d/m/Y', strtotime($post_modified));
			echo __( 'Last Modified', 'editor-custom-color-palette' ).'<br>' . $formatted_date .'<br>';
			$formatted_date = date('H\hi', strtotime($post_modified));
			echo __( 'at', 'editor-custom-color-palette' ).' ' . $formatted_date;
			break;

		// Ajout de l'id de publication
		case 'page_post_id':
			echo  $post_id;
			break;
			
    }
	
}


if ( $custom_back_office_settings['eccp_settings_activate_post_featured_image_column_checkbox_field'] || 
     $custom_back_office_settings['eccp_settings_enable_last_modified_date_column_checkbox_field'] ) {
	// Ajout du contenu des colonnes Image En Avant pour les Articles & CPT
	// pour le hook : manage_posts_custom_column on fait appel 
	// a la fonction eccp_post_screen_value_columns avec une priorité 10
	// elle comprend deux arguments: $column_name & $id
	add_action('manage_posts_custom_column', 'eccp_post_screen_value_columns', 10, 2);
}

if ( $custom_back_office_settings['eccp_settings_activate_page_featured_image_column_checkbox_field'] ==  true ) {
	add_action('manage_pages_custom_column', 'eccp_post_screen_value_columns', 10, 2);
}


/*-------------- On organise les différentes colonnes de l'admin pour les articles & pages: Image En Avant,titre,ID,Catégories ... ---------------*/

// array_slice(array , position, longueur, ne pas réordonner les indices)
// si longeur est null ou omis alors on retourne tout les éléments depuis 
// la position offset jusqu'à la fin du tableau.
function organize_post_screen_admin_columns( $columns ) {

	// on affiche 1 élément a partir de la position 0
	// soit la case a cocher 
    $columns = array_slice( $columns, 0, 1, true ) 
	+ array(
	         'featured_image' => __( 'Featured Image', 'editor-custom-color-palette' ), // Ajout de la colonne image en avant en position 1
      ) 
	// on affiche le restant du tableau a partir de la position 1 avec pour commencer le Titre
	+ array_slice( $columns, 1, NULL, true );

    return $columns;
}

if ( $custom_back_office_settings['eccp_settings_activate_post_featured_image_column_checkbox_field'] ==  true ) {
	// on utilise le hook: manage_post_type_posts_columns  
	// post-type est a remplacer par le slug du type de publication personnalisé
	// dans notre cas post pour les articles & page pour les pages
	add_filter('manage_post_posts_columns', 'organize_post_screen_admin_columns');
}

if ( $custom_back_office_settings['eccp_settings_activate_page_featured_image_column_checkbox_field'] ==  true ) {
	add_filter('manage_page_posts_columns', 'organize_post_screen_admin_columns');
}


/*-------------- On organise les différentes colonnes de l'admin pour les CPT: Image En Avant ,titre,ID,Catégories ... ---------------*/

// on récupère les slug des CPT et on
// On organise les différentes colonnes de l'écran des CPT
function eccp_get_custom_post_type() {
	
	/*
	Array(
		[0] => cours-rock4temps
		[1] => tribe_events
	)
	*/
	// On récupère les slugs des CPT sous forme d'un tableau qui est indexé de façon numérique
	$all_slug_cpt = eccp_get_slug_all_custom_post_type(); 
	
	
	/* pour debug 
		echo'<pre>';
		print_r($all_cpt);
		echo'</pre>';
	*/	
					
	// s'il y a des Custom Post Type
	if ( !empty( $all_slug_cpt ) ) {
	
	
		foreach ( $all_slug_cpt as $value) {
					
			// on utilise le hook: manage_post_type_posts_columns  
			// post-type est a remplacer par le slug du type de publication personnalisé
			// dans le cas du site Rock4Temps $value = cours-rock4temps
			add_filter('manage_'.$value.'_posts_columns', 'eccp_organize_admin_columns_cpt');
		
		}
		
	}
	
}

if ( $custom_back_office_settings['eccp_settings_activate_post_featured_image_column_checkbox_field'] ==  true ) {
	// certain CPT sont créées au sein de plugins WordPress comme CPT UI, 
	// on va retarder un peu le processus global, et attendre qu’ils soient tous chargés 
	// pour exécuter notre fonction.
    // Le hook « plugins_Loaded » semble un peu tardif, 
	// on va utiliser le hook « init »
	add_action('admin_init','eccp_get_custom_post_type');
}

// array_slice(array , position, longueur, ne pas réordonner les indices)
// si longeur est null ou omis alors on retourne tout les éléments depuis 
// la position offset jusqu'à la fin du tableau.
function eccp_organize_admin_columns_cpt( $columns ) {
	
	// on supprime les colonnes catégories & étiquettes
	// qui sont pour les articles
	//unset($columns['categories']);
	//unset($columns['tags']);

	// on affiche 1 élément a partir de la position 0
	// soit la case a cocher 
	$columns = array_slice( $columns, 0, 1, true ) 
	
	+ array(
			 'featured_image' => __( 'Featured Image', 'editor-custom-color-palette' ), // Ajout de la colonne image en avant en position 1
		)
	
	// on affiche le restant du tableau a partir de la position 1 avec pour commencer le Titre
	+ array_slice( $columns, 1, NULL, true );
		
    return $columns;
	
}


/*-------------- Rendre la colonne Date de dernière modification triable pour les articles ---------------*/

function eccp_sortable_custom_column_for_post($columns) {
	
    $columns['date_modified'] = 'Updated';
    return $columns;
	
}
add_filter('manage_edit-post_sortable_columns', 'eccp_sortable_custom_column_for_post');


/*-------------- Rendre la colonne Date de dernière modification triable pour les CPT ---------------*/


function eccp_sortable_custom_column_for_CPT($columns) {
	
    $columns['date_modified'] = 'Updated';
    return $columns;
	
}


function eccp_loop_through_CPT() {

	// On récupère les slugs des CPT sous forme d'un tableau qui est indexé de façon numérique
	$all_slug_cpt = eccp_get_slug_all_custom_post_type(); 

	/* pour debug 
	echo'<pre>';
	print_r($all_slug_cpt);
	echo'</pre>';
	*/ 

	// s'il y a des Custom Post Type
	if ( !empty( $all_slug_cpt ) ) {

		foreach ( $all_slug_cpt as $value) {
			// on utilise le hook: manage_edit-post_type_sortable_columns pour un CPT 
			// post_type est a remplacer par le slug du type de publication personnalisé
			// dans le cas du site Rock4Temps $value = cours-rock4temps
			add_filter('manage_edit-'.$value.'_sortable_columns', 'eccp_sortable_custom_column_for_CPT');
		}
		
	}
	
}

// on va retarder un peu le processus global, et attendre que l'admin soit chargés 
// pour exécuter notre fonction qui permet de récupérer les CPT et rendre
// triable la colonne Date de dernière modification
// on va utiliser le hook « init »
add_action('admin_init','eccp_loop_through_CPT');


/*-------------- Enregistre la colonne taxonomy-slug-catégorie du CPT comme triable ---------------*/

function eccp_modified_taxonomy_columns_cpt_sortable($columns) {
	
	// on récupère le type de publication
	$post_type = get_current_screen()->post_type;
	

	/* pour debug 	
	echo'type de publication: '.$post_type.'<br>';
	*/	
	
	
	// Récupération des taxonomies liées au Custom Post Type courant
	// get_object_taxonomies retourne un tableau des taxonomies
	// pour le slug du CPT passé en paramètre
	$taxonomies = get_object_taxonomies( $post_type );
	
	/* pour debug 	
	echo'<pre>';
		echo 'taxonomies: '.'<br>';
		 print_r($taxonomies);
		 echo'<br>';
	echo'</pre>';
	*/
	
	
	// Pour chaque taxonomies $slug_taxonomy nous donne le slug
	// Ajout de l’ID de la colonne taxonomie au tableau des colonnes triables
	foreach( $taxonomies as $slug_taxonomy ){
		
		// on récupère un objet de taxonomie pour le slug: $slug_taxonomy donné en paramètre
		$taxonomy_object = get_taxonomy( $slug_taxonomy );
		
		
		/* pour debug 
		echo'<pre>';
			print_r($taxonomy_object);
			echo'<br>';
		echo'</pre>';
		*/
		
		// Ajout de l’ID de la colonne taxonomie au tableau des colonnes triables
		// ID = taxonomy-slug-taxonomy
		// $taxonomy_object->label donne le nom de la Taxonomie 
		// qui est l'en tête de la colonne taxonomie
		$columns[ 'taxonomy-'.$slug_taxonomy ] = $taxonomy_object->label ;
		
		
	}
	
	
	return $columns;
	
}

// On boucle sur tous les CPT pour rendre la colonne Taxonomie
// triable excepté pour le plugin The Events Calendar
function eccp_loop_through_custom_post_type() {
	
	/*
	Array(
		[0] => cours-rock4temps
		[1] => tribe_events
	)
	*/
	// On récupère les slugs des CPT sous forme d'un tableau qui est indexé de façon numérique
	$all_slug_cpt = eccp_get_slug_all_custom_post_type(); 
	
	
	/* pour debug  
		echo'<pre>';
		print_r($all_slug_cpt);
		echo'</pre>';
	*/
	
					
	// s'il y a des Custom Post Type
	if ( !empty( $all_slug_cpt ) ) {
	
		
		foreach ( $all_slug_cpt as $value) {
			
			// la colonne Taxonomie est déja rendu triable par le plugin
			// The Events Calendar
			if ( $value !== 'tribe_event' ) {
					
				// on utilise le hook: manage_edit-post_type_sortable_columns pour un CPT 
				// post_type est a remplacer par le slug du type de publication personnalisé
				// dans le cas du site Rock4Temps $value = cours-rock4temps
				add_filter('manage_edit-'.$value.'_sortable_columns', 'eccp_modified_taxonomy_columns_cpt_sortable');
		
			}
		
		}
		
	}
	
}


// Puisque certaines taxonomies personnalisées sont créées au sein de plugins WordPress comme CPT UI, 
// on va retarder un peu le processus global, et attendre qu’ils soient tous chargés 
// pour exécuter notre fonction.
// Le hook « plugins_Loaded » semble un peu tardif, 
// on va utiliser le hook « init »
add_action('admin_init','eccp_loop_through_custom_post_type');




/******** Ajouter des champs d'édition rapide en HTML pour l'Image Mise En Avant ***************************/

/*
On utilise le hook: quick_edit_custom_box
On regroupe le champ input qui contient l'image en avant dans une balise <fieldset>
avec la structure ci-dessous.
Les classes inline-edit-col-left,inline-edit-col,title sont native a WordPress
la classe upload-img & remove-img sont utilisé par le script Jquery pour respectivement:
- le bouton: sélectionner image
- le lien situé en dessous image pour la suppression image
Lorsque l'image est supprimée le bouton sélectionner image apparait & vice versa
Nécessite le script Jquery :eccp-upload-featured-image.js pour fonctionner
ce script est dans le dossier JS du plugin
Les champs HTML sont ajouté uniquement si on a activé une colonne featured_image
pour les écrans de publication article ou page ou CPT
*/
add_action( 'quick_edit_custom_box',  'eccp_featured_image_quick_edit', 10, 2 );
function eccp_featured_image_quick_edit( $column_name, $post_type ) {

	// ajout des champs uniquement si nous avons une colonne d'images en avant
	if( 'featured_image' !== $column_name ){
		return;
	}
	?>
		<fieldset id="featured_image" class="inline-edit-col-left">
			<div class="inline-edit-col">
				<span class="title">Image En Avant</span>
				<div>
					<a href="#" class="button upload-img">Select Image</a>
					<input type="hidden" name="_thumbnail_id" value="" />
				</div>
				<a href="#" class="remove-img">Supprimer Image</a>
			</div>
		</fieldset>
	
	<?php
		
}


/*-------------- Filtrer les publications par auteur ---------------*/

// Ajoute un filtre pour tous les type de publication afin de lister les articles , pages etc..
// selon l'auteur sélectionné

/*
On utilise le hook  restrict_manage_posts
Le bouton Filtrer permet de trier par date et/ou catégorie sur le tableau de la liste des Articles, 
et de trier par date sur le tableau de la liste des Pages.
le hook restrict_manage_posts se déclenche avant le bouton Filtrer

Pour afficher la liste des auteurs on utilise la fonction wp_dropdown_users()
avec un tableau d'argument:
•role__in: Un tableau de noms de rôle. Les utilisateurs correspondants doivent 
avoir au moins un de ces rôles. Tableau vide par défaut.
• name: Attribut de nom de l'élément sélectionné. Par défaut 'user'
• show_option_all: Texte à afficher comme liste déroulante par défaut (tous)
• show: Données utilisateur à afficher. Accepte n'importe quel champ utilisateur
'ID' or 'user_login' etc.. 
chaine vide ou par défaut:display_name c'est alors le nom a afficher publiquement qui est listé 
display_name_with_login: c'est alors le nom a afficher publiquement avec user_login entre parenthèses.
exemple Rock 4 Temps(wpadmin)
• echo: faire écho ou retourner la liste déroulante. 
Accepte 1|true(écho) ou 0|false(retour). Par défaut 1|true
• id (chaîne): Attribut ID de l'élément sélectionné. La valeur par défaut est la valeur de $name.
• selected(int): id de l'option sélectionné. 0 par défaut
*/
if ( $custom_back_office_settings['eccp_settings_activate_author_filter_checkbox_field'] ==  true ) {
	add_action( 'restrict_manage_posts', 'eccp_filter_by_the_author' );
}

function eccp_filter_by_the_author( $post_type ) {
	
	// vous pouvez ajouter une condition pour un type de publication spécifique
	// if( 'my_type' !== $post_type ) {
	// 	return;
	// }
	
	
	// style pour le champ de sélection autheur
	echo '<style>
		select[name="author"]{
			margin: 0 6px 0 0;
		}
	</style>';

	// On récupère l'id de l'auteur sélectionné via les paramètres d'URL et l'attribut author=1 par ex
	$selected = isset( $_GET[ 'author' ] ) && $_GET[ 'author' ] ? $_GET[ 'author' ] : '';
 
	wp_dropdown_users(
		array(
			'role__in' => array( 
				'administrator', 
				'editor', 
				'author',
				'contributor'
			),
			'name' => 'author',
			'show_option_all' => __('All authors','editor-custom-color-palette'),
			'show' => 'display_name', // vide ou par défaut:display_name ==> c'est le nom a afficher publiquement qui est listé 
			'selected' => $selected
		)
	); 
}

/*-------------- Filtrer les publications personnalisées par catégories ---------------*/

// Ajoute un filtre pour tous les type de publication personnalisé afin de lister les 
// taxonomies liées au Custom Post Type courant

/*
On utilise le hook  restrict_manage_posts
Le bouton Filtrer permet de trier par date les CPT, 
le hook restrict_manage_posts se déclenche avant le bouton Filtrer

Pour afficher la liste des catégories on utilise la fonction wp_dropdown_categories()
avec un tableau d'argument:
• show_option_all: Texte à afficher pour afficher toutes les catégories.
• taxonomy: Nom de la taxonomie ou des taxonomies à récupérer. Par défaut 'category'.
• name: nom de l'attribut name de la zone déroulante. Par défaut 'cat'
• oderby: classer les catégories,Par défaut 'id'  mais aussi: name/ slug / count / term_order etc
• value_field (chaîne): Champ de terme qui doit être utilisé pour renseigner l'attribut 'value' des éléments d'option. 
Accepte tout champ de terme valide : 'term_id', 'name', 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', 'parent', 'count'. Default 'term_id'.
• hierarchical (booléen): indique si on prend en compte une taxonomie hiérachisé
• echo: faire écho ou retourner la liste déroulante. 
Accepte 1|true(écho) ou 0|false(retour). Par défaut 1|true
• id (chaîne): Attribut ID de l'élément sélectionné. La valeur par défaut est la valeur de $name.
• show_count: si on compte ou non le nbr de catégorie. Default  'false'
• selected(int): id de l'option sélectionné. 0 par défaut
• hide_if_empty (booléen): créer une zone déroulante même si aucune catégorie n'est trouvée
*/

if ( $custom_back_office_settings['eccp_settings_activate_taxonomy_filter_cpt_checkbox_field'] ==  true ) {
	add_action( 'restrict_manage_posts', 'eccp_cpt_taxonomy_filter' );
}

function eccp_cpt_taxonomy_filter( $post_type ){
	
	/*
	Array(
		[0] => cours-rock4temps
		[1] => tribe_events
	)
	*/
	// On récupère les slugs des CPT sous forme d'un tableau qui est indexé de façon numérique
	$all_cpt = eccp_get_slug_all_custom_post_type(); 
	
	
	/* pour debug 
		echo'<pre>';
		print_r($all_cpt);
		echo'</pre>';
	*/
	
	
	// On filtre $post_type pour être sur que ce soit bien un CPT définit par l'utilisateur 
	// sinon on ne fait rien on sort
	if( !in_array( $post_type, $all_cpt ) )
	{
		return;
	}

	// Récupération des taxonomies liées au Custom Post Type courant
	// get_object_taxonomies retourne un tableau des taxonomies
	// pour le slug du CPT passé en paramètre
	$taxonomies = get_object_taxonomies( $post_type );
	
	/* pour debug 	
	echo'<pre>';
		print_r($taxonomies);
	echo'</pre>';
	*/
	
	
	// Pour chaque taxonomies $slug_taxonomy nous donne le slug
	// on affiche une zone déroulante avec la liste des catégories
	// il persiste un problème dans le cas du plugin The Events Calendar
	// pour le slug post_tag des étiquettes
	// en effet s'il n'ya pas d'étiquette une zone déroulente étroite vide
	// est affichée pour sélectionner les étiquettes
	foreach( $taxonomies as $slug_taxonomy ){
		
		
		// on récupère un objet de taxonomie pour le slug: $slug_taxonomy donné en paramètre
		$taxonomy_object = get_taxonomy( $slug_taxonomy );
		
		
		//$taxonomy_object->labels->all_items
		// nous donne: Tous les + le nom de la catégorie
		// soit par ex: Tous les Catégories cours Rock 4 Temps
		
		/* pour debug 
		echo'<pre>';
		print_r($taxonomy_object);
		echo'</pre>';
		*/
		
		// soit par exemple $slug_taxonomy = categories_cours
		// alors l'attribut name de la zone déroulante vaut ==> name = categories_cours
		// lorsqu'on clique sur une option de la zone déroulante,on récupère l'id de la taxonomie sélectionné 
		// alors via les paramètres d'URL on passe en paramètre de requête 
		// valeur attribut name = slug taxonomie
		// soit par exemple categories_cours = debutant (debutant étant le slug d'une option de la zone déroulante)
		$selected = isset( $_GET[ $slug_taxonomy ] ) ? $_GET[ $slug_taxonomy ] : '';
		
		wp_dropdown_categories( 
			array(
				'show_option_all' =>  $taxonomy_object->labels->all_items,
				'taxonomy'        =>  $slug_taxonomy,
				'name'            =>  $slug_taxonomy,
				'orderby'         =>  'name', //  name: nom de la taxonomie ,on peut aussi utiliser: slug / count / term_order etc
				'value_field'     =>  'slug',
				'show_count'      => true,
				'selected'        =>  $selected,
				'hierarchical'    =>  true,
				'hide_if_empty'   =>  false,
			)
		);
		
		// style pour la colonne de la taxonomie du CPT
		echo '<style id="taxonomy-column-cpt" type="text/css">';
			echo 'th#taxonomy-'.$slug_taxonomy.'{width:140px;}';
		echo '</style>';
		
	}
	
	
}


/*-------------- Filtrer les publications & Médiathèque par plage de dates ---------------*/

// Ajoute un filtre pour tous les articles &  types de publication personnalisé 
// afin de lister les publications par plage de dates
// fait de même pour la médiathèque seulement en vue liste

/* 
Les crochets dont nous a besoin:
• admin_enqueue_scripts
• restrict_manage_posts
• pre_get_posts

admin_enqueue_scripts nous sert à inclure le script jquery-ui-datepicker 
car la bibliothèque est déjà enregistrée par Wordpress, 
il ne nous reste plus qu'a l'inclure dans la zone d'administration.
restrict_manage_posts pour créer le champ de filtrage. 
pre_get_posts nous sert à filtrer les messages, 

fichiers Jquery: https://jqueryui.com/themeroller/  
dans l'onglet gallery télécharger le thème smoothness
et ne garder que le fichier de style jquery-ui.min.css
pour mettre en file d'attente la feuille de style css 
a partir du dossier css de l'extension.
version actuelle 1.13.2 pour Jquery 1.8+

*/


add_action( 'admin_enqueue_scripts', 'eccp_jqueryui' );

/*
 * Ajout de jQuery UI CSS et le script datepicker
 * Tout le reste est déjà inclus dans /wp-admin/ comme jquery, jquery-ui-core etc
 */
function eccp_jqueryui(){
		
		// Charger jQuery UI Datepicker 
		//(bibliothèque déjà enregistrée par Wordpress, rien d'autre n'est nécessaire)
		wp_enqueue_script( 'jquery-ui-datepicker' );
		
		// le tableau array() indique les dépendances autrement dit indiquer à 
		// WordPress que notre style devrait absolument être chargé après les styles indiqués en dépendances 
		// le numéro de version est important car il va permettre d’invalider le cache du navigateur 
		// lorsqu'on fera évoluer le style.
		// par défaut le dernier paramètre est à false et le style est chargé dans le head
		/*
		wp_enqueue_style( 
			'jquery-ui-style', 
			EDITOR_CUSTOM_COLOR_PALETTE_URL.'css/jquery-ui.min.css', 
			array( 'jquery-ui-core', 'jquery-ui-datepicker' ), 
			ECCP_PLUGIN_VERSION 
		);
		*/
		
		// Enregistrez la feuille de style en ligne pour le Date Picker
		wp_enqueue_style( 'jquery-ui', '//code.jquery.com/ui/1.13.2/themes/smoothness/jquery-ui.min.css' );
		
}


add_action( 'restrict_manage_posts', 'eccp_date_publication_form' );

/*
 * fonction pour afficher 
 * Deux champs de saisie pour les dates avec régles CSS & script JS
 */
function eccp_date_publication_form($post_type){
	
	// on récupère les paramètres de réglages de l'extension
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	
	global $pagenow;
	
	// déclaration d'un tableau pour les écrans admin autorisés
	$publish_screen_allowed = array();
	
	
	// si on a activé l'option filtre par plage de date
	// pour les articles & CPT & la médiathèque
	// alors l'écran admin qui liste ces publications est edit.php
	// pour la médiathèque c'est upload.php
	if($custom_back_office_settings['eccp_settings_enable_post_cpt_date_range_filter_checkbox_field']
	   && $custom_back_office_settings['eccp_settings_enable_filter_dates_range_media_library_checkbox_field']){
	
		$publish_screen_allowed = array('edit.php','upload.php');
	
	// sinon si on a activé l'option filtre par plage de date
	// pour les articles & CPT
	}else if($custom_back_office_settings['eccp_settings_enable_post_cpt_date_range_filter_checkbox_field']){
		$publish_screen_allowed = array('edit.php');
	}else if($custom_back_office_settings['eccp_settings_enable_filter_dates_range_media_library_checkbox_field']){
		$publish_screen_allowed = array('upload.php');
	}
	
	// Si la publication en cours est une page
	// ou si l'écran admin en cours ne fait pas partie des écrans autorisé 
	// ou si le tableau qui gère les écrans admin autorisé est vide
	// alors on n'active pas de filtre par plage de date, on sort
	if( $post_type == 'page' || !in_array($pagenow,$publish_screen_allowed) 
		 || empty($publish_screen_allowed)  ) {
	 	return;
	}
		
	// récupération de la plage de date
	$from = ( isset( $_GET['eccpDateFrom'] ) && $_GET['eccpDateFrom'] ) ? $_GET['eccpDateFrom'] : '';
	$to = ( isset( $_GET['eccpDateTo'] ) && $_GET['eccpDateTo'] ) ? $_GET['eccpDateTo'] : '';
	
	// style pour les champs de date
	echo '<style>
		input[name="eccpDateFrom"], input[name="eccpDateTo"]{
			line-height: 28px;
			height: 28px;
			margin: 0 6px 0 0;
			width:125px;
		}
	</style>';
	
	
	// affichage des champs de date
	echo'<input type="text" name="eccpDateFrom" placeholder="'.esc_html__('Date From','editor-custom-color-palette').'" value="' . esc_attr( $from ) . '" />';
	echo'<input type="text" name="eccpDateTo" placeholder="'.esc_html__('Date To','editor-custom-color-palette').'" value="' . esc_attr( $to ) . '" />';


	// scrit JS pour les champs de date
	echo'<script>
	
		jQuery( function($) {
			
			var from = $(\'input[name="eccpDateFrom"]\'),
				to = $(\'input[name="eccpDateTo"]\');

			$( \'input[name="eccpDateFrom"], input[name="eccpDateTo"]\' ).datepicker( {dateFormat : "dd-mm-yy"} );
			// Par défaut, les dates ressemblent à ceci " 3 Avril, 2023"
			// datepicker({dateFormat : "dd-mm-yy"}) permet d\'établir le format 03-04-2023 ;
	
			// la partie restante du script empêche de choisir un intervalle de date incorrect
			from.on( \'change\', function() {
				to.datepicker( \'option\', \'minDate\', from.val() );
			});
				
			to.on( \'change\', function() {
				from.datepicker( \'option\', \'maxDate\', to.val() );
			});
			
		});
	
	</script>';
		
}


add_action( 'pre_get_posts', 'eccp_date_publication_query_filter' );

/*
 * La fonction principale qui filtre réellement les messages
 * 
 */
function eccp_date_publication_query_filter( $admin_query ){
	
	// on récupère les paramètres de réglages de l'extension
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	
	// on récupère le type de publication par les paramètres d'URL
	// pour une page en admin: wp-admin/edit.php?post_type=page
	$post_type = (isset($_GET['post_type'])) ? $_GET['post_type'] : '';
	
	global $pagenow;
	
	// déclaration d'un tableau pour les écrans admin autorisés
	$publish_screen_allowed = array();
	
	// si on a activé l'option filtre par plage de date
	// pour les articles & CPT & la médiathèque
	// alors l'écran admin qui liste ces publications est edit.php
	// pour la médiathèque c'est upload.php
	if($custom_back_office_settings['eccp_settings_enable_post_cpt_date_range_filter_checkbox_field']
	   && $custom_back_office_settings['eccp_settings_enable_filter_dates_range_media_library_checkbox_field']){
	
		$publish_screen_allowed = array('edit.php','upload.php');
	
	// sinon si on a activé l'option filtre par plage de date
	// pour les articles & CPT
	}else if($custom_back_office_settings['eccp_settings_enable_post_cpt_date_range_filter_checkbox_field']){
		$publish_screen_allowed = array('edit.php');
	}else if($custom_back_office_settings['eccp_settings_enable_filter_dates_range_media_library_checkbox_field']){
		$publish_screen_allowed = array('upload.php');
	}
	
	// Si la publication en cours est une page
	// ou si l'écran admin en cours ne fait pas partie des écrans autorisé 
	// ou si le tableau qui gère les écrans admin autorisé est vide
	// alors on n'établit pas la requête par plage de date, on sort
	if( $post_type == 'page' || !in_array($pagenow,$publish_screen_allowed) 
		 || empty($publish_screen_allowed)  ) {
	 	return;
	}
	
	
	if (
		is_admin()
		&& $admin_query->is_main_query()
		&& in_array( $pagenow, $publish_screen_allowed )
		&& ( ! empty( $_GET['eccpDateFrom'] ) || ! empty( $_GET['eccpDateTo'] ) )
	) {
		// on établit la requête
		$admin_query->set(
			'date_query', 
			array(
				// la date est converti par strtotime() pour établir le requête donc devient dd-mm-yy 00:00:00
				'after' => sanitize_text_field( $_GET['eccpDateFrom'] ),
				 // on ajoute 23:59:59 avant la conversion par strtotime()   
				 // pour être sur d'avoir la journée entière prise en compte
				'before' => sanitize_text_field( $_GET['eccpDateTo'] )? sanitize_text_field($_GET['eccpDateTo'] . ' 23:59:59') : '',
				'inclusive' => true, // inclure également les jours sélectionnés
				'column'    => 'post_date' // 'post_modified', 'post_date_gmt', 'post_modified_gmt'
			)
		);
		
	}
	
	return $admin_query;

}


/*-------------- Filtrer les Articles par status de publication ---------------*/

/* 
Les crochets dont nous a besoin:
• restrict_manage_posts
• pre_get_posts

restrict_manage_posts pour créer le champ de filtrage. 
pre_get_posts nous sert à filtrer les messages, 
*/

add_action( 'restrict_manage_posts', 'eccp_publication_status_form' );

/*
 * fonction pour afficher un champ select
 *
 */
function eccp_publication_status_form($post_type){
	
	// on récupère les paramètres de réglages de l'extension
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	
	global $pagenow;
	
	// déclaration d'un tableau pour les écrans admin autorisés
	$publish_screen_allowed = array();
	
	// si on a activé l'option filtre par satuts de publication pour les articles
	// alors l'écran admin qui liste les aticles est edit.php
	if($custom_back_office_settings['eccp_settings_enable_post_filter_publication_status_checkbox_field']){
		$publish_screen_allowed = array('edit.php');
	}
	
	// Si la publication en cours n'est pas un article
	// ou si l'écran admin en cours ne fait pas partie des écrans autorisé 
	// ou si le tableau qui gère les écrans admin autorisé est vide
	// alors on n'active pas de filtre par statuts de publication
	if( 'post' !== $post_type || !in_array($pagenow,$publish_screen_allowed) 
		 || empty($publish_screen_allowed)  ) {
	 	return;
	}
	
	
	// on récupère par l'URL le statut de publication sélectionné dans la zone déroulante du filtre de publication
	$current_status = ( isset( $_GET['eccp_status'] ) && $_GET['eccp_status'] ) ? $_GET['eccp_status'] : '';
	
	// get_post_statuses() renvoi tous les status actuellement enregistrés pour le site Web. 
	$statuses = get_post_statuses();
	
	?>

		<select name="eccp_status">
		
			<option value=""><?= esc_html__('All statuses', 'editor-custom-color-palette'); ?></option>

			<?php

			// On ajoute les status en tant qu'options à un champ de sélection.
			foreach ($statuses as $key => $status) {
				printf(
					'<option value="%s"%s>%s</option>',
					$key,
					$key == $current_status ? 'selected="selected"' : '',
					$status
				);
			}
			
			?>
			
		</select>

	<?php
	
}


add_action( 'pre_get_posts', 'eccp_status_publication_query_filter' );

/*
 * La fonction principale qui filtre réellement les status
 * 
 */
function eccp_status_publication_query_filter( $admin_query ){
	
	// on récupère les paramètres de réglages de l'extension
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	
	// on récupère le type de publication par les paramètres d'URL
	// pour un article en admin: wp-admin/edit.php?post_type=post
	$post_type = (isset($_GET['post_type'])) ? $_GET['post_type'] : '';
	
	global $pagenow;
	
	// déclaration d'un tableau pour les écrans admin autorisés
	$publish_screen_allowed = array();
	
	// si on a activé l'option filtre par satuts de publication pour les articles
	// alors l'écran admin qui liste les aticles est edit.php
	if($custom_back_office_settings['eccp_settings_enable_post_filter_publication_status_checkbox_field']){
		$publish_screen_allowed = array('edit.php');
	}
	
	// Si la publication en cours n'est pas un article
	// ou si l'écran admin en cours ne fait pas partie des écrans autorisé 
	// ou si le tableau qui gère les écrans admin autorisé est vide
	// alors on ne modifie pas la requête statuts de publication
	if( 'post' !== $post_type || !in_array($pagenow,$publish_screen_allowed) 
		 || empty($publish_screen_allowed)  ) {
	 	return;
	}
	
	
	if (
		is_admin()
		&& $admin_query->is_main_query()
		&& $pagenow == 'edit.php'
		&& ( isset( $_GET['eccp_status'] ) && !empty( $_GET['eccp_status'] ) )
	) {
		// on établit la requête
		$admin_query->set('post_status', $_GET['eccp_status'] );
	}
	
	return $admin_query;

}


/*-------------- Ajout d'options status de publication pour les actions groupés des articles  ---------------*/



if($custom_back_office_settings['eccp_settings_activate_publication_status_bulk_actions_posts_checkbox_field'] ) {
	add_filter( 'bulk_actions-edit-post', 'eccp_bulk_actions_posts' );
}


/*
bulk_actions-{screen id}– permet de supprimer les options d'action groupée par défaut 
et d'ajouter des options personnalisée dans la liste déroulante
via le tableau associatif: $bulk_actions.
screen id peut être vu sur chaque page d'administration WordPress 
en utilisant get_current_screen()
*/
function eccp_bulk_actions_posts( $bulk_actions ) {

	$bulk_actions[ 'eccp_make_draft' ] = __( 'Make draft' , 'editor-custom-color-palette' );
	$bulk_actions[ 'eccp_make_pending' ] = __( 'Make pending' , 'editor-custom-color-palette' );
	$bulk_actions[ 'eccp_make_private' ] = __( 'Make private' , 'editor-custom-color-palette' );
	$bulk_actions[ 'eccp_make_publish' ] = __( 'Make publish' , 'editor-custom-color-palette' );

	return $bulk_actions;

}



if($custom_back_office_settings['eccp_settings_activate_publication_status_bulk_actions_posts_checkbox_field'] ) {
	add_filter( 'handle_bulk_actions-edit-post', 'eccp_bulk_action_handler_posts', 10, 3 );
}

/*
Afin de déclencher quelque chose lors du choix de nos options nouvellement ajoutées 
dans la liste déroulante, on utilise le hook de filtre handle_bulk_actions-{screen id}
• $redirect_url:  URL vers laquelle WordPress doit rediriger après avoir terminé 
notre action groupée
• $action:  le nom de l'action qui a été choisie dans la liste déroulante
• $post_ids: tableau de tous les ID d'articles qui ont été sélectionnés pour l'action en bloc. 

*/
function eccp_bulk_action_handler_posts( $redirect_url, $action, $post_ids ) {

	// supprimons d'abord les arguments de requête
	$redirect_url = remove_query_arg(
		array( 'eccp_make_draft','eccp_make_pending', 'eccp_make_private','eccp_make_publish' ),
		$redirect_url
	);
	
	
	// Rappel des options personnalisés ajouter a la liste des actions groupées
	$options_actions[ 'eccp_make_draft' ] = 'draft';
	$options_actions[ 'eccp_make_pending' ] = 'pending';
	$options_actions[ 'eccp_make_private' ] = 'private';
	$options_actions[ 'eccp_make_publish' ] = 'publish';

	
	foreach ( $options_actions as $key => $value ) {
		
		// faire quelque chose pour l'action groupée $action
		// si $key === $action
		if ( $key === $action ) {
			
			// on met a jour le statut des articles sélectionnés
			foreach ( $post_ids as $post_id ) {
				wp_update_post(
					array(
						'ID' => $post_id,
						'post_status' => $value
					)
				);
			}

			// Nous ajoutons un argument personnalisé à l'URL de redirection fournie. 
			// Ceci est facultatif mais nécessaire si nous voulons afficher un avis d'administration
			$redirect_url = add_query_arg(
				$key, 
				count( $post_ids ), 
				$redirect_url
			);
			
		
		}	
		
	}
	

	/* 
	exemple ancien code
	faire quelque chose pour l'action groupée "Statut brouillon"
	if ( 'eccp_make_draft' === $action ) {

		foreach ( $post_ids as $post_id ) {
			wp_update_post(
				array(
					'ID' => $post_id,
					'post_status' => 'draft' 
				)
			);
		}

		// Nous ajoutons un argument personnalisé à l'URL de redirection fournie. 
		// Ceci est facultatif mais nécessaire si nous voulons afficher un avis d'administration
		$redirect_url = add_query_arg(
			'bulk_make_draft', 
			count( $post_ids ), 
			$redirect_url
		);

	}
	*/
	

	return $redirect_url;

}



if($custom_back_office_settings['eccp_settings_activate_publication_status_bulk_actions_posts_checkbox_field'] ) {
	add_action( 'admin_notices', 'eccp_bulk_action_notices_posts' );
}

// Afficher message de mise à jour du status des articles sélectionnés
function eccp_bulk_action_notices_posts() {
	
	if( !empty( $_REQUEST[ 'bulk_make_publish' ] ) ||
		! empty( $_REQUEST[ 'bulk_make_draft' ] ) || 
		! empty( $_REQUEST[ 'bulk_make_private' ] ) ) {
		?>
			<div class="updated notice is-dismissible">
				<p><?php echo esc_html__( 'Status posts updated' , 'editor-custom-color-palette' )?> </p>
			</div>
		<?php
	}

}

/*-------------- Ajout option Dupliquer Pages & Articles & CPT ---------------*/


/**
 * Crédits du code : rudrastyh.com
 * url: https://rudrastyh.com/wordpress/duplicate-post.html
 */

if ($custom_back_office_settings['eccp_settings_enable_action_link_for_Duplicate_post_checkbox_field']) {

	// Ajouter un lien Dupliquer à la liste d'actions via le hook post_row_actions
	// Pour les Articles & CPT
	add_filter( 'post_row_actions', 'eccp_duplicate_post_link', 10, 2 );

	// Ajouter un lien Dupliquer à la liste d'actions via le hook post_row_actions
	// Pour les Pages
	add_filter( 'page_row_actions', 'eccp_duplicate_post_link', 10, 2 );


	function eccp_duplicate_post_link( $actions, $post ) {

		if( ! current_user_can( 'edit_posts' ) ) {
			return $actions;
		}

		$url = wp_nonce_url(
			add_query_arg(
				array(
					'action' => 'eccp_duplicate_post_as_draft',
					'post' => $post->ID,
				),
				'admin.php'
			),
			basename(__FILE__),
			'duplicate_nonce'
		);

		$actions[ 'duplicate' ] = '<a href="' . $url . '" title="'.esc_html__('clone post', 'editor-custom-color-palette').'" rel="permalink">'.esc_html__('Duplicate', 'editor-custom-color-palette').'</a>';

		return $actions;
	}


	/*
	 * La fonction duplique la publication en tant que brouillon et redirige ensuite 
	 * vers l'écran de modification de publication.
	 */
	add_action( 'admin_action_eccp_duplicate_post_as_draft', 'eccp_duplicate_post_as_draft' );

	function eccp_duplicate_post_as_draft(){

		// On vérifie si l'ID de la publication a bien été transmis 
		// lorqu'on a cliqué sur le lien d'action: Dupliquer
		if ( empty( $_GET[ 'post' ] ) ) {
			$error_msg = __('No post to duplicate has been provided!', 'editor-custom-color-palette');
			wp_die( $error_msg );
		}

		// vérification Nonce 
		if ( ! isset( $_GET[ 'duplicate_nonce' ] ) || ! wp_verify_nonce( $_GET[ 'duplicate_nonce' ], basename( __FILE__ ) ) ) {
			return;
		}

		// On récupère L'ID de la publication d'origine
		$post_id = absint( $_GET[ 'post' ] );

		// On récupère le contenude la publication d'origine
		$post = get_post( $post_id );

		/*
		 * si vous souhaitez que l'utilisateur actuel soit le nouvel auteur du message,
		 * remplacez la ligne suivante par ceci: 
		 * $current_user = wp_get_current_user();
		 * $new_post_author = $current_user->ID;
		 */
		$new_post_author = $post->post_author;


		// si les données de publication existent (je suis sûr que c'est le cas, mais juste dans un cas), 
		// créez la copie de la publication
		if ( $post ) {

			// nouveau tableau de données de publication
			$args = array(
				'comment_status' => $post->comment_status,
				'ping_status'    => $post->ping_status,
				'post_author'    => $new_post_author,
				'post_content'   => $post->post_content,
				'post_excerpt'   => $post->post_excerpt,
				'post_name'      => $post->post_name,
				'post_parent'    => $post->post_parent,
				'post_password'  => $post->post_password,
				'post_status'    => 'draft',
				'post_title'     => $post->post_title,
				'post_type'      => $post->post_type,
				'to_ping'        => $post->to_ping,
				'menu_order'     => $post->menu_order
			);

			// insérer la publication par la fonction wp_insert_post()
			$new_post_id = wp_insert_post( $args );

			/*
			 * obtenir tous les termes de publication actuels(Catégories Etiquettes...)
			 * et les définir sur le nouveau brouillon de publication
			 */
			$taxonomies = get_object_taxonomies( get_post_type( $post ) ); // renvoie un tableau de noms de taxonomie pour le type de publication, ex array("category", "post_tag");
			if( $taxonomies ) {
				foreach ( $taxonomies as $taxonomy ) {
					$post_terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'slugs' ) );
					wp_set_object_terms( $new_post_id, $post_terms, $taxonomy, false );
				}
			}

			// dupliquer toutes les méta de la publication(Champs personnalisées)
			$post_meta = get_post_meta( $post_id );
			if( $post_meta ) {

				foreach ( $post_meta as $meta_key => $meta_values ) {

					if( '_wp_old_slug' == $meta_key ) { // ne rien faire pour cette clé mét
						continue;
					}

					foreach ( $meta_values as $meta_value ) {
						add_post_meta( $new_post_id, $meta_key, $meta_value );
					}
				}
			}

			// redirigez vers l'écran d'édition de publication pour le nouveau brouillon
			// wp_safe_redirect(
			// 	add_query_arg(
			// 		array(
			// 			'action' => 'edit',
			// 			'post' => $new_post_id
			// 		),
			// 		admin_url( 'post.php' )
			// 	)
			// );
			// exit;
			wp_safe_redirect(
				add_query_arg(
					array(
						'post_type' => ( 'post' !== get_post_type( $post ) ? get_post_type( $post ) : false ),
						'saved' => 'post_duplication_created' // juste un slug personnalisé ici
					),
					admin_url( 'edit.php' )
				)
			);
			exit;

		} else {
			$error_msg = __('Post creation failed, could not find original post.', 'editor-custom-color-palette');
			wp_die($error_msg);
		}

	}


	/*
	 * Ajout de notification d'administrateur
	 */
	add_action( 'admin_notices', 'eccp_duplication_admin_notice' );

	function eccp_duplication_admin_notice() {

		// Obtenir l'écran actuel
		$screen = get_current_screen();

		if ( 'edit' !== $screen->base ) {
			return;
		}

		// Vérifie si les paramètres sont mis à jour
		if ( isset( $_GET[ 'saved' ] ) && 'post_duplication_created' == $_GET[ 'saved' ] ) {

			 echo '<div class="notice notice-success is-dismissible"><p>' . esc_html__('Post copy created', 'editor-custom-color-palette') . '</p></div>';
			 
		}
		
	}
	
}	


/*-------------- Filtrer les images de la Médiathèque avec/sans texte ALTERNATIF ---------------*/

/** 
 * SOURCE: https://wp-tutorials.tech/refine-wordpress/filter-for-images-missing-alt-text/
 */

/* 
Les hooks dont nous avons besoin:
• restrict_manage_posts:
 WordPress déclenche cette action lors du rendu de la barre d'outils des options de filtre, 
 juste avant le bouton « Filtrer ».
• pre_get_posts :
permet de modifier n'importe quelle requête qui récupère des publications/pages/images/etc. 

*/

// nom du champ select pour le filtre images avec/sans texte ALT
const ECCP_FIELD_NAME = 'filter_img_alt';

// déclaration des types mime acceptés pour Filtrer les images avec/sans texte ALT
const ECCP_IMAGE_MIME_TYPES = array('image/jpeg', 'image/gif', 'image/png', 'image/bmp', 'image/tiff', 'image/x-icon', 'image/webp','image/avif');

// fonction qui retourne true si on est sur la page de la médiathèque 
function eccp_is_on_media_admin_page() {
   
   $is_on_media_library = false;
   
   /*if (!function_exists('get_current_screen')) {
      require_once ABSPATH . '/wp-admin/includes/screen.php';
   }

   if (is_admin() && !empty($screen = get_current_screen())) {
      $is_on_media_library = ($screen->base == 'upload');
   }*/
	
   global $pagenow;
	
   if (is_admin() && ($pagenow == 'upload.php')) {
      $is_on_media_library = true;
   }

   return $is_on_media_library;
}

// renvoi un tableau associatif 
// options pour le champ select qui permet de Filtrer les images avec/sans texte ALT
function eccp_get_filter_options() {
	
   return array(
      'no-filter' => __('-- IMG ALT Text --','editor-custom-color-palette'),
      'only-with-alt' => __('Images with ALT','editor-custom-color-palette'), 
      'only-without-alt' => __('Images missing ALT','editor-custom-color-palette'), 
   );
   
}

// Le fonctionnement du filtrage de la bibliothèque multimédia repose sur les arguments de requête GET standard
// voici un exemple de requête GET
// /upload.php?mode=list&attachment-filter=post_mime_type%3Aimage&&filter_img_alt=only-with-alt
// (%3A est la valeur codée en URL pour un caractère deux-points)
// Vérifie le $_GET tableau pour voir si notre option de filtre est là. 
// Renvoie soit l'option de filtre sélectionnée (si elle est valide), soit 'no-filter'.
function eccp_get_filter_from_query_args() {
   
   $selected_filter_option = null;
   $valid_filter_options = eccp_get_filter_options();

	
   if (array_key_exists(ECCP_FIELD_NAME, $_GET)) {
      $selected_filter_option = sanitize_text_field($_GET[ECCP_FIELD_NAME]);
   }

   if (empty($selected_filter_option) || !array_key_exists($selected_filter_option, $valid_filter_options)) {
      $selected_filter_option = 'no-filter';
   }

   return $selected_filter_option;
}


/* ------Création du filtre personnalisé ------*/

/**
 Si on est sur la page de la médiathèque en vue liste, 
 on ajoute une liste déroulante à la barre de filtre 
 avec nos options de filtre IMG ALT
 */
function eccp_render_drop_down_filter_options() {
   
	 // Si on est sur la page de la Médiathèque
	if (eccp_is_on_media_admin_page()) {
	 
		printf('<select name="%s">', esc_attr(ECCP_FIELD_NAME));

		// options pour le champ select
		$valid_filter_options = eccp_get_filter_options();
		
		// valeur de l'option de filtre sélectionnée
		$selected_filter_option = eccp_get_filter_from_query_args();
		
		  
		foreach ($valid_filter_options as $value => $label) {
			 
			$status = '';

			// si la valeur de l'option sélectionnée
			// correspond a la valeur de l'option en cours
			// on met a jour la variable $status
			if ($selected_filter_option == $value) {
				$status = 'selected';
			}

			// on initialise les options du champ select
			printf(
				'<option value="%s" %s>%s</option>',
				esc_attr($value),
				$status,
				esc_html($label)
			);
		  
		}

		echo '</select>';
	  
	}
   
}

if($custom_back_office_settings['eccp_settings_enable_filter_alt_text_media_library_checkbox_field']) {
	add_action('restrict_manage_posts', 'eccp_render_drop_down_filter_options');
}

/**
 * ON ÉTABLI LA REQUÊTE SELON LA SÉLECTION DE NÔTRE FILTRE
 * il faut être prudent ici, cette fonction s'exécute pour chaque page WordPress.
 * on souhaite exécuter la requête uniquement si on est sur la page média et que le
 * La requête en cours d'exécution est la requête principale, 
 * c'est-à-dire la requête qui renvoie tous les pièces jointes multimédias.
 */
function eccp_pre_get_posts_alt_text($admin_query) {
	
	if (
	    //si on est sur la page multimédia en back office
		is_admin() && eccp_is_on_media_admin_page()
		// on est sur la requête principale
		&& $admin_query->is_main_query()
		// l'utilisateur a choisi une option de filtre IMG ALT Text
		&& !empty($selected_filter_option = eccp_get_filter_from_query_args())
		// l'utilisateur a sélectionné une option de filtrage <> 'no-filter'
		&& ($selected_filter_option !== 'no-filter') ) {
	   
		$img_alt_meta_query = null;

		// on initialise les arguments pour la requête selon la sélection de notre filtre
		if ($selected_filter_option == 'only-with-alt') {
			
			$img_alt_meta_query = array(
				'key' => '_wp_attachment_image_alt',
				'compare' => 'EXISTS',
			);
			 
		} elseif ($selected_filter_option == 'only-without-alt') {
			
			$img_alt_meta_query = array(
				'key' => '_wp_attachment_image_alt',
				'compare' => 'NOT EXISTS',
			);
			 
		} else {
			 // ...
		}

		if (!empty($img_alt_meta_query)) {
			
			$meta_query = $admin_query->get('meta_query');

			if (!is_array($meta_query)) {
				$meta_query = array(
				   'relation' => 'AND',
				);
			}

			$meta_query[] = $img_alt_meta_query;

			// On définit la propriété meta_query de la requête principale
			// selon notre filtre $meta_query.
			$admin_query->set('meta_query', $meta_query);

			// On inclut uniquement les publications (pièces jointes) contenant une image
			// avec le "post_mime_type" contenu dans notre tableau: ECCP_IMAGE_MIME_TYPES
			$admin_query->set('post_mime_type', ECCP_IMAGE_MIME_TYPES);
			
		}
	}
}

if($custom_back_office_settings['eccp_settings_enable_filter_alt_text_media_library_checkbox_field']) {
	add_action('pre_get_posts', 'eccp_pre_get_posts_alt_text');
}


/*-------------- Ajouter des colonnes dans la médiathèque pour l'identifiant du Média & Dimensions (L,H) & Taille & Texte alternatif images  ---------------*/

// Ajout de colonnes dans la médiathéque : ID & Dimensions (L,H) & Texte alternatif images
function eccp_add_columns_media($columns){
	
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	
	if ( $custom_back_office_settings['eccp_settings_activate_library_id_dimensions_size_file_column_checkbox_field'] ==  true ) {
		$columns ['mediaID']  = __('ID','editor-custom-color-palette');
		$columns ['mediaDimensions']  = __('Dimensions (W,H)', 'editor-custom-color-palette');
		$columns ['fileSize']  = __('File Size','editor-custom-color-palette');
	}
	
	if ( $custom_back_office_settings['eccp_settings_activate_library_images_alt_text_column_checkbox_field'] ) {
		$columns['alt-text-status'] = __('ALT Text','editor-custom-color-palette');
	}
	
	return  $columns;
	
}


	add_filter( 'manage_media_columns', 'eccp_add_columns_media' );


/*-------------- Enregistre les nouvelles colonnes Média & Dimensions (L,H) comme triable ---------------*/

function eccp_modified_column_media_register_sortable( $columns ) {
	
	$columns ['mediaID']  = __('ID','editor-custom-color-palette');
	$columns ['mediaDimensions']  = __('Dimensions (W,H)', 'editor-custom-color-palette');
	$columns ['fileSize']  = __('File Size','editor-custom-color-palette');
			
    return $columns;
}

if ( $custom_back_office_settings['eccp_settings_activate_library_id_dimensions_size_file_column_checkbox_field'] ==  true ) {
	add_filter( 'manage_upload_sortable_columns', 'eccp_modified_column_media_register_sortable' , 10, 1 );
}

/*-------------- Affichage du contenu des colonnes Média: ID & Dimensions (L,H) & Taille & Texte alternatif images ---------------*/

function eccp_value_columns_media( $column_name,$id ) {
   
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
   
	if ( $custom_back_office_settings['eccp_settings_activate_library_id_dimensions_size_file_column_checkbox_field'] ==  true ) {
	
		switch ( $column_name ) {
			
			// On récupère l'id du média
			case 'mediaID':
				echo $id;
				break;
				
			// On récupère les dimensions du média	
			case 'mediaDimensions':
				$meta = wp_get_attachment_metadata($id);
				if(isset($meta['width']))echo $meta['width'].' x '.$meta['height'];
				break;	
				
			// On récupère la taille des fichiers média	
			case 'fileSize':
				$filesize = filesize( get_attached_file($id) );
				$filesize = size_format($filesize, 2);
				echo $filesize;
				break;
		}
	
	}
	
	// s'il y a un texte alternatif on affiche une icône dashicons check
	// ainsi que la valeur du texte alternatif au survol de l'icône
	// sinon on affiche une icône warning
	if ( $custom_back_office_settings['eccp_settings_activate_library_images_alt_text_column_checkbox_field'] ) {

		if ($column_name == 'alt-text-status') {
		
			if (!empty($alt_text = trim(strval(get_post_meta($id, '_wp_attachment_image_alt', true))))) {
				
				printf(
					'<span class="dashicons dashicons-yes-alt" title="%s"></span>',
					esc_attr($alt_text)
				);
				
			} else {
				echo '<span class="dashicons dashicons-warning"></span>';
			}
			
		}
	
	}
	
}

add_action( 'manage_media_custom_column', 'eccp_value_columns_media', 10, 2 );


/*-------------- Autoriser l'upload de tous types de format dans la bibliothèque médias ---------------*/

/* Autoriser l'upload de tous types de format dans les médias 
   https://www.freeformatter.com/mime-types-list.html#mime-types-list */


/*
on ajoute les extensions de fichier à la liste des types MIME autorisés. 
Cela garantit que WordPress reconnaît ces types de fichiers comme 
des téléchargements valides.
*/
if ( $custom_back_office_settings['eccp_settings_activate_mime_types_media_checkbox_field'] ==  true ) {
	add_filter('upload_mimes', 'eccp_myme_types', 1, 1);
}

function eccp_myme_types( $mimes = array() ){
    
	$mimes['svg'] = 'image/svg+xml';
    /*$mimes['mon autre extension'] = 'mon autre Mime Type';*/
	
    return $mimes;
}


// Contrôle de l'import d'un SVG avec le hook wp_check_filetype_and_ext
// c'est ce hook qui autorise réellement l'import du SVG
// https://capitainewp.io/autoriser-svg-webp-wordpress/
// $file: chemin d'accès complet au fichier
// $filename: nom complet du fichier avec l'extension
// $mimes: mimes autorisés
// $types: tableau avec l'extension autorisé (svg) & le type de mime(image/svg+xml)
if ( $custom_back_office_settings['eccp_settings_activate_mime_types_media_checkbox_field'] ==  true ) {
	add_filter( 'wp_check_filetype_and_ext', 'eccp_allow_upload_file_types', 10, 4 );
}
function eccp_allow_upload_file_types( $types, $file, $filename, $mimes ) {
	
	if ( false !== strpos( $filename, '.svg' ) ) {
    	$types['ext'] = 'svg';
   		$types['type'] = 'image/svg+xml';
	}
	
	return $types;
}


/*
 On ajoute le type de fichier svg à la liste 
 des types de fichiers pour le filtre 
 de la médiathèque:
 images,son,vidéos,document etc..
 */
function eccp_display_filter_svg_in_library( $post_mime_types ) {
    
	// Ajout svg a la liste des types de fichiers 
	// pour le filtre de la médiathèque
    $new_types['image/svg+xml'][0] = 'svg';
	
	// On renseigne ici à quelle position notre type personnalisée svg 
	// doit apparaître sachant que l'index du tableau des mime/types
	// commence a 0 notre type SVG apparaitra en 3ème position
	$position = 2;
	
	// array_slice(array , position, longueur, ne pas réordonner les indices)
	// si longueur est null ou omis alors on retourne tout les éléments depuis 
	// la position offset jusqu'à la fin du tableau.
	$post_mime_types = array_slice( $post_mime_types, 0, $position, true ) + $new_types + array_slice( $post_mime_types, $position, null, true );

   return $post_mime_types;
   
}

if ( $custom_back_office_settings['eccp_settings_activate_mime_types_media_checkbox_field'] ==  true ) {
	add_filter( 'post_mime_types', 'eccp_display_filter_svg_in_library' );
}


/*-----Définir automatiquement le titre, le texte alternatif et la légende de l'image lors du téléchargement----*/

// si on a activé la définition du texte alternatif ou de la légende selon le titre de l'image 
if ($custom_back_office_settings['eccp_settings_image_alt_text_by_title_checkbox_field'] ||
    $custom_back_office_settings['eccp_settings_image_caption_according_title_checkbox_field']) {

	// Définir automatiquement le titre, le texte alternatif, la légende et éventuellement 
	// la description de l'image lors du téléchargement
	add_action( 'add_attachment', 'eccp_set_image_meta_on_image_upload' );

}

function eccp_set_image_meta_on_image_upload( $post_ID ) {

	// on récupère les paramètres de réglage du plugin
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );

	// On vérifie si le fichier téléchargé est une image, sinon on ne fait rien
	if ( wp_attachment_is_image( $post_ID ) ) {

			$image_title = get_post( $post_ID )->post_title;

			// assainissement du titre avec une expression singulière: 
			// On supprime les traits d'union,les traits de soulignement et les espaces supplémentaires:
			$image_title = preg_replace( '%\s*[-_\s]+\s*%', ' ',  $image_title );

			// assainissement du titre:  mettre en majuscule la première lettre du titre
			// les autres lettres en minuscules (strtolower : Renvoie une chaîne en minuscules )
			// ucfirst met le 1er caractère en Majuscule, pour les 1ère lettre de chaque mot c'est la fonction ucwords
			$image_title = ucfirst( strtolower( $image_title ) );

			// si on a activé la définition de la légende selon le titre de l'image 
			if ($custom_back_office_settings['eccp_settings_image_caption_according_title_checkbox_field']) {
			
				// Tableau avec la méta de l'image (Titre, Légende, Description) 
				// Note: commentez les lignes post_excerpt/Légende ou post_content/Description si elles ne sont pas nécessaires
				$image_meta = array(
					'ID'        => $post_ID,            // on précise l'image (ID) à mettre à jour
					'post_title'    => $image_title,     // Définir le titre de l'image avec le titre assaini 
					'post_excerpt'  => $image_title,     // Définir la légende de l'image (excerpt) avec le titre assaini
					//'post_content'  => $image_title,     // Définir la description de l'image (content) avec le titre assaini 
				);
				
			}else {
				
				$image_meta = array(
					'ID'        => $post_ID,            // Spécifiez l'image (ID) à mettre à jour
					'post_title'    => $image_title,     // Définir le titre de l'image avec la sanitization du titre 
					//'post_excerpt'  => $image_title,     // Définir la légende de l'image (excerpt) avec la sanitization du titre 
					//'post_content'  => $image_title,     // Définir la description de l'image (content) avec la sanitization du titre 
				);
				
			}

			// Si on a activé la définition du texte alternatif selon le titre assaini de l'image
			if ($custom_back_office_settings['eccp_settings_image_alt_text_by_title_checkbox_field']) {
				// Définit le texte alternatif de l'image
				update_post_meta( $post_ID, '_wp_attachment_image_alt', $image_title );
			}
			
			// Définit la méta de l'image (par exemple, titre, description, légende)
			wp_update_post( $image_meta );

	} 
	
}


/*-----Définir automatiquement le titre, le texte alternatif et la légende de l'image lors du téléchargement----*/

/*************************************************************************************
             Attribuer des catégories aux médias et les filtrer par catégories
*************************************************************************************/

// Création d'une taxonomie personnalisée pour les médias
function eccp_create_photo_categories_taxonomy() {
	
    $labels = array(
        'name' => esc_html__('Catégories', 'editor-custom-color-palette'),
        'singular_name' => esc_html__('Catégorie', 'editor-custom-color-palette'),
        'search_items' => esc_html__('Chercher des catégories de média','editor-custom-color-palette'),
        'all_items' => esc_html__('Toutes les catégories des médias', 'editor-custom-color-palette'),
        'edit_item' => esc_html__('Modifier la catégorie du média', 'editor-custom-color-palette'),
        'update_item' => esc_html__('Mettre à jour la catégorie du média', 'editor-custom-color-palette'),
        'add_new_item' => esc_html__('Ajouter une nouvelle catégorie de média', 'editor-custom-color-palette'),
        'new_item_name' => esc_html__('Nouveau nom de catégorie média', 'editor-custom-color-palette'),
        'menu_name' => esc_html__('Catégories Médias','editor-custom-color-palette'),
		
		/* Pour les categories hiérachisées */
		'parent_item' => esc_html__('Catégorie parente', 'editor-custom-color-palette'),
        'parent_item_colon' => esc_html__('Catégorie parente:', 'editor-custom-color-palette'),
    );

    $args = array(
		// Si 'hierarchical' est défini à true, notre taxonomie se comportera comme une catégorie standard
		// sinon comme une Etiquette
        'hierarchical' => true,
        'labels' => $labels, // tableau d'étiquettes définit ci-dessus
        'show_admin_column' => true,// autoriser la création automatique de colonnes de taxonomie sur la vue liste de la médiathèque
        'query_var' => true,// Définit la clé query_var de la requête pour cette taxonomie. par défaut le slug de la taxonomie sera utilisé.
        'rewrite' => array('slug' => 'photo_category'), // définir le slug de la taxonomie( n'accepte pas le tiret)
		/* Paramètres configurés a true par défaut */
		'show_in_menu'       => true , // afficher la taxonomie dans le menu d'administration, par défaut true
		'show_in_nav_menus'  => true ,// rend cette taxonomie disponible pour sélection dans les menus de navigation, par défaut true
        'show_ui'            => true ,// générer une interface utilisateur par défaut pour gérer cette taxonomie dans l'administration. 
		// par defaut true, important sinon on ne peut editer la catégorie
		'publicly_queryable' => true ,// cela autorise l'affichage de la catégorie en Front-end
		'show_in_rest' => true,// inclus la taxonomie pour l'API Rest permettant ainsi d'être disponible dans l'editeur Gutenberg !important
		
	);

	// ajout de la taxonomie personnalisée pour les médias
    register_taxonomy('photo_category', array('attachment'), $args);
	
}

if($custom_back_office_settings['eccp_settings_add_categories_to_media_checkbox_field']) {
	add_action('init', 'eccp_create_photo_categories_taxonomy', 0);
}

// Ajout zone déroulante pour la vue liste afin 
// 

/*

--- Ajout zone déroulante pour la vue liste afin de filtrer les médias par catégories -------

On utilise le hook  restrict_manage_posts pour afficher la liste des catégories
dans une zone déroulante.
Pour cela la fonction est "hooké" sur restrict_manage_posts qui se déclenche 
avant le bouton Filtrer

Les catégories sont affichées de manière hiérarchique,avec les catégories enfant 
affichées en dessous de la catégorie parente avec une identation des catégories enfant.
 
*/
function eccp_media_taxonomy_filters() {
    
	global $pagenow;

	// Vérifie si on est dans la page de la médiathèque
    if ( $pagenow == 'upload.php' ) {
	
		
        $taxonomies = array( 'photo_category');
		
		/* 	autre façon
			on récupère sous forme de tableau le terme de taxonomie
			pour les média soit Array ( [0] => photo_category )
			$taxonomies = get_object_taxonomies( 'attachment' ); 
		*/
		
		
		/*
			--------  Obtenir tous les termes pour cette taxonomie: 'photo_category' ---------
			
			exemple de retour de la fonction get_terms():
			
			Array ( [0] => WP_Term Object ( 
			[term_id] => 48 [name] => Cours Avancés [slug] => cours-perf [term_group] => 0 [term_taxonomy_id] => 48 [taxonomy] => photo_category [description] => [parent] => 45 [count] => 1 [filter] => raw ) 
			[1] => WP_Term Object ( [term_id] => 46 [name] => Cours Débutants [slug] => cours-debutant [term_group] => 0 [term_taxonomy_id] => 46 [taxonomy] => photo_category [description] => [parent] => 45 [count] => 0 [filter] => raw ) 
			[2] => WP_Term Object ( [term_id] => 47 [name] => Cours Intermédiaire [slug] => cours-inter [term_group] => 0 [term_taxonomy_id] => 47 [taxonomy] => photo_category [description] => [parent] => 45 [count] => 0 [filter] => raw ) 
			[3] => WP_Term Object ( [term_id] => 45 [name] => CPT Rock 4 Temps [slug] => cpt-rock-4-temps [term_group] => 0 [term_taxonomy_id] => 45 [taxonomy] => photo_category [description] => [parent] => 0 [count] => 1 [filter] => raw ) )
			d=1&affected&_ajax_nonce=87a8cf26ee&ps
			
			On voit que la catégorie: Cours Avancés a une catégorie parente par [parent] => 45
			soit la catégorie: CPT Rock 4 Temps qui a donc [parent] => 0 puisque c'est 
			une catégorie parente

			Alors avec une boucle
			foreach ($terms as $term){
				
			}
			On obtiend:
			$term -> term_id  donne l'ID de la catégorie
			$term -> slug  donne le slug de la catégorie
			$term -> parent  donne l'ID de la catégorie parente
			etc..
			
			en argument de requête on peut préciser:
			-  'terms' => 'slug' terme de taxonomie par exemple slug
			-  'fields' => 'ids', pour obtenir tous les id des catégories, ou slug, name etc...
			-  'orderby' => 'name',  Trier par nom
            -  'order' => 'ASC',  Ordre croissant
			-  'child_of' => 45 retourne tous les enfants de la catégorie parente d'ID 45
			-  'parent' => 0 retourne tous les parents
			-  'include_children' => true,  Inclure les sous-catégories
			-  'exclude'   => 45 retourne toutes les catégories excepté l'ID 45
			-  'operator' => 'IN', par défaut ou  'NOT IN', 'AND', 'EXISTS' ,'NOT EXISTS'
			
			'hide_empty' => false pour pouvoir afficher les catégories des médias, 
			pour 'hide_empty' => true  on affiche seulement les catégories des articles
		*/
		$terms = get_terms(array(
                'taxonomy' => 'photo_category',
                'hide_empty' => false,
				'orderby' => 'name',
				'order'  => 'ASC',
        ));
		
		
		/* pour debug
			echo 'terme de taxonomie'.'<br>';
			print_r($terms);
		*/
		
		$global_term_counts = array();
		
		/* 
		------ compter le nbr de média par catégorie ------
			au chargement de la médiathèque le compte est bon mais,
			problème lors du filtrage le nbr de média par catégories est
			le même pour toutes les catégories et correspond au nombre
			pour la dernière catégorie sélectionnée
		$global_term_counts = eccp_get_global_term_counts('photo_category');
		*/
		
        foreach ( $taxonomies as $taxonomy ) {
			
			// On affecte le slug de la catégorie sélectionnée dans la zone déroulante
			$selected = isset( $_GET[$taxonomy] ) ? $_GET[$taxonomy] : 'photo_category';
			
			/*
			La fonction standard wp_dropdown_categories() fonctionne pour filtrer
			les médias par catégorie a un détail prés:
			l'argument 'show_count'  => true, renvoi le nbr de message pour la
			catégorie en cours et ne fonctionne pas avec le post_type = 'attachment'
			correspondant aux images

			$info_taxonomy = get_taxonomy('photo_category');
			
			wp_dropdown_categories(array(
                'show_option_all' => __("Filter by {$info_taxonomy->label}"),
                'taxonomy'        => $taxonomy,
                'name'            => $taxonomy,
                'orderby'         =>  'name', //  name: nom de la taxonomie ,on peut aussi utiliser: slug / count / term_order etc
				'value_field'     =>  'slug',
				'show_count'      => true,
                'selected'        => $selected,
                'hierarchical'    => true,
                'hide_if_empty'   => false,
            ));
			*/
			
			
			// lorsqu'on clique sur une option de la zone déroulante,on récupère le slug de la taxonomie sélectionné 
			// et on le passe en paramètre d'URL pour le terme de taxonomie personnalisé: photo_category  
			// soit par exemple photo_category=cours-debutant (cours-debutant étant le slug d'une option catégorie de la zone déroulante)
            //https://monsite.fr/wp-admin/upload.php?mode=list&attachment-filter&photo_category=cours-debutant
           
			echo '<select name="photo_category" class="eccp-media-filter" >';
			
			echo '<option value="">' . esc_html__('Filter by category','editor-custom-color-palette') . '</option>';
		    
			// une option supplémentaire dans le menu déroulant pour filtrer les médias sans catégorie.
			echo '<option value="no-category"' . ($selected === 'no-category' ? ' selected="selected"' : '') . '>' . esc_html__('-- No category --','editor-custom-color-palette') . '</option>';
			
			if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
				//Afficher les catégories pour la liste déroulante de manière hiérarchique
				eccp_display_terms_hierarchical($terms, $selected, $global_term_counts);
			}
			
			echo '</select>';
			
        }
    }
}

if($custom_back_office_settings['eccp_settings_add_categories_to_media_checkbox_field']) {
	add_action('restrict_manage_posts', 'eccp_media_taxonomy_filters');
}


/* 
	Fonction pour afficher les catégories de la liste déroulante de manière hiérarchique
	avec une indentation visuelle pour les différencier.
*/
function eccp_display_terms_hierarchical($terms, $selected, $term_counts = array(), $parent_id = 0, $level = 0) {
	
    foreach ($terms as $term) {
		
		// si $term->parent == $parent_id c'est que c'est une catégorie parente
		// car sinon l'id de la catégorie parente = 0
        if ( $term->parent == $parent_id) {
            
			/* 
				Compter le nbr de média associées à la taxonomie 'photo_category'
				(y compris les sous-catégories).
				au chargement de la médiathèque le compte est bon mais,
				problème lors du filtrage le nbr de média par catégories est
				le même pour toutes les catégories et correspond au nombre
				pour la dernière catégorie sélectionnée
			$count = isset($term_counts[$term->slug]) ? $term_counts[$term->slug] : 0;
			*/
			
			// on marque l'option comme sélectionné si elle correspond a la catégorie
			// sélectionné passé en paramètre dans l'URL
            $selected_attr = $selected === $term->slug ? ' selected="selected"' : '';
			
            $indent = str_repeat('&nbsp;', $level * 3);
			
			// affichage de l'option de la zone déroulante pour la catégorie en cours  
			// avec le nombre entre parenthèse de cette catégorie associée à la taxonomie'photo_category'
            // echo '<option value="' . $term->slug . '"' . $selected_attr . '>' . $indent . $term->name . ' (' . $count . ')</option>';
			echo '<option value="' . $term->slug . '"' . $selected_attr . '>' . $indent . $term->name . '</option>';
			
			// On utilise une récursivité de la fonction eccp_display_terms_hierarchical()
			// pour gérer la hiérachie des catégories
            eccp_display_terms_hierarchical($terms, $selected, $term_counts, $term->term_id, $level + 1);
			
        }
		
    }
}


// Fonction pour compter les pièces jointes associées 
// soit les images qui ont une catégorie
// correspondant au slug de la catégorie: $cat_slug
// pour le terme de taxonomie: $taxonomy = 'photo_category' 
function eccp_query_count_posts_by_term($taxonomy, $cat_slug) {
    
	$args = array(
        'post_type' => 'attachment',
        'post_status' => 'inherit',
        'tax_query' => array(
            array(
                'taxonomy' => $taxonomy,
                'field' => 'slug',
                'terms' => $cat_slug,
                'include_children' => true, // Inclure les sous-catégories
            ),
        ),
    );

	// Exécuter la requête pour compter les pièces jointes
    $query = new WP_Query($args);
	
    return $query->found_posts;
}

// compter le nbr de média par catégories
function eccp_get_global_term_counts($taxonomy) {
	
	$terms = get_terms(array(
                'taxonomy' => $taxonomy,
                'hide_empty' => false,
				'orderby' => 'name',
				'order'  => 'ASC',
    ));
    
    $term_counts = array();
	
	if ( !empty( $terms ) && !is_wp_error( $terms ) ) {

		foreach ($terms as $term) {
			$term_counts[$term->slug] = eccp_query_count_posts_by_term($taxonomy, $term->slug );
		}
	
	}
	
    return $term_counts;
	
}


// Effectue la requête de filtrage selon la catégorie 
// sélectionnée dans la zone déroulante
// On utilise le hook: parse_tax_query mais on aurrait pu aussi
// utiliser le hook: pre_get_posts
function eccp_filter_media_library_by_taxonomy( $query ) {
	
    global $pagenow;
	
	// si on est sur la médiathèque
    if ( $pagenow == 'upload.php' ) {
		
		// si la variable existe et est définit
		if ( isset( $_GET['photo_category'] ) && !empty( $_GET['photo_category'] ) ) {
			
			// si le slug de la catégorie est no-category 
			if ($_GET['photo_category'] === 'no-category') {
				
				
				$tax_query[] = array(
					'taxonomy' => 'photo_category',
					'operator' => 'NOT EXISTS'
				);

				/* source: plugins\enhanced-media-library\core\taxonomies.php 
				   function wpuxss_eml_backend_parse_tax_query( $query ) */
				unset( $query->query['photo_category'] );
				unset( $query->query_vars['photo_category'] );
				
				
            } else {
			
				// arguments de la requête pour filtrer les médias avec catégorie
				$tax_query[] = array(
						'taxonomy' => 'photo_category',// nom de la taxonomie
						'field'    => 'slug', // sélection du terme de la catégorie par slug
						'terms'    => $_GET['photo_category'],// slug de la catégorie passé en paramètre de l'URL
				);
			
			}
			
			// Appliquer le filtre si une catégorie a été sélectionnée
			// tax_query est l'argument pour préciser 
			// que l'on fait une requête de taxonomie
			if ( count( $tax_query ) > 0 ) {
				$query->set( 'tax_query', $tax_query );
			}
			
		}
       
    }
}

if($custom_back_office_settings['eccp_settings_add_categories_to_media_checkbox_field']) {
	add_filter('parse_tax_query', 'eccp_filter_media_library_by_taxonomy',10,1);
}

/*************************************************************************************
          Edition en masse des catégories pour les médias
*************************************************************************************/

// 1) --- ajout de l'option d'edition en masse des catégories -----
function eccp_add_bulk_edit_photo_category($bulk_actions) {
    $bulk_actions['category_bulk_edit'] = __('Category bulk edit', 'editor-custom-color-palette');
    return $bulk_actions;
}

if($custom_back_office_settings['eccp_settings_add_categories_to_media_checkbox_field']) {
	add_filter('bulk_actions-upload', 'eccp_add_bulk_edit_photo_category');
}

/*
2)----- Ajout de la zone déroulante pour la sélection catégorie de l'edition en masse -----

Les sélecteurs CSS pour la zone déroulante « Actions en masse » sont:
#bulk-action-selector-top et #bulk-action-selector-bottom. 
On surveille l'événement de modification de la sélection
pour la zone déroulante  « Actions en masse », 
Lorsque notre option personnalisée: category_bulk_edit
est sélectionnée, on crée notre zone déroulante pour 
l'edition de catégorie en masse et on l'affiche aprés 
la zone déroulante « Actions en masse »
*/
function eccp_add_bulk_edit_category_option() {
    
	global $pagenow;

    if ($pagenow == 'upload.php') {
		
		// on récupère les termes pour la taxonomie 'photo_category' 
		// et on les classe par nom croissant
        $terms = get_terms(array(
            'taxonomy' => 'photo_category',
            'hide_empty' => false,
			'orderby' => 'name', // Trier par nom
            'order' => 'ASC', // Ordre croissant
        ));
        
        if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
			
            ?>
			
			<!--- Style pour le conteneur du select qui permet
					la sélection des catégories pour l'edition en masse
					des médias sélectionnés dans la vue liste --!>
			<style>
                #bulk-edit-category-wrap {
                    display:inline-flex;
                }  
            </style>
			
            <script type="text/javascript">
			
                jQuery(document).ready(function($) {
					
					// On ajoute un ecouteur d'évènement aux zones déroulantes d'actions haute & basse
                    $("#bulk-action-selector-top, #bulk-action-selector-bottom").on('change', function(e){
                        
						var $this = $(this);

						// si l'action choisie est l'edition en masse des catégories
                        if ($this.val() == 'category_bulk_edit') {
                           
						   // Construire la liste déroulante des catégories
						   // la balise <label> permet une disposition sur une même ligne
						   // du sélecteur de catégories & du bouton appliquer
                            var categoryDropdown = '<div id="bulk-edit-category-wrap">';
                            categoryDropdown += '<select size="9" name="bulk_edit_photo_category" id="bulk_edit_photo_category">';
              
							categoryDropdown += '<option value="0"><?php echo esc_html__('-- Delete Category --', 'editor-custom-color-palette'); ?></option>';
                            
							// Appel d'une fonction PHP pour afficher les options de la zone déroulante.
							// Les catégories enfants sont affichées en dessous de la catégorie parente
							// avec une identation des catégories enfant
							<?php eccp_display_terms_hierarchical_js($terms); ?>
							
							categoryDropdown += '</select></div>';

                            // Ajouter la liste déroulante des catégories après le sélecteur d'action en masse
                            $this.after(categoryDropdown);
							
                        } else {
                            $("#bulk-edit-category-wrap").remove();
                        }
						
						
						/* Pour debug , affichage de la catégorie sélectionnée
						$('#bulk_edit_photo_category').on('click', function(e) {
							
							var selectedCategories = [];
							
							// Ajouter la catégorie sélectionnée au tableau selectedCategories
							selectedCategories.push($(this).val());

							// Afficher la variable selectedCategories avec la fonction alert()
							alert('Selected Categories: ' + selectedCategories.join(', '));
							
							
						});
						*/
						
                    });
					
                });
				
            </script>
            <?php
        }
    }
}

if($custom_back_office_settings['eccp_settings_add_categories_to_media_checkbox_field']) {
	add_action('admin_footer-upload.php', 'eccp_add_bulk_edit_category_option');
}

// Fonction pour afficher les catégories dans le script JS de manière hiérarchique
// c'est à dire avec les catégories enfant affichées en dessous de la catégorie parente 
// avec une identation des catégories enfant
function eccp_display_terms_hierarchical_js($terms, $parent_id = 0, $level = 0) {
	
    
	foreach ($terms as $term) {
		
		if ( $term->parent == $parent_id) {
			
			$indent = str_repeat('&nbsp;', $level * 3);
			
			// Génération des options de la liste déroulante dans JS
			?>
			categoryDropdown += '<option value="<?php echo esc_html($term->term_id); ?>"><?php echo $indent . esc_html($term->name); ?></option>';
			<?php
			
			// Appel récursif pour les sous-catégories
			eccp_display_terms_hierarchical_js($terms, $term->term_id, $level + 1);
		}
		
	}
	
	
}


/*
 3) ------ Gestion de la mise à jour en masse des catégories --------
 
 On utilise le hook handle_bulk_actions-upload appliqué a la fonction
 eccp_handle_bulk_edit_photo_category() qui recoit trois paramètres:
 • $redirect_to: l'URL vers laquelle WordPress doit rediriger une fois   
 l'action groupée terminée
 • $doaction: est le nom de l'action qui a été choisie dans la liste déroulante
 • $post_ids: le tableau des identifiants des médias qui ont été sélectionnés 
dans la table en vue liste de la médiathèque.
 
 */
function eccp_handle_bulk_edit_photo_category($redirect_to, $doaction, $post_ids) {
    
	// on commence par vérifier que l'action groupée sélectionnée 
	// est l'action personnalisée: category_bulk_edit
	if ($doaction !== 'category_bulk_edit') {
        return $redirect_to;
    }

	// si la variable est définit
    if ( isset($_REQUEST['bulk_edit_photo_category']) ) {
        
		// on récupère l'id de la catégorie passé dans les paramètres de l'URL et converti en entier
		$category_id = intval($_REQUEST['bulk_edit_photo_category']);
		
		/* 
			Pour debug: sauvegarder l'id de la catégorie transmise en paramètre par l'URL
			dans la méta:  custom_category
		$post_id = 11185; 
		$meta_key = 'custom_category';
		$meta_value = $category_id;

		// Mettre à jour la méta-donnée existante
		update_post_meta($post_id, $meta_key, $meta_value);
		*/
	
		// Pour chaque identifiant de média
		// associe la catégorie sélectionné pour la taxonomie photo_category.
		// Dans la fonction  wp_set_object_terms le dernier paramètre
		// est a true pour concaténer les catégories pour le média
		foreach ($post_ids as $post_id) {
			
			if ($category_id) {
                wp_set_object_terms($post_id, $category_id, 'photo_category', true);
            } else {
                wp_set_object_terms($post_id, null , 'photo_category');
            }
			
        }
		
    }

	// add_query_arg: permet de récupèrer une chaîne de requête URL modifiée
	// on retourne en paramètre d'URL le nombre de médias modifiés
	// le 1er argument est le nom du paramètre passé par l'URL
	// le 2ème argument est le nbr de média mis a jour et affecté a bulk_edit_media_update_results
    $redirect_to = add_query_arg('bulk_edit_media_update_results', count($post_ids), $redirect_to);
	
	return $redirect_to;
}

if($custom_back_office_settings['eccp_settings_add_categories_to_media_checkbox_field']) {
	add_filter('handle_bulk_actions-upload', 'eccp_handle_bulk_edit_photo_category', 10, 3);
}

/*
	4) ----- Afficher un message après la mise a jour des médias suite a notre action groupée -------
*/
if($custom_back_office_settings['eccp_settings_add_categories_to_media_checkbox_field']) {
	
	add_action('admin_notices', function() {
		
		if ( isset($_GET['bulk_edit_media_update_results']) && !empty($_GET['bulk_edit_media_update_results']) ) {
			
			$updated_media_count = (int) $_GET['bulk_edit_media_update_results'];
			printf('<div id="message" class="updated notice is-dismissable">
					  <p>' . '%d ' . esc_html__('updated media.', 'editor-custom-color-palette') . '</p>
					  </div>', $updated_media_count);
		
		}
		
	});

}


/*------------------  COMPTES UTILISATEURS -------------------*/


/*------------------ Ajout d'une colonne pour afficher la date d'enregistrement utilisateur -------------------*/

//Étape 1. Ajouter une colonne sur la page Tous les comptes

if ( $custom_back_office_settings['eccp_settings_activate_users_registration_date_column_checkbox_field'] ==  true ) {
	add_filter( 'manage_users_columns', 'eccp_add_registration_date_column' );
}

function eccp_add_registration_date_column( $columns ) {

	$columns['registration_date'] = __('Registration Date','editor-custom-color-palette'); // ID de la colonne ==> Titre de la colonne
	return $columns;
	
}


//Étape 2. Afficher la date d'enregistrement sur la page Tous les comptes

if ( $custom_back_office_settings['eccp_settings_activate_users_registration_date_column_checkbox_field'] ==  true ) {
	add_action( 'manage_users_custom_column', 'eccp_add_registration_date_users', 10, 3 );
}

function eccp_add_registration_date_users( $output, $column_id, $user_id ){

	if( $column_id == 'registration_date' ) {

		// date au format Français
		$date_format = 'd/m/Y H:i';
		
		// get_the_author_meta() récupère les données de l'utilisateur
		// 1er argument: paramètre a récupérer: user_registered date d'enregistrement
		// 2ème argument: id de l'utilisateur	  
		// la dat rencvoyé est une chaine au format 2020-05-03 13:42:39
		// strtotime convertit la chaine au format timestamp utilisable b par la fonction date()
		$output = date( $date_format, strtotime( get_the_author_meta( 'user_registered', $user_id ) ) );
 
	}

	return $output;
	
}


//Étape 3. Enregistre la colonne Registration Date comme triable 

function eccp_modified_column_users_registration_date_sortable( $columns ) {
	
	$columns['registration_date'] = __('Registration Date','editor-custom-color-palette');
			
    return $columns;
}

if ( $custom_back_office_settings['eccp_settings_activate_users_registration_date_column_checkbox_field'] ==  true ) {
	add_filter( 'manage_users_sortable_columns', 'eccp_modified_column_users_registration_date_sortable' , 10, 1 );
}




/*------------------ Ajout d'une colonne pour afficher la date de dernière connexion -------------------*/

//Étape 1. Stockez l'horodatage de la dernière connexion dans la méta de l'utilisateur

if ( $custom_back_office_settings['eccp_settings_activate_users_last_login_column_checkbox_field'] ==  true ) {
	add_action( 'wp_login', 'eccpt_collect_login_timestamp', 20, 2 );
}

function eccpt_collect_login_timestamp( $user_login, $user ) {

	update_user_meta( $user->ID, 'last_login', time() );

}



//Étape 2. Ajouter une colonne sur la page Tous les comptes

if ( $custom_back_office_settings['eccp_settings_activate_users_last_login_column_checkbox_field'] ==  true ) {
	add_filter( 'manage_users_columns', 'eccp_add_last_login_column' );
}

function eccp_add_last_login_column( $columns ) {

	$columns['last_login'] = __('Last Login','editor-custom-color-palette'); // ID de la colonne ==> Titre de la colonne
	return $columns;
	
}

//Étape 3. Afficher la date de dernière connexion sur la page Tous les comptes

if ( $custom_back_office_settings['eccp_settings_activate_users_last_login_column_checkbox_field'] ==  true ) {
	add_action( 'manage_users_custom_column', 'eccp_add_last_login_users', 10, 3 );
}

function eccp_add_last_login_users( $output, $column_id, $user_id ){

	if( $column_id == 'last_login' ) {

		$last_login = get_user_meta( $user_id, 'last_login', true );
		
		// date au format Français
		$date_format = 'd/m/Y H:i';
		
		// ancien code
		//$output =  $last_login ? date($date_format, $last_login): '-';
		
		// s'il y a une date de dernière connexion alors on affiche dans une div:
		// la date de dernière connexion au format français		  
		// Au survol grace a l'attribut title de la div 
		// Le temps écoulé depuis la date actuelle par rapport à la date de dernière connexion
		// ce temps est calculé avec la fonction WordPress human_time_diff()
		// Sinon on affiche un tiret: '-'
		$output = $last_login ? '<div title="'.__('Last Login','editor-custom-color-palette').': '.human_time_diff( $last_login ).'">'.date( $date_format, $last_login ).'</div>' : '-';
 
		
	}

	return $output;
	
}


//Étape 4. Enregistre la colonne Last Login comme triable 

function eccp_modified_column_users_register_sortable( $columns ) {
	
	$columns['last_login'] = __('Last Login','editor-custom-color-palette');
			
    return $columns;
}

if ( $custom_back_office_settings['eccp_settings_activate_users_last_login_column_checkbox_field'] ==  true ) {
	add_filter( 'manage_users_sortable_columns', 'eccp_modified_column_users_register_sortable' , 10, 1 );
}

/*------------------ Autoriser les contributeurs a télécharger des médias dans la médiathèque -------------------*/

/*
Un contributeur peut uniquement ajouter, éditer et supprimer ses propres articles 
qui seront soumis à la validation d’un administrateur ou d’un éditeur. 
De plus, il lui est impossible de télécharger des médias.
c'est handicapant car les images offrent une plus value aux articles

Avant d’exécuter la fonction qui ajoutera la capacité de téléchargement
a tous les contributeurs,on vérifie si le membre a le rôle de contributeur 
et s’il n’a pas le droit de télécharger des médias.

Le contributeur aura alors le droit de télécharger les images y compris
l'image en avant. il pourra supprimer ses images téléchargées
mais pas celle d'autres utilisateurs qui ne pourra que simplement
consulter.
*/

/*
la fonction utilisé current_user_can() génére une erreur:
Call to undefined function wp_get_current_user()
cela se produit parce que le fichier /wp-includes/pluggable 
qui contient la fonction n'est chargé qu'après le chargement des plugins.
Pour y palier ajout du code ci-dessous
*/
if(!function_exists('wp_get_current_user')) {
    include_once(ABSPATH . 'wp-includes/pluggable.php');
}


// si on autorisé le téléchargement de médias pour les contributeurs
// et si l'utilisateur actuel est un contributeur et qu'il n'a pas la capabilité:upload_files
if ( current_user_can('contributor') && !current_user_can('upload_files')
     && $custom_back_office_settings['eccp_settings_allow_contributors_upload_media_checkbox_field']){

	add_action('admin_init', 'eccp_allow_contributor_uploads');

// sinon si l'utilisateur actuel est un contributeur
// et qu'on n'a pas autorisé le téléchargement de médias pour les contributeurs 	
}else if(current_user_can('contributor') && !$custom_back_office_settings['eccp_settings_allow_contributors_upload_media_checkbox_field'] ){

	add_action('admin_init', 'eccp_remove_contributor_uploads');
}

function eccp_allow_contributor_uploads() {
	$contributor = get_role('contributor');
	$contributor->add_cap('upload_files');
}

function eccp_remove_contributor_uploads() {
	$contributor = get_role('contributor');
	$contributor->remove_cap('upload_files');
}
	
/*------------------ Masquer la barre d'administration WordPress pour les utilisateurs non administrateurs -------------------*/
	
add_action('after_setup_theme', 'eccp_remove_admin_bar');

// On masque la barre d'administration pour les rôles abonnés
function eccp_remove_admin_bar() {
	if ( current_user_can('subscriber') && !is_admin()) {
		show_admin_bar(false);
	}
}


/*------------------  MODIFICATION DE LA PAGE CONNEXION WORDPRESS: LOGO & LIEN & MESSAGE D'ERREUR & SÉLECTEUR DE LANGUE -------------------*/

/* Désactiver le sélecteur de langues */
if ( $custom_back_office_settings['eccp_settings_disable_language_selector_checkbox_field'] ==  true ) {
	add_filter('login_display_language_dropdown', '__return_false');
}

/* Afficher un message d'erreur personnalisé à vos utilisateurs */ 

 // lorsque les utilisateurs saisissent des informations d'identification incorrectes 
 // Si on ne désactive pas les erreurs que WordPress affiche sur notre page de connexion, 
 // on sait d'aprés le message d'erreur si notre login ou mot de passe est erronée.
 // cela permet aux pirate de renifler les noms d'utilisateur qui sont utilisés sur le site Web. 
 // Ils peuvent ensuite utiliser ces informations pour forcer brutalement les mots de passe.

function eccp_custom_login_error_message(){
	
	// récupération des paramètres du plugin
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	
	$msg = $custom_back_office_settings['eccp_error_login_custom_message_textarea_field'];
	return $msg;
}

 if ( !empty($custom_back_office_settings['eccp_error_login_custom_message_textarea_field']) ) {
	add_filter( 'login_errors', 'eccp_custom_login_error_message' );
 }
 
 
 /* Désactiver la demande de vérification de l’adresse e-mail administrateur */ 
 
// Une fois ce code ajouté, il désactivera complètement la page de demande de vérification 
// de l’adresse e-mail lors de la connexion à /wp-admin.

if ( $custom_back_office_settings['eccp_settings_disable_admin_email_request_checkbox_field'] ==  true ) {
	add_filter( 'admin_email_check_interval', '__return_false' );
}


// Changer l'URL du logo de la page de connexion afin qu'elle pointe vers la page d'accueil du site
function eccp_my_login_logo_url() {
	return home_url();
}
add_filter( 'login_headerurl', 'eccp_my_login_logo_url' );


// Texte a afficher lors du survol du Logo
function eccp_my_login_logo_url_title($login_header_text) {
	$login_header_text = 'Rock 4 Temps';
	return $login_header_text;
}
//add_filter( 'login_headertext', 'eccp_my_login_logo_url_title' );

/* Personnalisation Style Formulaire de connexion  */
function eccp_wpm_login_style() { 

$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );

	?>
    <style id="editor-custom-color-palette" type="text/css">
	<?php
	
		// Si on activé la personnalisation du Logo
		if ( $custom_back_office_settings['eccp_settings_activate_custom_logo_checkbox_field'] ==  true ) {
			
			/*-------- Logo personnalisé du formulaire de connexion -------------*/
			
			// si le champ URL n'est pas vide et si ce n'est pas l'URL de l'image par défaut "L'Homme Mystère"
			// et si c'est une URL d'une image contenu dans le dossier uploads de WordPress
			if ( (!empty($custom_back_office_settings['eccp_settings_custom_logo_url_text_field']) ) &&
			    ( $custom_back_office_settings['eccp_settings_custom_logo_url_text_field'] !==  EDITOR_CUSTOM_COLOR_PALETTE_URL.'img/custom-gutenberg-block/eccp-mystery-gravatar.jpg') &&
				(false !== strpos( $custom_back_office_settings['eccp_settings_custom_logo_url_text_field'], site_url().'/wp-content/uploads/' )) ) {
				
				
				echo'#login h1 a, .login h1 a {';
					echo'background-image: url('.esc_url($custom_back_office_settings['eccp_settings_custom_logo_url_text_field']).' )!important;';
					echo'background-size:'.$custom_back_office_settings['eccp_settings_custom_logo_width_text_field'].'px!important;';
					echo'height:'.$custom_back_office_settings['eccp_settings_custom_logo_height_text_field'].'px!important;';
					echo'width:'.$custom_back_office_settings['eccp_settings_custom_logo_width_text_field'].'px!important;';
				echo'}';
			
			}
			
		}
	
		/*-------- Personnalisation formulaire de connexion -------------*/
		
		// Si on activé la personnalisation du formulaire de connexion
		if ( $custom_back_office_settings['eccp_settings_activate_custom_login_form_radio_field'] ==  'yes' ) {
			
			/* couleur d'arrière plan de la page du formulaire de connexion */
			echo'body.login {';
				echo'background:'.$custom_back_office_settings['eccp_settings_page_login_form_background_color_text_field'].';';
			echo'}';
			
			/* couleur du texte en pied de la page du formulaire de connexion */
			echo'body.login #backtoblog a, body.login #nav a,
				 .login  a.privacy-policy-link {';
				echo'color:'.$custom_back_office_settings['eccp_settings_page_login_form_footer_text_color_text_field'].'!important;';
				echo'font-weight:500;';
			echo'}';
			
			/* formulaire de connexion */
			echo'.login #loginform {';
				echo'border-radius : 20px;';
				echo'box-shadow: 0px 0px 4px 1px rgba(0,0,0,0.2);';
				echo'-webkit-box-shadow: 0px 0px 4px 1px rgba(0,0,0,0.2);';
				echo'background:'.$custom_back_office_settings['eccp_settings_login_form_background_color_text_field'].';';
			echo'}';
			
			/* couleur des textes dans le formulaire */
			echo'.login h1 a, #login label {';
				echo'color:'.$custom_back_office_settings['eccp_settings_login_form_text_color_text_field'].'!important;';
			echo'}';
				
			/* Bouton de soumission du formulaire */
			echo'body.login #loginform input[type="submit"] {';
				echo'background:'.$custom_back_office_settings['eccp_settings_button_login_form_background_color_text_field'].';';
				echo'border-color:'.$custom_back_office_settings['eccp_settings_button_login_form_border_color_text_field'].';';
				echo'border-width:2px;';
				echo'border-radius: 6px;';
				echo'text-transform:uppercase;';
				echo'color:'.$custom_back_office_settings['eccp_settings_button_login_form_text_color_text_field'].';';			
				echo'font-weight: 500;';
			echo'}';
			
			/* Bouton de soumission du formulaire au survol */
			echo'body.login #loginform input[type="submit"]:hover {'; 
				echo'background:'.$custom_back_office_settings['eccp_settings_hover_button_login_form_background_color_text_field'].';';
				echo'border-color:'.$custom_back_office_settings['eccp_settings_hover_button_login_form_border_color_text_field'].'!important;';
				echo'border-width:2px;';
				echo'color:'.$custom_back_office_settings['eccp_settings_hover_button_login_form_text_color_text_field'].';';	
				echo'font-weight: 500;';
				echo'padding:0 12px!important;';
				echo'outline:none;';
			echo'}';
			
			/* Bouton de soumission du formulaire actif */
			echo'body.login #loginform input[type="submit"]:focus {'; 
				/* on supprime un contour bleu ammené par une régle box-shadow 
				   lorsque le bouton est actif */
				echo'box-shadow: none;';
			echo'}';
			
			/* oeil visibilité password
			   de la même couleur que celle des boutons 
			   pour garder la cohérence du style original du formulaire*/
			echo'body.login #loginform button.wp-hide-pw span:before{';
				echo'color:'.$custom_back_office_settings['eccp_settings_button_login_form_border_color_text_field'].';';
			echo'}';
			
			/* champ texte login & Password & checkbox
			   bordure de la même couleur que celle des boutons 
			   pour garder la cohérence du style original du formulaire*/
			echo'body.login #loginform input[type="text"],
			     body.login #loginform input[type="password"],
				 body.login #loginform input[type="checkbox"]{';
				echo'border: 1px solid '.$custom_back_office_settings['eccp_settings_button_login_form_border_color_text_field'].';';
			echo'}';
			
			/* champ texte login & Password & checkbox qui ont le focus
			   bordure de la même couleur que celle des boutons 
			   et épaisseur de la bordure doublé
			   pour garder la cohérence du style original du formulaire*/
			echo'body.login #loginform input[type="text"]:focus,
			     body.login #loginform input[type="password"]:focus ,
				 body.login #loginform input[type="checkbox"]:focus{';
				 
				echo'border: 2px solid '.$custom_back_office_settings['eccp_settings_button_login_form_border_color_text_field'].';';
				/* on supprime un contour bleu ammené par une régle box-shadow 
				   lorsque le champ input est actif */
				echo'box-shadow: none;';
				
			echo'}';
			
			
			/* Messsage & message de succés */
			echo'body.login .message, body.login .success {';
				echo'background:'.$custom_back_office_settings['eccp_settings_info_notice_login_form_background_color_text_field'].'!important;';
				echo'border-left: 4px solid '.$custom_back_office_settings['eccp_settings_info_notice_login_form_border_color_text_field'].'!important;';
				echo'color:'.$custom_back_office_settings['eccp_settings_info_notice_login_form_text_color_text_field'].'!important;';
				echo'font-weight: 500;';
			echo'}';
			
			
			/* Messsage erreur */ 
			echo'body.login #login_error {';
				echo'background:'.$custom_back_office_settings['eccp_settings_error_notice_login_form_background_color_text_field'].'!important;';
				echo'border-left: 4px solid '.$custom_back_office_settings['eccp_settings_error_notice_login_form_border_color_text_field'].'!important;';
				echo'color:'.$custom_back_office_settings['eccp_settings_error_notice_login_form_text_color_text_field'].'!important;';
				echo'font-weight: 500;';
			echo'}';
				
			
			/* ajout d'un fond pour les textes hors du formulaires 
			.login #backtoblog a, .login #nav a{
			background-color:#EAE672;
			padding: 3px 8px;
			border-radius:5px;
			}*/
			
			
			/* Aligner les textes hors du formulaires 
			.login #nav, .login #backtoblog {text-align: center;}*/
			
		}
		
		
		// Si on activé une image de fond
		if (  $custom_back_office_settings['eccp_settings_activate_image_background_login_page_radio_field'] ==  'yes' ) {
			
			/*-------- Image de fond Personnalisé pour la page de connexion -------------*/
			
			// si le champ URL n'est pas vide et si ce n'est pas l'URL de l'image par défaut "L'Homme Mystère"
			// et si c'est une URL d'une image contenu dans le dossier uploads de WordPress
			if ( (!empty($custom_back_office_settings['eccp_settings_custom_image_background_url_text_field']) ) &&
			    ( $custom_back_office_settings['eccp_settings_custom_image_background_url_text_field'] !==  EDITOR_CUSTOM_COLOR_PALETTE_URL.'img/custom-gutenberg-block/eccp-mystery-gravatar.jpg') &&
				(false !== strpos( $custom_back_office_settings['eccp_settings_custom_image_background_url_text_field'], site_url().'/wp-content/uploads/' )) ) {
				
				echo'body.login {';
					echo'background-image: url('.esc_url($custom_back_office_settings['eccp_settings_custom_image_background_url_text_field']).' )!important;';
					echo'background-size: cover;';
					echo'background-repeat: no-repeat;';
					echo'background-position: center center;';
				echo'}';
				
				// si on a activé une image de fond fixe
				if ($custom_back_office_settings['eccp_settings_custom_image_background_url_text_field']){
					echo'body.login {';
						echo'background-attachment: fixed;';
					echo'}';
					
				}
				
			}
			
		}
				
    ?>
	</style>
	<?php
	
}
add_action( 'login_enqueue_scripts', 'eccp_wpm_login_style' );


/* Redirection aprés connexion  */

/* Fonction qui redirige aprés connexion les administrateurs vers le 
tableau de bord et les autres utilisateurs vers la page d'accueil. */
function eccp_redirect_after_login( $redirect_to, $requested_redirect_to, $user ) {
	
	//Y a t'il des utilisateur?
	if ( isset( $user->roles ) && is_array( $user->roles ) ) {
		
		//on vérifie si l'utilisateur connecté est l'administrateur
		if ( in_array( 'administrator', $user->roles ) ) {
			// on établit la redirection par défaut
			return $redirect_to;
		} else {
			// on établit la redirection vers la page d'accueil
			return site_url();
		}
	} else {
		return $redirect_to;
	}
}

// Si on activé la redirection
if ( $custom_back_office_settings['eccp_settings_enable_redirect_after_login_checkbox_field'] ==  true ) {
	add_filter( 'login_redirect', 'eccp_redirect_after_login', 10, 3 );
}


/* Redirection aprés déconnexion  */

/* Fonction qui redirige aprés déconnexion les utilisateurs qui ont la capacité d'edition 
vers le  tableau de bord et les autres utilisateurs vers la page d'accueil. 
$redirect_to : (string) L'URL de destination de la redirection.
$requested_redirect_to : (string) L'URL de destination de redirection demandée passée en paramètre.
$user : (WP_User) L'objet WP_User pour l'utilisateur qui se déconnecte.
*/
function eccp_auto_redirect_after_logout($redirect_to, $requested_redirect_to, $user){
	
	$allowed_roles = array( 'editor', 'administrator', 'author' );
	
	// Y a t'il des utilisateurs connecté
	if ( isset( $user->roles ) && is_array( $user->roles ) ) {
		
		//on vérifie si l'utilisateur connecté a la capacité d'edition
		if ( array_intersect( $allowed_roles, $user->roles ) ) {
			// on établit la redirection par défaut
			return $redirect_to;
		} else {
			// on établit la redirection vers la page d'accueil
			return site_url();
		}
	}else {
		return $redirect_to;
	}
	
}

if($custom_back_office_settings['eccp_settings_enable_redirect_after_logout_checkbox_field']){
	add_action('logout_redirect','eccp_auto_redirect_after_logout',10,3);
}

/*------------------  EMAIL WORDPRESS PAR DÉFAUT  -------------------*/

      
/* Modification du nom de l'expéditeur et de l'adresse e-mail WordPress Par défaut */

/*
Généralement, WordPress envoie tous les e-mails en utilisant "WordPress" 
comme nom d'expéditeur et "wordpress@nomdedomaine.fr comme adresse d'expéditeur, 
ce qui convient parfaitement aux notifications d'administration, 
mais pas à tous les types d'e-mails destinés à vos utilisateurs.
Par ailleurs modifier l'adresse e-mail Wordpress par défaut évitera que 
des filtres anti-spam bloquent vos e-mails WordPress les considérant comme indésirables.
*/

if ( $custom_back_office_settings['eccp_settings_enable_change_email_sender_default_checkbox_field'] ) {

	// ADRESSE DE L'EXPÉDITEUR DE L'EMAIL
	function eccp_change_default_sender_email($original_email_address) {
		
		// on récupère les paramètres de réglages de l'extension
		$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
		
		return $custom_back_office_settings['eccp_settings_email_sender_address_text_field'];
	}
	add_filter('wp_mail_from', 'eccp_change_default_sender_email');


	//NOM DE L'EXPÉDITEUR DE L'E-MAIL
	function eccp_change_default_sender_name($original_email_from) {
		
		// on récupère les paramètres de réglages de l'extension
		$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
		
		return $custom_back_office_settings['eccp_settings_email_sender_name_text_field'];
	}
	add_filter('wp_mail_from_name', 'eccp_change_default_sender_name');

}


/* Eviter que les mails de notification WordPress soit considéré comme des spams */


/* 
WordPress utilise la fonction wp_mail()de PHP pour l'envoi d'E-mail sans préciser d'en tête.
On utilise le hook 'phpmailer_init' pour que «l'expéditeur» (chemin de retour) soit le même que l'adresse «De»
c'est a dire : contact@rock-4-temps.fr.
Le chemin de retour indique où les accusés de non-remise - ou les messages refusés - doivent être envoyé
*/
if ( $custom_back_office_settings['eccp_settings_enable_return_adress_correspond_from_adress_checkbox_field'] ) {
	add_action( 'phpmailer_init', 'eccp_fix_my_email_return_path' );
}
 
function eccp_fix_my_email_return_path( $phpmailer ) {
	// $phpmailer->From donne l'adresse de l'expéditeur
	// $phpmailer->Sender adresse de retour 
    $phpmailer->Sender = $phpmailer->From;
}


/*------------------  TABLEAU DE BORD -------------------*/

/*------- Ajout dans le widget "d'un coup d'oeil" du tableau de bord du nombre de block réutilisable------ */

// Ajout dans le widget "d'un coup d'oeil" du tableau de bord
// du nombre de bloc réutilisable sous forme de lien vers
// l'écran qui liste les bloc réutilisables 
function eccp_add_reusables_number_to_dashboard( $items = array() ) {
 
	$num_posts = wp_count_posts( 'wp_block' );
	
	if( $num_posts ) {
	   
			// nombre de bloc réutilisable avec le statut publié
			$number_reusable_block = intval( $num_posts->publish );
			
			// on récupère l'objet des blocs réutilisables le CPT: wp_block
			//dont le nom au singulier est: Bloc réutilisable
			//le nom au pluriel est: Bloc réutilisables		
			$post_type = get_post_type_object( 'wp_block' );
			
			// _n() Traduit et récupère la forme singulière ou plurielle en fonction du nombre fourni.
			$label_link = _n( '%s ' . $post_type->labels->singular_name, '%s ' . $post_type->labels->name, $number_reusable_block );
			$label_link = sprintf( $label_link, number_format_i18n( $number_reusable_block ) );
					 
			// on donne l'accès a l'écran des blocs réutilisables
			// qu'aux utilisateurs qui ont la capacité d'édition
			if ( current_user_can( $post_type->cap->edit_posts ) ) {
					$items[] = sprintf( '<a class="wp_block-count" href="edit.php?post_type=wp_block">%s</a>', $label_link ) . "\n";
			} else {
					$items[] = sprintf( '<span class="wp_block-count">%s</span>', $label_link ) . "\n";
			}
	}
	
	return $items;
}

add_filter( 'dashboard_glance_items', 'eccp_add_reusables_number_to_dashboard', 10, 1 );



/*------ Ajout dans le widget "d'un coup d'oeil" du tableau de bord du nombre d'utilisateur-------- */

// Ajout dans le widget "d'un coup doeil" du tableau de bord
// du nombre d'utilisateur sous forme de liens vers
// l'écran qui liste les comptes utilisateurs 
/*
On utilise la fonction WordPress  count_users() qui retourne
un tableau a deux dimensions avec les clés:
total_users: Nombre total d'utilisateurs sur le site (int)
avail_roles[]: tableau d'entier avec role utilisateur & nbr par rôle

Array
(
    [total_users] => 1
    [avail_roles] => Array
        (
            [administrator] => 1
            [none] => 0
        )

)

*/


/*------ Ajout dans le widget "d'un coup d'oeil" du tableau de bord du nombre d'utilisateur -------- */

function eccp_add_user_count_to_dashboard( $items = array() ) {
 
	$user_count = count_users();
	
	// Nombre d'utilisateur
	$users_number = $user_count["total_users"];
	
	global $current_user;
	
	// on récupère le rôle de l'utilisateur connecté
    $current_user_role = array_shift($current_user->roles);
	
	
	if( $users_number ) {
	   
			$label_link = _n( '%s ' . 'Utilisateur', '%s ' . 'Utilisateurs', $users_number );
			$label_link = sprintf( $label_link, number_format_i18n( $users_number) );
					 
			// on donne l'accès a l'écran des comptes utilisateurs
			// qu'aux utilisateurs qui ont la capacité d'édition
			if ( ( $current_user_role == 'administrator') || ( $current_user_role == 'editor') ) {
					$items[] = sprintf( '<a class="user-count" href="users.php">%s</a>', $label_link ) . "\n";
			} else {
					$items[] = sprintf( '<span class="user-count">%s</span>', $label_link ) . "\n";
			}
	}
	
	return $items;
}

add_filter( 'dashboard_glance_items', 'eccp_add_user_count_to_dashboard', 10, 1 );



/*------ Ajout dans le widget "d'un coup d'oeil" du tableau de bord du nombre pour les différents CPT -------- */

function eccp_add_custom_post_type_number_to_dashboard( $items = array() ) {
	
	// post type ayant un slug, publicly_queryable, mais qui ne sont pas des CPT utilisateurs
	$exclude_post_type = array('elementor_library','seedprod',
								'e-landing-page','/boutique',
								'product','produit','elementor-hf',
								'oceanwp_library','nf_sub','tribe_event_series',
								'tribe_venue','tribe_organizer','bsf_custom_fonts',
							   );
							   
	/*On passe en argument:
	• le paramètre _builtin du post-type qui doit être vide (false), 
	ce qui est le cas pour un type de publication personnalisée contrairement au 
	type de publication par défaut page pour lequel [_builtin] => 1  
	• de même il faut que l'argument publicly_queryable vaut true c'est a dire 
	qu'on autorise la publication du CPT en Front End. 
	En effet certains CPT comme:
	[tribe_organizer] => organisateur , 
	[tribe_venue] => lieu du plugin The Events Calendar
	n'ont pas d'affichage en Front End, et ne sont que des CPT crée pour l'admin du site, 
	cela permet donc de filtrer.*/						   
    $args = array(
        'publicly_queryable' => true,
        '_builtin' => false
    );
	
    $output = 'objects';
    $operator = 'and';
	
	// on récupère le type de publications personnalisées
    $post_types = get_post_types($args , $output , $operator);
	
	
	if( !empty($post_types) ) {
	
		foreach($post_types as $post_type) {
			
			//pour debug
			//echo 'Nom Post_type: '.$post_type->name.'<br>';
			
			// nombre du type de publication personnalisé
			// on récupère un objet 
			// le nombre de CPT publié est donné par $num_posts->publish
			$num_posts = wp_count_posts($post_type->name);
			
			
			// si c'est un type de publication personnalisé autorisé
			if ( !in_array($post_type->name,$exclude_post_type) ){
				
				// pour le type de publication personnalisé ayant le statut publié
				// converti le nombre pour la langue en cours
				$cpt_number = number_format_i18n($num_posts->publish);
				
				// Traduit et récupère la forme singulière ou plurielle du type de publication personnalisé
				// en fonction du nombre fourni par intval($num_posts->publish)
				$label_link = _n('%s ' . $post_type->labels->name, '%s ' . $post_type->labels->name , intval($num_posts->publish));
				
				$label_link = sprintf( $label_link, $cpt_number );
				
				// slug du CPT
				$cpt_name = $post_type->name;
			
				// on donne l'accès a l'écran des CPT
				// qu'aux utilisateurs qui ont la capacité d'édition
				if (current_user_can('edit_posts')) {
					$items[] = sprintf( '<a class="'.$cpt_name.'" href="edit.php?post_type='.$cpt_name.'">%s</a>', $label_link ) . "\n";
				} else {
					$items[] = sprintf( '<span class="'.$cpt_name.'">%s</span>', $label_link ) . "\n";
				}
			
			}
			
		}
	
	}
	
	return $items;
	
}

add_action('dashboard_glance_items', 'eccp_add_custom_post_type_number_to_dashboard');




/*------------------  AUTRES PERSONNALISATION DE L'ADMIN WORDPRESS -------------------*/


/* Désactiver le sitemap de WordPress par défaut */

// l'url du sitemap WordPress est http://monsite/wp-sitemap.xml

if ( $custom_back_office_settings['eccp_settings_disable_default_wordpress_sitemap_checkbox_field'] ==  true ) {
	add_filter( 'wp_sitemaps_enabled', '__return_false' );
}



/*  Activer Lien Connexion/déconnexion Admin WordPress en Local ou en Ligne */

add_filter('wp_nav_menu_items', 'eccp_add_login_logout_link', 10, 2);

// on utilise le hook wp_nav_menu_items qui permet de filtrer la liste
// des items de menu
// Les paramètres de la fonction eccp_add_login_logout_link associé au hooks sont:
// $items: le contenu de la liste HTML pour les items de menu
// $args:  un objet contenant les arguments de wp_nav_menu()
// par exemple $args->menu->term_id donne 2  pour un menu d'ID = 2

// la structure d'une liste HTML pour un item de menu étant
// <li>
//		<a> href="http://localhost/rouerguecreation/contact/" 
//      <span>Contact</span>
//      </a>
// </li>

// Ajout de la classe eccp-loginout aux liens de Connexion/Déconnexion pour notamment
// modifier via css l'offset vers le Haut des icônes Dashicon qu'engendre 
// la classe dashicons
// .eccp-loginout span.dashicons{line-height:inherit!important;}
function eccp_add_login_logout_link($items, $args){
	
	//On récupère les paramètres du plugin
	$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	
	// On récupère le slug de l'URL de connexion a l'admin
	$slug = $custom_back_office_settings['eccp_settings_slug_admin_login_url_text_field'];
	
	//adresse ipv4 local host = 127.0.01 , adresse ipv6 local host = ::1
	$is_localhost = ($_SERVER['REMOTE_ADDR'] == "127.0.0.1" or $_SERVER['REMOTE_ADDR'] == "::1");
  
	// on affecte la liste HTML des items de menu
	$newitems = $items;

	/*Pour debug 
	echo'<pre>';
		print_r($args);
	echo'</pre>';
	*/
	
	$location = array();
	
	/* On récupère tous les emplacements de menu de navigation enregistrés
	   et les ID de menu qui leur sont attribués.
	   le résultat est un tableau associatif avec pour clé l'emplacement
	   de menu de navigation donné aussi par $args->theme_location
	   Exemple de retour de la fonction get_nav_menu_locations()
		Array(
			[main_menu] => 2
			[footer_menu] => 36
		)
	*/
	$location = get_nav_menu_locations();
	
	/* Pour debug 
	echo'<pre>';
		print_r($location);
	echo'</pre>';
	*/
	
	If ( !empty($location) ){
		
		// on considère que la 1ère clé enregistrée 
		// correspond a l'emplacement du menu principal pour l'en-tête
		$theme_location = array_key_first($location);
	
	// sinon on initialise le tableau a une chaine vide
	// pour traiter le cas du thème Blocksy
	// qui n'a pas d'enregistrement pour l'emplacement de menu
	}else {
		$theme_location ='';
	}
	
     // ancien code
    //$theme_location = array("", "primary", "main_menu", "primary-menu");	
	//if ( in_array($args->theme_location,$theme_location) ) {
	
	// on ajoute le lien de Connexion/déconnexion 
	// que pour le menu principal de navigation dans l'en-tête
	// theme_location est une clé du tableau $args
	// theme_location == 'primary' pour Astra & GeneratePress
	// theme_location == 'primary-menu' pour Divi
	// theme_location == 'main_menu' pour oceanWp
	// theme_location == '' pour Blocksy
	// si on veut aussi le pied de page: theme_location == 'footer' 
	// ou theme_location == 'footer_menu' ou theme_location == 'footer-menu'
	if ( $args->theme_location == $theme_location ) {
  
		// Vérifie si le visiteur actuel est un utilisateur connecté
		if (!empty(is_user_logged_in()) ) {

			// si on est en Local et que l'on a activé l'option item de menu Connexion/Déconnexion en local 
			// ou
			// si on est en Ligne et que l'on a activé l'option item de menu Connexion/Déconnexion en ligne
			if ( ($is_localhost && $custom_back_office_settings['eccp_settings_activate_local_site_admin_login_loginout_link_checkbox_field']) ||
				 (!$is_localhost && $custom_back_office_settings['eccp_settings_activate_online_site_admin_login_loginout_link_checkbox_field'])) {
				// on concaténe le lien de déconnexion avec la liste HTML des items de menu
				// on se déconnecte avec la fonction WordPress wp_logout_url en restant sur 
				// la page en cours dont l'URL est donnée par la fonction get_permalink()
				// pour la balise <span> de l'élément de menu on remplace l'item de menu
				// par une icône dashicon migrate
				$newitems .= '<li>
									<a class="eccp-loginout" title="'.esc_html__( 'Logout', 'editor-custom-color-palette' ).'" href="'. esc_url(wp_logout_url(get_permalink())) .'">
										<span  class="dashicons dashicons-migrate"></span>
									</a>
							  </li>';
			
			}
		
		// sinon l'utilisateur n'est pas connecté
		}else{
		  
			// si on est en Local et que l'on a activé l'option item de menu Connexion/Déconnexion en local
			if ($is_localhost && $custom_back_office_settings['eccp_settings_activate_local_site_admin_login_loginout_link_checkbox_field']) {
			
				// on concaténe le lien de déconnexion avec la liste HTML des items de menu 
				// dont l'URL est donnée  par la fonction wp_login_url() qui renvoi: http://monsite.fr/wp-login.php
				// au lieu d'un texte pour la balise <span> de l'élément de menu on a 
				// un icône dashicon Users
				$newitems .= '<li>
									<a class="eccp-loginout" title="'.esc_html__( 'Login', 'editor-custom-color-palette' ).'" href="'. esc_url(wp_login_url()) .'">
										<span class="dashicons dashicons-admin-users"></span>
									</a>
							  </li>';
			
			}
			
			// si on est en Ligne et que l'on a activé l'option item de menu Connexion/Déconnexion en ligne
			if (!$is_localhost && $custom_back_office_settings['eccp_settings_activate_online_site_admin_login_loginout_link_checkbox_field']) {
		
				// pour une URL de connexion en ligne avec un slug qui peut être changé par exemple
				// avec une extension comme Itheme Security:
				// on fournit a la fonction home_url() un paramètre de chemin relatif qui est :/slug ajouté
				// a l'URL de la page d'accueil: https://your-domain
				// au lieu d'un texte pour la balise <span> de l'élément de menu on a 
				// un icône dashicon admin-users
				$newitems .= '<li>
									<a class="eccp-loginout" title="'.esc_html__( 'Login', 'editor-custom-color-palette' ).'" href="'. esc_url(home_url('/'.$slug)) .'">
										<span class="dashicons dashicons-admin-users"></span>
									</a>
							  </li>';
			
			}
			
		}
		
	}	

	return $newitems;
  
}
	
	
add_action( 'wp_head','ecpp_style_login_logout_link',1 );

// style pour l'icone Dashicon du lien de connexion/déconnexion
// a l'admin de WordPress
function ecpp_style_login_logout_link() {
	
	// on récupère le thème actif
	$my_theme = wp_get_theme();
	
	echo '<style type="text/css" id="login-logout-link">';
		
		echo' .eccp-loginout span.dashicons{';
			echo'line-height:inherit!important;';
			echo'margin-right:1em;';
		echo'}';
		
		// pour le thème Astra on corrige la position de l'icône
		if(stristr($my_theme, 'astra')) {
			
			echo' .eccp-loginout span.dashicons{';
				echo'position: relative;';
				echo'top: 18px;';
			echo'}';
		
		}
	
	echo '</style>';
	
}


/*----------------------------------------------------------------------------------------
		               DÉCLARATION DE MÉTA DE PUBLICATION
/*---------------------------------------------------------------------------------------*/

// Métas pour supprimer l'insertion de bloc Avant et/ou aprés le contenu d'une publication
// les métas de publications seront mises a jour par des options(toogle control) du panneau
// Contenu avant/aprés publication de la sidebar document 

// Métas pour sauvegarder la date d'évènement pour un compte a rebours
// établi par la variante du bloc groupe Contdown Timer.
// Cette méta est affectée par un DatePicker du panneau ECCP Countdown Timer
// des paramètes du bloc.

// Métas pour désactiver la barre de progression de lecture uniquement
// sur les pages

/*
register_post_meta( string $post_type, string $meta_key, array $args ): bool

$post_type : type de publication pour lequel enregistrer une clé méta. 
peut être 'post','page','slug CPT', 'comment', 'term', 'user'
Passez une chaîne vide pour enregistrer la clé méta sur tous 
les types de publication existants.

$meta_key : la méta clé a enregistrer

$args:tableau de paramètres pour décrire la clé méta lors de son enregistrement
single: 
Indique si la clé méta a une valeur unique:true ou un tableau de valeurs:false
show_in_rest => true  cette méta est accessible dans l'éditeur et l'API REST 
auth_callback:Une fonction à appeler lors de l'exécution des vérifications de capacité
'auth_callback' => '__return_true' évite que la méta soit visible dans les champs 
personnalisés de l'editeur, on a exactement la même chose en préfixant la méta
avec un underscore: _remove_blocks_before_content
avec une capacité d'editeur cela donne: 
'auth_callback' => function() {
			return current_user_can('edit_posts');
}
Lorsque le type de publication personnalisé(CPT) est défini pour
l'enregistrement de la méta de publication , 
le tableau de supports valeurs du CPT doit inclure custom-fields. 
par exemple
'supports' => array( 'title', 'editor', 'custom-fields' ),
Si custom-fields n'est pas inclus, la méta de publication ne fonctionnera pas
et provoquera une erreur du plugin eccp-plugin-sidebar-document définit en React JS
pour mettre a jour nos métas de publication.

*/
function eccp_register_post_meta() {
    
	register_post_meta( 
		'', 
		'remove_blocks_before_content', 
		[
			'auth_callback' => '__return_true',
			'default'       => false,
			'show_in_rest' => true,
			'single' => true,
			'type' => 'boolean',
		]
	);
	
	
	register_post_meta( 
		'', 
		'remove_blocks_after_content',
		[
			'auth_callback' => '__return_true',
			'default'       => false,
			'show_in_rest' => true,
			'single' => true,
			'type' => 'boolean',
		] 
	);
	
	register_post_meta( 
		'', 
		'countdown_timer_date_events', 
		[
			'auth_callback' => '__return_true',
			'default'       => '',
			'show_in_rest' => true,
			'single' => true,
			'type' => 'string',
		]
	);
	
	register_post_meta( 
		'', 
		'disable_reading_progress_bar',
		[
			'auth_callback' => '__return_true',
			'default'       => false,
			'show_in_rest' => true,
			'single' => true,
			'type' => 'boolean',
		] 
	);
	
}
add_action( 'init', 'eccp_register_post_meta' );



/*------ Ajout des Métas de publication dans des colonnes pour les écrans qui listent les publications -------*/


// Étape 1. Ajouter les colonnes pour les métas de publication

// On récupère les paramètres de réglages de l'extension
$reusable_blocks_settings = get_option( 'eccp_settings_reusable_blocks' );


$existing_post_before_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_before_post_select_field'] );
$existing_post_after_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_after_post_select_field'] );

$existing_page_before_reusable_block_id  = intval( $reusable_blocks_settings['eccp_settings_insert_block_before_page_select_field'] );
$existing_page_after_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_after_page_select_field'] );

$existing_cpt_before_reusable_block_id  = intval( $reusable_blocks_settings['eccp_settings_insert_block_before_cpt_select_field'] );
$existing_cpt_after_reusable_block_id = intval( $reusable_blocks_settings['eccp_settings_insert_block_after_cpt_select_field'] );


// Pour Les Custom Post Type
// on va retarder un peu le processus global, et attendre que les plugins soient tous chargés 
// pour exécuter notre fonction.
// Le hook « plugins_Loaded » semble un peu tardif, 
// on va utiliser le hook « init »
if ( $existing_cpt_before_reusable_block_id || $existing_cpt_after_reusable_block_id   ) {
	add_action('admin_init','eccp_loop_through_custom_post_type_to_add_meta_columns');
}

// Pour les articles
if ( $existing_post_before_reusable_block_id || $existing_post_after_reusable_block_id   ) {
	add_filter( 'manage_post_posts_columns', 'eccp_add_remove_blocks_before_and_after_content_column' );
}

// Pour les pages
if ( $existing_page_before_reusable_block_id || $existing_page_after_reusable_block_id   ) {
	add_filter( 'manage_page_posts_columns', 'eccp_add_remove_blocks_before_and_after_content_column' );
}


// si on a activé la barre de progression de lecture pour les pages
if ($custom_front_end_settings['eccp_settings_enable_reading_progress_bar_for_pages_checkbox_field']) {
	add_filter( 'manage_page_posts_columns', 'eccp_add_disable_reading_progress_bar_column' );
}

// si on a activé la barre de progression de lecture pour les articles
if ($custom_front_end_settings['eccp_settings_enable_reading_progress_bar_for_post_checkbox_field']) {
	add_filter( 'manage_post_posts_columns', 'eccp_add_disable_reading_progress_bar_column' );
}


// On boucle sur tous les CPT pour afficher les colonnes des métas de publication
// excepté pour le plugin The Events Calendar
function eccp_loop_through_custom_post_type_to_add_meta_columns() {
	
	/*
	Array(
		[0] => cours-rock4temps
		[1] => tribe_events
	)
	*/
	// On récupère les slugs des CPT sous forme d'un tableau qui est indexé de façon numérique
	$all_slug_cpt = eccp_get_slug_all_custom_post_type(); 
	
	
	/* pour debug 
		echo'<pre>';
		print_r($all_slug_cpt);
		echo'</pre>';
	*/ 
	
					
	// s'il y a des Custom Post Type
	if ( !empty( $all_slug_cpt ) ) {
	
		
		foreach ( $all_slug_cpt as $value) {
			
			// Pour le plugin The Events Calendar
			// on ne gère pas l'insertion automatique de blocs réutilisables
			// avant et/ou aprés le contenu
			if ( $value !== 'tribe_event' ) {
					
				// pour ajouter nos colonnes: "Supprimer les blocs avant le contenu"
				// & "Supprimer les blocs aprés le contenu"
				// on utilise le hook: manage_post_type_posts_columns pour un CPT 
				// post_type est a remplacer par le slug du type de publication personnalisé
				// dans le cas du site Rock4Temps $value = cours-rock4temps
				add_filter('manage_'.$value.'_posts_columns', 'eccp_add_remove_blocks_before_and_after_content_column');
				// on remplit nos colonnes avec les valeurs pour les CPT
				add_action( 'manage_'.$value.'_custom_column', 'eccp_add_before_and_after_content_value',10,2 );
		
				// barre progression de lecture
				// on ajoute la colonne "Désactiver la barre progression de lecture" pour les CPT
				add_filter('manage_'.$value.'_posts_columns', 'eccp_add_disable_reading_progress_bar_column');
				// on rempli la colonne "Désactiver la barre progression de lecture" avec les valeurs pour les CPT
				add_action( 'manage_'.$value.'_custom_column', 'eccp_add_disable_reading_progress_bar_value',10,2 );
		
		
			}
		
		}
		
	}
	
}


function eccp_add_remove_blocks_before_and_after_content_column( $columns ) {

	$columns['remove_blocks_before_content'] = __('Remove blocks before content','editor-custom-color-palette'); // ID de la colonne ==> Titre de la colonne
	$columns['remove_blocks_after_content'] = __('Remove blocks after content','editor-custom-color-palette'); 
	
	return $columns;
	
}

function eccp_add_disable_reading_progress_bar_column( $columns ) {

	$columns['disable_reading_progress_bar'] = __('Disable reading progress bar','editor-custom-color-palette'); // ID de la colonne ==> Titre de la colonne
	
	return $columns;
	
}


//Étape 2. Afficher les métas de publications

// Pour les articles
add_action( 'manage_posts_custom_column', 'eccp_add_before_and_after_content_value',10,2 );
add_action( 'manage_posts_custom_column', 'eccp_add_disable_reading_progress_bar_value',10,2 );

// Pour les pages
add_action( 'manage_pages_custom_column', 'eccp_add_before_and_after_content_value',10,2 );
add_action( 'manage_pages_custom_column', 'eccp_add_disable_reading_progress_bar_value',10,2 );


function eccp_add_before_and_after_content_value( $column_id, $post_id ){

	
	switch( $column_id ) {
		
		case 'remove_blocks_before_content': 
			$remove_blocks_before_content = get_post_meta( $post_id,'remove_blocks_before_content',true );
			echo $remove_blocks_before_content ? __('yes','editor-custom-color-palette') : __('no','editor-custom-color-palette');
			break;
		
		case 'remove_blocks_after_content': 
			$remove_blocks_after_content = get_post_meta( $post_id,'remove_blocks_after_content',true );
			echo $remove_blocks_after_content ? __('yes','editor-custom-color-palette') : __('no','editor-custom-color-palette');			
			break;
			
	}

}

function eccp_add_disable_reading_progress_bar_value( $column_id, $post_id ){

	
	switch( $column_id ) {
		
		case 'disable_reading_progress_bar': 
			$disable_reading_progress_bar = get_post_meta( $post_id,'disable_reading_progress_bar',true );
			echo $disable_reading_progress_bar ? __('yes','editor-custom-color-palette') : __('no','editor-custom-color-palette');			
			break;
		
	}

}


/*------ Ajouter des champs d'édition rapide en HTML pour les Métas de publication -------*/


// Étape 1. Ajouter des champs checkbox en HTML dans l'édition rapide

// le hook quick_edit_custom_box permet d'ajouter du HTML dans Quick Edit(edition rapide)
add_action( 'quick_edit_custom_box','eccp_quick_edit_before_after_content_fields',1,2 );

/*
Cette Fonction permet d'ajouter des champs checkbox dans l'edition rapide
Pour supprimer l'affichage des bloc réutilisables Avant Et/Ou Aprés le contenu

Pour regrouper tous les champs dans une seule balise  <fieldset>
j'ai ajouté une <fieldset> balise d'ouverture lors de l'affichage du premier champ checkbox 
et une balise de fermeture </fieldset> lors de l'affichage du dernier champ checkbox .

Les classes inline-edit-col-left,inline-edit-col,title sont native a WordPress
Nécessite le script Jquery :eccp-update-fields-quick-edit.js pour fonctionner
ce script est dans le dossier JS du plugin
Les champs HTML sont ajouté uniquement si on a activé les colonnes remove_blocks_before_content
& remove_blocks_after_content pour les écrans de publication article ou page ou CPT

*/
function eccp_quick_edit_before_after_content_fields( $column_id, $post_type ) {

	
	switch( $column_id ) {
		
		case 'remove_blocks_before_content': {
			?>
				<fieldset id="before_after_content" class="inline-edit-col-left">
				
					<span class="title">Contenu avant/aprés publication</span>
					
					<div class="inline-edit-col">
						<label>
							<input type="checkbox" id="remove-blocks-before-content" name="remove-blocks-before-content" checked> 
							<?php esc_html_e('Remove blocks before content','editor-custom-color-palette')?>
						</label>
					</div>
				
			<?php
			break;
		}
		
		case 'remove_blocks_after_content': {
			?>
					<div class="inline-edit-col">
						<label>
							<input id="remove-blocks-after-content" type="checkbox" name="remove-blocks-after-content" checked> 
							<?php esc_html_e('Remove blocks after content','editor-custom-color-palette')?>
						</label>
					</div>
					
				</fieldset>
			<?php
			break;
		}
		
	}
	
}


// le hook quick_edit_custom_box permet d'ajouter du HTML dans Quick Edit(edition rapide)
add_action( 'quick_edit_custom_box','eccp_quick_edit_disable_reading_progress_bar_fields',1,2 );

// Cette Fonction permet d'ajouter un champ checkbox dans l'edition rapide
// Pour désactiver la barre de progression de lecture pour les pages
function eccp_quick_edit_disable_reading_progress_bar_fields( $column_id, $post_type ) {

	
	switch( $column_id ) {
		
		
		case 'disable_reading_progress_bar': {
			?>
				<fieldset id="reading_progress_bar" class="inline-edit-col-left">
				
					<span class="title">Barre progression de lecture</span>
					
					<div class="inline-edit-col">
						<label>
							<input type="checkbox" id="disable-reading-progress-bar" name="disable-reading-progress-bar" checked> 
							<?php esc_html_e('Disable reading progress bar','editor-custom-color-palette')?>
						</label>
					</div>
					
				</fieldset>
				
			<?php
			break;
		}
		
		
	}
	
}


// Étape 2. Remplir les champs checkbox de l'edition rapide en utilisant les données des colonnes 

// on ne peut pas utiliser par exemple get_post_meta( get_the_ID(),'remove_blocks_before_content',true );
// directement a l'ETAPE 1 via le hook: quick_edit_custom_box dans l'edition rapide pour mettre a jour 
// un champ checkbox car l'ID retourné sera toujours celui du dernier message
// en effet la variable globale $post auxquel se réfère la fonction get_the_ID()
// renvoie uniquement l'ID du dernier message car les entrées d'édition rapide ne sont créées 
// qu'une seule fois et clonées au besoin lors de l'édition rapide d'une colonne
//
// la mise a jour des champ checkbox devra se faire avec un fichier JS
// en utilisant le hook inlineEditPost.edit qui permet de définir les valeurs d'entrée 
// le fichier JS utilisé est: eccp-update-fields-quick-edit.js
// il se trouve dans le Dossier js de l'extension



// Étape 3. Enregistrer les champs d'édition rapide 


// Enregistrer les champs pour les métas de publication après la modification rapide
// pour l' insertion de blocs réutilisables Avant ET/OU Aprés
add_action( 'save_post', 'eccp_remove_before_after_content_quick_edit_save',10,3 );

function eccp_remove_before_after_content_quick_edit_save( $post_id , $post, $update ){

	/* ============================================================== 
	                   VÉRIFICATION DE SÉCURITÉ
		• Vérification du nonce de sécurité
	    • Vérification de la capacité d'edition
	    • On exécute cette fonction que pour une mise a jour rapide
		et on évite de l'exécuter pour:
		- la création d'une Publication
		- les sauvegardes automatiques
	 ================================================================ */


	// Vérifier nonce de sécurité pour inline edit
	// _inline_edit étant un champ caché de l'edition rapide
    // Ajout isset($_POST['_inline_edit']) pour gestion erreur: undefined array key "_inline_edit"  
	if ( isset($_POST['_inline_edit']) ){
		if(!wp_verify_nonce( $_POST[ '_inline_edit' ], 'inlineeditnonce' )){
			return ;
		}  
	} 
	
	// on autorise la modification des métas de publication 
	// que pour les utilisateurs qui ont la capacité d'édition
	if ( !current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
	
	// Evite que la fonction se lance dès que l'on clique sur "ajouter" une page ou article etc..
	// $update est égal à false si on est dans le cas d’une première création ;
    // $update est égal à true lorsqu’on enregistre un article.
	if( !$update ) {
    	return;
	}
	
	// On évite les sauvegardes automatiques
	if( defined( 'DOING_AUTOSAVE' ) and DOING_AUTOSAVE ) {
		return;
	}

	// Mise a jour Métas de publication
	// un checbox renvoi true s'il est checké sinon renvoi NULL
	// avec sanitization par la fonction isset() avant sauvegarde en base de données
	$remove_blocks_before_content = isset( $_POST[ 'remove-blocks-before-content' ] ) ? true : false;
	update_post_meta( $post_id, 'remove_blocks_before_content', $remove_blocks_before_content );
	
	$remove_blocks_after_content = isset( $_POST[ 'remove-blocks-after-content' ] ) ? true : false;
	update_post_meta( $post_id, 'remove_blocks_after_content', $remove_blocks_after_content );
	

}



// Enregistrer les champs pour les métas de publication après la modification rapide
// pour la barre de progression de lecture
add_action( 'save_post', 'eccp_disable_reading_progress_bar_quick_edit_save' );

function eccp_disable_reading_progress_bar_quick_edit_save( $post_id ){

	
	/* ============================================================== 
	                   VÉRIFICATION DE SÉCURITÉ
		• Vérification du nonce de sécurité
	    • Vérification de la capacité d'edition
	    • On exécute cette fonction que pour une mise a jour rapide
		et on évite de l'exécuter pour:
		- la création d'une Publication
		- les sauvegardes automatiques
	 ================================================================ */


	// Vérifier nonce de sécurité pour inline edit
	// _inline_edit étant un champ caché de l'edition rapide
    // Ajout isset($_POST['_inline_edit']) pour gestion erreur: undefined array key "_inline_edit"  
	if ( isset($_POST['_inline_edit']) ){
		if(!wp_verify_nonce( $_POST[ '_inline_edit' ], 'inlineeditnonce' )){
			return ;
		}  
	} 
	
	// on autorise la modification des métas de publication 
	// que pour les utilisateurs qui ont la capacité d'édition
	if ( !current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
	
	// Evite que la fonction se lance dès que l'on clique sur "ajouter" une page ou article etc..
	// $update est égal à false si on est dans le cas d’une première création ;
    // $update est égal à true lorsqu’on enregistre un article.
	if( !$update ) {
    	return;
	}
	
	// On évite les sauvegardes automatiques
	if( defined( 'DOING_AUTOSAVE' ) and DOING_AUTOSAVE ) {
		return;
	}
	

	// Mise a jour Méta de publication
	// avec sanitization par la fonction isset() avant sauvegarde en base de données
	$disable_reading_progress_bar = isset( $_POST[ 'disable-reading-progress-bar' ] ) ? true : false;
	update_post_meta( $post_id, 'disable_reading_progress_bar', $disable_reading_progress_bar );
	
}


/*------ Ajouter des champs d'édition groupé en HTML pour les Métas de publication -------*/


// Étape 1.  établir l'ajout de colonne pour chaque champ de méta dans les publications
// ce qui a été fait dans la section ci-dessous:
// • Ajout des Métas de publication dans des colonnes pour les écrans qui listent les publications
// Cela permet d'avoir un visuel de la valeur des métas pour chaque publication
// mais n'est pas obligatoire pour l'edition groupé contrairement a l'edition rapide.


// Étape 2. Utilisation du hook  bulk_edit_custom_box pour faire apparaître 
// les champs dans l'édition en bloc

// le hook quick_edit_custom_box permet d'ajouter du HTML dans l'edition groupé
add_action( 'bulk_edit_custom_box','eccp_bulk_edit_before_after_content_fields',1,2 );

/*
Cette Fonction permet d'ajouter des champs checkbox dans l'edition groupé
Pour supprimer l'affichage des bloc réutilisables Avant Et/Ou Aprés le contenu

Pour regrouper tous les champs dans une seule balise  <fieldset>
j'ai ajouté une <fieldset> balise d'ouverture lors de l'affichage du premier champ checkbox 
et une balise de fermeture </fieldset> lors de l'affichage du dernier champ checkbox .

Les classes inline-edit-col-left,inline-edit-col,title sont native a WordPress
Nécessite le script Jquery :eccp-update-fields-quick-edit.js pour fonctionner
ce script est dans le dossier JS du plugin
Les champs HTML sont ajouté uniquement si on a activé les colonnes remove_blocks_before_content
& remove_blocks_after_content pour les écrans de publication article ou page ou CPT

*/
function eccp_bulk_edit_before_after_content_fields( $column_id, $post_type ) {

	
	switch( $column_id ) {
		
		case 'remove_blocks_before_content': {
			?>
				<fieldset id="before_after_content" class="inline-edit-col-left">
				
					<span class="title"><?php esc_html_e('Content before/after publication','editor-custom-color-palette')?></span>
					
					<div class="inline-edit-col">
						<label>
							<input type="checkbox" id="remove-blocks-before-content" name="remove-blocks-before-content"> 
							<?php esc_html_e('Remove blocks before content','editor-custom-color-palette')?>
						</label>
					</div>
				
			<?php
			break;
		}
		
		case 'remove_blocks_after_content': {
			?>
					<div class="inline-edit-col">
						<label>
							<input id="remove-blocks-after-content" type="checkbox" name="remove-blocks-after-content"> 
							<?php esc_html_e('Remove blocks after content','editor-custom-color-palette')?>
						</label>
					</div>
					
				</fieldset>
			<?php
			break;
		}
		
	}
	
}


// le hook quick_edit_custom_box permet d'ajouter du HTML dans l'edition groupé
add_action( 'bulk_edit_custom_box','eccp_bulk_edit_disable_reading_progress_bar_fields',1,2 );

// Cette Fonction permet d'ajouter un champ checkbox dans l'edition groupé
// Pour désactiver la barre de progression de lecture pour les pages
function eccp_bulk_edit_disable_reading_progress_bar_fields( $column_id, $post_type ) {

	
	switch( $column_id ) {
		
		case 'disable_reading_progress_bar': {
			?>
				<fieldset id="reading_progress_bar" class="inline-edit-col-left">
				
					<span class="title"><?php esc_html_e('Reading progress bar','editor-custom-color-palette')?></span>
					
					<div class="inline-edit-col">
						<label>
							<input type="checkbox" id="disable-reading-progress-bar" name="disable-reading-progress-bar"> 
							<?php esc_html_e('Disable reading progress bar','editor-custom-color-palette')?>
						</label>
					</div>
					
				</fieldset>
				
			<?php
			break;
		}
		
	}
	
}

// Étape 3. Enregistrer les champs d'édition groupé

// Enregistrer les champs pour les métas de publication après la modification groupé
// on va obtenir les données des cases a cocher avec $_REQUEST, et non $_POST
add_action( 'save_post', 'eccp_remove_before_after_content_bulk_edit_save' );

function eccp_remove_before_after_content_bulk_edit_save( $post_id ){

	// Vérifier nonce de l'edition groupé pour les articles & CPT par bulk-posts  
	// bulk-pages pour les pages
	//	Ajout isset($_REQUEST['_wpnonce']) pour gestion erreur: undefined array key "_wpnonce" 	
	if ( isset($_REQUEST['_wpnonce']) ){
		if( !wp_verify_nonce( $_REQUEST[ '_wpnonce' ], 'bulk-posts' ) ){
			return ;
		}  
	} 
	
	// on autorise la modification des métas de publication 
	// que pour les utilisateurs qui ont la capacité d' édition
	if ( !current_user_can( 'edit_post', $post_id ) ) {
        return;
    }
	
	// Mise a jour Métas de publication
	$remove_blocks_before_content = isset( $_REQUEST[ 'remove-blocks-before-content' ] ) ? true : false;
	update_post_meta( $post_id, 'remove_blocks_before_content', $remove_blocks_before_content );
	
	$remove_blocks_after_content =  isset( $_REQUEST[ 'remove-blocks-after-content' ] ) ? true : false;
	update_post_meta( $post_id, 'remove_blocks_after_content', $remove_blocks_after_content );

}


// Enregistrer les champs pour les métas de publication après la modification groupé
// on va obtenir les données des cases a cocher avec $_REQUEST, et non $_POST
add_action( 'save_post', 'eccp_disable_reading_progress_bar_bulk_edit_save' );


function eccp_disable_reading_progress_bar_bulk_edit_save( $post_id ){

	// Vérifier nonce pour inline edit
    //	Ajout isset($_POST['_inline_edit']) pour gestion erreur: undefined array key "_inline_edit"  
	if ( isset($_REQUEST['_inline_edit']) ){
		if(!wp_verify_nonce( $_REQUEST[ '_inline_edit' ], 'inlineeditnonce' )){
			return ;
		}  
	} 
	
	
	// on autorise la modification des métas de publication 
	// que pour les utilisateurs qui ont la capacité d' édition
	if ( !current_user_can( 'edit_post', $post_id ) ) {
        return;
    }

	// Mise a jour Méta de publication
	$disable_reading_progress_bar = isset( $_REQUEST[ 'disable-reading-progress-bar' ] ) ? true : false;
	update_post_meta( $post_id, 'disable_reading_progress_bar', $disable_reading_progress_bar );
	
}


/*------ Ajouter des metabox a la fin de l'edition des publications -------*/
// Si ces métabox ne sont pas présentent alors la sauvegarde d'une publication
// réinitialise les métas
	
// Ajouter la métabox pour la barre progression de lecture
add_action('add_meta_boxes', 'eccp_add_metabox_reading_progress_bar');

/* 4 arguments + 3 optionnels
• identifiant unique de la metabox.
• titre de la metabox, tel qu’il s’affichera dans l’admin
• fonction qui va nous permettre de construire la metabox.
• type de contenu concerné ( post | page | custom post type… )
• cinquième (optionnel) indique son emplacement dans la page d’édition:
 normal (au centre) ou side (dans la colonne latérale) ou advanced
• Le sixième (optionnel) correspond à sa priorité (high | core | default | low). 
C’est à dire, en gros, à la position verticale de cette boîte
• Le dernier argument (optionnel) est un tableau correspondant aux valeurs 
qui seront passé à la fonction de construction de la metabox. 
Par défaut seul l’objet $post est transmit.
*/ 
function eccp_add_metabox_reading_progress_bar() {
	
	// La fonction définie dans le fichier inc/eccp-multiple-settings.php 
	// retourne un array avec  
	// $index['name']: Nom du CPT   
	// $index['slug']: Slug du CPT
	$all_cpt = eccp_get_all_custom_post_type_for_reading_progress_bar();

	$slug_CPT = array();
	$i = 0;

	if(!empty($all_cpt)) {
		foreach($all_cpt as $index) {
			$slug_CPT[$i] = $index['slug'];
			$i++;
		}
	}

	$wordpress_standard_posts = ['post','page'];
	

	// tableau qui liste les différentes publications
	$screens = array_merge($wordpress_standard_posts,$slug_CPT);
	
	/* pour debug 
	echo'<pre>';
	 print_r($screens );
	echo'</pre>';
	*/
	
	foreach ( $screens as $screen ) {
		add_meta_box(
			'metabox_disable_reading_progress_bar',// metabox ID
			__('Disable reading progress bar','editor-custom-color-palette'),// titre
			'eccp_content_metabox_reading_progress_bar',// callback function
			$screen, // Type de contenu (page, post, CPT)
			'normal', // Contexte (side, normal, advanced)
			'core' // Priorité (high, core, default, low)
		);
	
	}
	
}

function eccp_content_metabox_reading_progress_bar($post) {
	
	// Récupérer la valeur enregistrée dans la méta
	/*
	Cette fonction prend 3 paramètres :
	• L’ID du contenu dont on veut récupérer la métadonnée
	• La meta_key dont on veut la (les) valeur
	• Le type de retour attendu : chaîne ou tableau (true ou false).
	*/
	$disable_reading_progress_bar = get_post_meta($post->ID, 'disable_reading_progress_bar', true);
	
	
	// Utiliser checked() pour vérifier la case à cocher
	// Compare les deux premiers arguments et s'ils sont identiques
	// alors marque la case comme cochée
	?>
	<table class="form-table eccp-metabox">
		<tbody>
			<tr>
				<th>
					<label for="disable_reading_progress_bar">
						<?php esc_html_e('Disable reading progress bar','editor-custom-color-palette')?>
					</label>
				</th>
				<td><input type="checkbox" id="disable_reading_progress_bar" name="disable_reading_progress_bar" value=1 <?php if ( isset ( $disable_reading_progress_bar ) ) checked( $disable_reading_progress_bar, true,true );?> ></td>
			</tr>
		</tbody>
	</table>
	<?php
}


add_action('save_post', 'eccp_save_metabox_reading_progress_bar');

// Enregistrer la valeur de la méta lors de la sauvegarde de la publication
function eccp_save_metabox_reading_progress_bar($post_id) {
	
	// Vérifier les autorisations
	if (!current_user_can('edit_post', $post_id)) {
		return $post_id;
	}
	
	// Ne sauvegardez pas les données en cas de sauvegarde automatique de WordPress
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
		return $post_id;
	}
	
	// Enregistrer la valeur de la méta
	/*
	La fonction update_post_meta() accepte 4 argument (3 obligatoire et 1 facultatif) :
	• L’ID du contenu auquel on associe cette meta
	• La meta_key correspondant à la valeur que l’on sauvegarde.
	elle commence par un underscore, ainsi elle ne s’affichent pas dans les custom fields
	• Le troisième argument correspond à la valeur que l’on souhaite enregistrer
	  sur laquelle pour sécurité on effectue une sanitization avant de l'enregistrer
	  en base de données.
	*/
	
	if(isset($_POST['disable_reading_progress_bar'])){
		update_post_meta($post_id,'disable_reading_progress_bar', $_POST['disable_reading_progress_bar']);
	}
	
	return $post_id;
}




// Ajout Metabox pour supprimer l'affichage des blocs réutilisables AVANT ET/OU APRÉS le contenu
add_action('add_meta_boxes', 'eccp_add_metabox_remove_blocks_before_after_content');

function eccp_add_metabox_remove_blocks_before_after_content() {
	
	// La fonction définie dans le fichier inc/eccp-multiple-settings.php 
	// retourne un array avec	
	// $index['name']: Nom du CPT   
	// $index['slug']: Slug du CPT
	$all_cpt = eccp_get_all_custom_post_type_for_reading_progress_bar();

	$slug_CPT = array();
	$i = 0;

	if(!empty($all_cpt)) {
		foreach($all_cpt as $index) {
			$slug_CPT[$i] = $index['slug'];
			$i++;
		}
	}

	$wordpress_standard_posts = ['post','page'];
	

	// tableau qui liste les différentes publications
	$screens = array_merge($wordpress_standard_posts,$slug_CPT);
	
	/* pour debug 
	echo'<pre>';
	 print_r($screens );
	echo'</pre>';
	*/
	foreach ( $screens as $screen ) {
		add_meta_box(
			'metabox_remove_blocks_before_after_content',// metabox ID
			__('Content before/after publication','editor-custom-color-palette'),// titre
			'eccp_content_metabox_remove_blocks_before_after_content',// callback function
			$screen, // Type de contenu (page, post, CPT)
			'normal', // Contexte (side, normal, advanced)
			'core' // Priorité (high, core, default, low)
		);
	}
	
}


function eccp_content_metabox_remove_blocks_before_after_content($post) {
	
	// Récupérer la valeur enregistrée dans la méta
	/*
	Cette fonction prend 3 paramètres :
	• L’ID du contenu dont on veut récupérer la métadonnée
	• La meta_key dont on veut la (les) valeur
	• Le type de retour attendu : chaîne ou tableau (true ou false).
	*/
	$remove_blocks_before_content = get_post_meta($post->ID, 'remove_blocks_before_content', true);
	$remove_blocks_after_content = get_post_meta($post->ID, 'remove_blocks_after_content', true);
	
	// Utiliser checked() pour vérifier la case à cocher
	// Compare les deux premiers arguments et s'ils sont identiques
	// alors avec le troisième paramètres a true marque la case comme cochée
	// la classe form-table est native a WordPress
	?>
	
	<table class="form-table eccp-metabox">
		<tbody>
			<tr>
				<th>
					<label for="remove_blocks_before_content">
						<?php esc_html_e('Remove blocks before content','editor-custom-color-palette')?>
					</label>
				</th>
				<td><input type="checkbox" id="remove_blocks_before_content" name="remove_blocks_before_content" value=1 <?php if ( isset ( $remove_blocks_before_content ) ) checked( $remove_blocks_before_content, true,true ); ?> ></td>
			</tr>
			<tr>
				<th>
					<label for="remove_blocks_after_content">
						<?php esc_html_e('Remove blocks after content','editor-custom-color-palette')?>
					</label>
				</th>
				<td><input type="checkbox" id="remove_blocks_after_content" name="remove_blocks_after_content" value=1 <?php if ( isset ( $remove_blocks_after_content ) ) checked( $remove_blocks_after_content, true,true ); ?>  ></td>
			</tr>
		</tbody>
	</table>
	<?php
	
}


add_action('save_post', 'eccp_save_metabox_remove_blocks_before_after_content');

// Enregistrer la valeur de la méta lors de la sauvegarde de la publication
function eccp_save_metabox_remove_blocks_before_after_content($post_id) {
	
	// Vérifier les autorisations
	if (!current_user_can('edit_post', $post_id)) {
		return $post_id;
	}
	
	// Ne sauvegardez pas les données en cas de sauvegarde automatique de WordPress
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
		return $post_id;
	}
	
	// Enregistrer la valeur de la méta
	/*
	La fonction update_post_meta() accepte 4 argument (3 obligatoire et 1 facultatif) :
	• L’ID du contenu auquel on associe cette meta
	• La meta_key correspondant à la valeur que l’on sauvegarde.
	elle commence par un underscore, ainsi elle ne s’affichent pas dans les custom fields
	• Le troisième argument correspond à la valeur que l’on souhaite enregistrer
	  sur laquelle pour sécurité on effectue une sanitization avant de l'enregistrer
	  en base de données.
	*/
	
	if(isset($_POST['remove_blocks_before_content'])){
		update_post_meta($post_id,'remove_blocks_before_content', $_POST['remove_blocks_before_content']);
	}
	
	if(isset($_POST['remove_blocks_after_content'])){
		update_post_meta($post_id,'remove_blocks_after_content', $_POST['remove_blocks_after_content']);
	}
	
	return $post_id;
}


/*----------------------------------------------------------------------------------------
		CSS DYNAMIQUE POUR PERSONNALISER LES ÉCRANS D'ADMINISTRATION DE WORDPRESS
/*---------------------------------------------------------------------------------------*/

function eccp_custom_screen_admin_styling() {
	
// récupération des paramètres du plugin
$custom_back_office_settings = get_option( 'eccp_settings_custom_back_office' );
	

echo '<style id="editor-custom-color-palette" type="text/css">';

	
	/* -------- Écran de publication page & articles & CPT: colonne image en avant --------*/
	
	// Largeur de la colonne image mise en avant
	echo 'body.wp-admin th#featured_image{';
		echo'width:'.$custom_back_office_settings['eccp_settings_width_thumbnail_featured_image_text_field'].'px;';
		echo'height: auto;';
	echo'}';
	
	// taille de l'image mise en avant
	echo 'td.featured_image.column-featured_image img{';
		echo'width:'.$custom_back_office_settings['eccp_settings_width_thumbnail_featured_image_text_field'].'px;';
		echo'height: auto;';
	echo'}';
	
	
	/* ----- Style Modification Rapide Articles & Pages & CPT pour l'édition de l'image mise en avant ---*/
	
	// taille de l'image en avant
	echo'#wpbody-content #featured_image .upload-img img{';
		echo'width:'.$custom_back_office_settings['eccp_settings_width_thumbnail_featured_image_text_field'].'px;';
		echo'height: auto;';
	echo'}';
	
	
	/* ----- Suppression Notification Sur La Page De Réglage Du Plugin ---*/
    if (isset($_GET['page']) && $_GET['page'] == 'eccp_settings_page') {
		echo'.e-notice{display:none};';
	}
	
echo '</style>';

}
add_action('admin_head', 'eccp_custom_screen_admin_styling');


/****************************************************************************************************
                              MODIFIER L'AVATAR PAR DEFAUT
****************************************************************************************************/

//adresse ipv4 local host = 127.0.01 , adresse ipv6 local host = ::1
$is_localhost = ($_SERVER['REMOTE_ADDR'] == "127.0.0.1" or $_SERVER['REMOTE_ADDR'] == "::1");

// si on a activé un avatar personnalisé
if( $custom_gutenberg_blocks_settings['eccp_settings_activate_custom_avatar_radio_field'] == 'yes' ) {


	// si on est en local
	if ($is_localhost){
		
		
		// changement de tous les avatars en utilisant le hook de Wordpress: get_avatar
		// $id_or_email( mixte ) (Obligatoire) Le Gravatar à récupérer. 
		// Accepte un user_id,un e-mail d'utilisateur etc..
		// $size: Hauteur et largeur du fichier image de l'avatar en pixels.Valeur par défaut : 96
		// $default: (facultatif) URL de l'image par défaut
		// $alt: texte alternatif de l'image
		// $args: (facultatif) Arguments supplémentaires pour récupérer l'avatar

		// Remarque: lorsqu'on active la section des commentaires,il est possible d'avoir une erreur
		// car $id_or_email contient en fait un objet et non une chaîne
		// on peut contourner le problème en remplaçant $id_or_email par $id_or_email->comment_author_email
		// ce qui permet de récupérer une chaîne de courrier électronique à partir de l'objet $id_or_email

		add_filter( 'get_avatar', 'eccp_get_default_avatar', 10, 5);

		function eccp_get_default_avatar(  $id_or_email,$avatar = '', $size = 60, $alt = '' ) {
			
		   // on récupère les paramètres pour la personnalisation des blocs Gutenberg
		   $custom_gutenberg_blocks_settings = get_option( 'eccp_settings_custom_gutenberg_block' );
		   $url_avatar   = !empty( $custom_gutenberg_blocks_settings['eccp_settings_custom_avatar_url_text_field'] ) ? esc_url($custom_gutenberg_blocks_settings['eccp_settings_custom_avatar_url_text_field']) : esc_url(EDITOR_CUSTOM_COLOR_PALETTE_URL).'img/custom-gutenberg-block/eccp-mystery-gravatar.jpg';
			
		   // On remplace $avatar par notre propre image carrée de 150 * 150px 
		   // dont on spécifie l'URL en local
		   $avatar = "<img alt='$alt' src='$url_avatar' class='avatar avatar-{$size} photo' height='$size' width='$size' />";
		   
		return $avatar;

		}

	// sinon c'est le serveur en ligne	
	}else{
		
		// ne fonctionne qu'en ligne
		// on télécharge une image carrée de 150 * 150px pour
		// notre gravatar personnalisé
		// on spécifie l'URL en ligne pour la variable $myavatar
		// menu Réglages/commentaire sélectionner Custom Gravatar
		
		add_filter( 'avatar_defaults', 'eccp_new_default_avatar' );
		
		function eccp_new_default_avatar($avatar_defaults) {
			
			// on récupère les paramètres pour la personnalisation des blocs Gutenberg
		    $custom_gutenberg_blocks_settings = get_option( 'eccp_settings_custom_gutenberg_block' );
		    $url_avatar  = !empty( $custom_gutenberg_blocks_settings['eccp_settings_custom_avatar_url_text_field'] ) ? esc_url($custom_gutenberg_blocks_settings['eccp_settings_custom_avatar_url_text_field']) : esc_url(EDITOR_CUSTOM_COLOR_PALETTE_URL).'img/custom-gutenberg-block/eccp-mystery-gravatar.jpg';
			
			$avatar_defaults[$url_avatar] = __( 'Custom Avatar', 'editor-custom-color-palette' );
			return $avatar_defaults;
			
		}
		
	}

} // Fin si on activé un avatar personnalisé
