Contenu principal
Le lien vers une page listant des événements est inséré à côté du titre dans l'administration.

Afficher dans l’administration un lien vers l’archive de vos CPTs

Une chose m’a toujours étonné dans WordPress, c’est la non mise en avant de la page d’archive de CPTs. C’est pourtant une page importante selon moi. Voici donc un moyen d’afficher dans l’administration un lien vers ces pages.

Nous allons placer ce lien au niveau du titre des pages de listing dans l’administration (cf l’image à la une de cet article). Le point un peu dommage c’est qu’il n’y a pas de hook ici, il faut insérer le lien avec du JavaScript. Nous allons donc imprimer une balise <script> dans le footer.

0102030405060708091011121314151617

// !On posts/CPTs list, display a link to frontend archive.

add_action( 'admin_footer-edit.php', 'mashb_print_post_type_archive_link_script' );

function mashb_print_post_type_archive_link_script() {
	global $typenow;

	if ( ! $typenow || ! ( get_post_type_object( $typenow )->has_archive || $typenow === 'post' ) ) {
		return;
	}

	$href = $typenow === 'post' ? get_page_for_posts( true ) : get_post_type_archive_link( $typenow );

	echo '<script>jQuery(document).ready( function( $ ) {
	$( ".add-new-h2" ).first().before( "<a class=\"post-type-archive-link dashicons dashicons-external\" href=\"' . esc_url( $href ) . '\" style=\"vertical-align: middle; margin-right: 8px;\"><span class=\"screen-reader-text\">' . __( 'Visit Site' ) . '</span></a>" );
} );</script>' . "\n";
}

Quelques points clés :

  1. le nom du filtre : 'admin_footer-edit.php'. Ici, notre JS n’apparaitra que dans les pages désirées (mon extension Admin Bar Tools peut vous aider à trouver ce genre de hook).
  2. la variable globale $typenow contient le type de post.
  3. important : on vérifie que le type de post a effectivement une page d’archive (ou qu’il s’agit des articles).
  4. il y a une fonction get_page_for_posts() que vous ne connaissez pas. C’est normal, c’est une fonction perso qui fait partie de ma boite à outil. Je vous la donne en suivant ;)
  5. on utilise jQuery en direct : pas besoin de prendre trop de précautions, jQuery est obligatoirement présent dans l’administration.
  6. ici j’ai choisi d’afficher le lien sous forme d’icône, mais on pourrait aussi utiliser un lien textuel en se servant du label du CPT. Au début j’avais choisi d’afficher un lien avec la même forme que le lien « Ajouter », mais du coup ils étaient similaires alors qu’ils font deux choses complètement différentes, ça me gênait un peu.
  7. dans le lien j’ai ajouté une <span> ayant la classe html screen-reader-text : il s’agit d’un texte qui ne sera « visible » que pour les appareils d’aide pour les personnes mal-voyantes. Ce texte permet d’indiquer où mène le lien.
202122232425262728293031323334353637383940414243444546

if ( ! function_exists( 'get_page_for_posts' ) ) :
function get_page_for_posts( $permalink = false ) {
	static $out;

	if ( ! isset( $out ) ) {
		$out            = array( 'ID' => false, 'permalink' => '', );
		$show_on_front  = get_option( 'show_on_front' );

		if ( $show_on_front === 'page' ) {
			$page_for_posts = absint( get_option( 'page_for_posts' ) );
			$page_for_posts = $page_for_posts ? get_post( $page_for_posts ) : false;

			if ( $page_for_posts ) {
				$out        = array(
					'ID'        => $page_for_posts->ID,
					'permalink' => get_permalink( $page_for_posts ),
				);
			}
		}
		else {
			$out['permalink'] = user_trailingslashit( home_url() );
		}
	}

	return $permalink ? $out['permalink'] : $out['ID'];
}
endif;

Cette fonction peut paraitre un peu grobill pour notre cas, mais comme je le disais, elle est dans ma boite à outils et me sert dans plusieurs cas. Libre à vous de simplifier tout ça. En l’état elle retourne l’ID de la page de blog ou false si c’est l’accueil qui liste les articles. En passant $permalink elle retournera l’url directement.

See ya!