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 :
- 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). - la variable globale
$typenow
contient le type de post. - important : on vérifie que le type de post a effectivement une page d’archive (ou qu’il s’agit des articles).
- 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 ;) - on utilise jQuery en direct : pas besoin de prendre trop de précautions, jQuery est obligatoirement présent dans l’administration.
- 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.
- dans le lien j’ai ajouté une
<span>
ayant la classe htmlscreen-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!