1 - Shortcode affiche le résultat d'une requête WP


/******************************************************************************************
 *
 * Shortcode ap_{shortcode_de_la_requete}()
 *
 * Ecrit une liste de Posts ou de CPT
 * 
 * @param	$slug_cpt		post_type ('post' ou par ex. 'ressource')
 * 		$posts_per_page		posts_per_page
 * 		$categorie		all', 'current', ID categorie
 * 
 * @src		https://developer.wordpress.org/reference/classes/wp_query/
 *
 /******************************************************************************************/

	add_shortcode( 'ap_{shortcode_de_la_requete}', 'ap_{shortcode_de_la_requete}' ) ; 
	function ap_{shortcode_de_la_requete} ( $atts )
	{
		/* ATTRIBUTS */

		extract( shortcode_atts( array(			
		 'slug_cpt'       => 'post' , // type de Post Type (post ou CPT)
		 'posts_per_page' => 'all'  , // nb de résultats
		 'categorie'      => 'all'  , // 'all' si toutes les catégories
                                              // 'current' si page d'archive de catégorie
                                              // id de la catégorie

		), $atts ) ) ;
							
		/* REQUÊTE */

		$requete = ap_req_{nom_de_la_requete} ( $slug_cpt, $posts_per_page, $categorie ) ;

		/* ACF (contrôle si ACF est actif) */
`
		if ( !function_exists('get_field') ) return;

		/* HTML */

		$contenu = '' ;
		$i = 0 ;

		$contenu .=  '' ;

		/* Boucle s/résultats */
		
		if ( !empty( $requete ) )
		{			
			if ( count ( $requete ) == 1 ) // si un seul Post dans la Catégorie, on l'affiche
			{
					$ID = $requete[0]->ID ;
					$title = get_the_title( $ID ) ;
					$content = $requete[0]->post_content ; // ATTENTION : get_the_content( $ID ) ne fctn pas
									       // (NSPP - ne sais pas pourquoi)

					$contenu .= '<article>' ;
						$contenu .= '<h2 class="entry-title">' ;
							$contenu .= '<a href="' . get_permalink( $ID ) . '">' . $title . '</a>' ;
						$contenu .= '</h2>' ;
						$contenu .= '<div class="post-content">' ;
							$contenu .= '<p>' . $content . '</p>' ;
						$contenu .= '</div>' ;
					$contenu .= '</article>' ;
			}
			else // sinon on affiche la liste des Posts ou des CPT
			{
				foreach ( $requete as $resultat )
				{
					$ID = $resultat->ID ;
					$title = get_the_title( $ID ) ;

					$contenu .= '<article>' ;
						$contenu .= '<h2 class="entry-title">' ;
							$contenu .= '<a href="' . get_permalink( $ID ) . '">' . $title . '</a>' ;
						$contenu .= '</h2>' ;
						$contenu .= '<div class="post-content">' ;
							$contenu .= '<p>' . get_the_excerpt( $ID ) . '</p>' ;
						$contenu .= '</div>' ;
					$contenu .= '</article>' ;
				}
			}
		}
		else
		{
			$contenu .= '<p>Aucune ressource dans cette catégorie.</p>' ;
		}
		/* Restore original Post Data */
		wp_reset_postdata();
		
		ob_start() ;
		echo do_shortcode( $contenu ) ;
		$html = ob_get_contents() ;
		ob_end_clean() ;

		return $html;		
	}

2 - Fonction requête (associée au shortcode précédent) sur Posts ou CPT

/******************************************************************************************
 *
 * Fonction ap_req_{nom_de_la_requete}()
 *
 * Effectue des requêtes sur les Ressources (CPT)
 * 
 * @param	$slug_cpt		post_type ('post' ou par ex. 'ressource')
 * 		$posts_per_page		posts_per_page
 * 		$categorie		all', 'current', ID categorie
 * 
 * @src		https://developer.wordpress.org/reference/classes/wp_query/
 *
 /******************************************************************************************/

	function ap_req_{nom_de_la_requete} ( $slug_cpt, $posts_per_page, $categorie )
	{
		$args = array ( 'post_type'      => $slug_cpt, 
				'post_status'    => 'publish'	,
				'posts_per_page' => $posts_per_page == 'all' ? -1 : $posts_per_page ,
			      ) ;						

		/* CATÉGORIE */

		if ( $categorie != 'all' ) // Si Catégorie courante ou ID
		{
			if ( $categorie == 'current' ) // Catégorie courante (page d'archive de catégorie)
			{
				// Src. https://wordpress.stackexchange.com/questions/18652/get-category-id-inside-category-template
				$category = get_queried_object() ;
				if ( 'post_type' == 'post') // Posts [NON TESTÉ]
				{
					$args['cat'] = $category->term_id ;
				}
				else // CPT
				{
					$args['tax_query'] = array (
						array (
							'taxonomy' => $category->taxonomy         ,
							'field'    => 'term_id'                   , // ou 'slug'
							'terms'    => $category->term_taxonomy_id ,
						),
					) ;
				}
			}
			else // ID de la Catégorie [NON TESTÉ]
			{
				$cat = $categorie ;	
			}			
		}
		
                /* ORDRE [NON TESTÉ]

		$args['meta_key'] = '{cle_dordre}' ;
		$args['orderby'] = 'meta_value' ;
		$args['order'] = 'DESC' ; */
		
		$query_{nom_de_la_requete} = new WP_Query( $args ) ;
// echo '<pre>' ; print_r( $query_{nom_de_la_requete}->posts ) ; echo '</pre>' ;				
		wp_reset_postdata() ;
		
		return $query_{nom_de_la_requete}->posts ;
	}

4 - Fonction requête simple

	function ap_reqDefinitions ( $lettre )
	{
        $args = array   (	'post_type'         =>  'definition_lexique'	,
				'post_status'	    =>  'publish' 		,
				'posts_per_page'    =>  -1			,
				'orderby' 	    =>  'title'                 ,
				'order' 	    =>  'ASC'	                ,
                        ) ;
		
		$args['starts_with'] = $lettre ;
		
		$query_definitions = new WP_Query( $args ) ;
// echo '<pre>' ; print_r( $query_definitions->posts ) ; echo '</pre>' ;				
		wp_reset_postdata() ;
		
//		return $query_definitions->posts ; Autre méthode (ex. foreach ( $appels_projets as $appel_projets, dans FTL)
		return $query_definitions ;
	}

3 - Shortcode affiche la liste des Catégories

/******************************************************************************************
 *
 * Shortcode ap_arborescence_categories()
 *
 * Ecrit l'aboresence d'une Catégorie
 * 
 * @param	$taxonomy	ex. 'category', 'categorie_ressource'
 * 		$categorie	'all', 'current', ID categorie
 *
 /******************************************************************************************/
//echo '<pre>' ; print_r( $list_categories ) ; echo '</pre>' ;	

	add_shortcode( 'ap_arborescence_categories', 'ap_arborescence_categories' ) ; 
	function ap_arborescence_categories ( $atts )
	{
		/* ATTRIBUTS */
		
		extract( shortcode_atts( array(			
		 'taxonomy'		=> 'category'	, // taxonomie (post ou CPT)
		 'categorie'		=> 'all'	, // 'all' si toutes les catégories
							  // 'current' si page d'archive de catégorie
							  // id de la catégorie
		), $atts ) ) ;
							
		// https://www.sitepoint.com/wordpress-categories-api/
		$args = array(
			'taxonomy' => $taxonomy					,
//			'child_of' => $cat					,
			'hide_empty' => 0					, // affiche même les Catégories sans Posts
			'exclude'	=> 	1				, // Retire les 'Non classés'
			'current_category' => 1					, // pas utile sur une page Archive
			'show_option_none' => 'Aucun sous-chapitre'		, // texte lorsqu'il n'y a pas de Catégorie Enfant
			'show_count' => 1					, // affiche les nombres de Posts
			'pad_counts' => 0					, // ne compte pas les Posts dans les Enfants
			'title_li' => ''					, // supprime le titre de la liste (mais ajouter des ul)
			'echo' => 0						, // pour stocker le résultat au lieu de l'afficher directement	
					) ;
		
		/*  */
		if ( $categorie == 'current' ) // Catégorie courante (page d'archive de catégorie)
		{
			// Src. https://wordpress.stackexchange.com/questions/18652/get-category-id-inside-category-template
			$category = get_queried_object() ;
			$cat = $category->term_id ;
		}
		else
		{
			$cat = $categorie ;
		}
                // FAIRE PLUTÔT : ALL, PUIS CURRENT, PUIS ELSE (ID CATEGORIE)

		$args['child_of'] = $cat ;
		$list_categories = wp_list_categories( $args ) ;

		return '<ul class="liste-categories">' . $list_categories . '</ul>' ;
	}