Dans la série « ça peut servir », je vous propose une petite astuce qui permet automatiquement de renvoyer un visiteur vers une page enfant lorsque la page parent est vide (sans aucun contenu).
Ce cas se présente souvent lorsque l’on crée un menu de navigation principal et que l’on souhaite diviser les contenus en plusieurs sous-pages. Dans ce cas, soit on fait un résumé de toutes les sous-pages dans la page parent, soit on redirige vers la première sous-page.
Bon, je sais qu’il existe une solution bien connue qui consiste à appliquer un modèle de template à la page parent. Mais dans ce cas, il y a quand même une manipulation à faire qui n’est pas toujours bien comprise par un néophyte (« Attends, je dois modifier le template de la page, pour que cela ait un impact sur le menu ???« ).
Ma solution, est bien plus simple, et automatique pour l’utilisateur !
On avant d’envoyer la page au navigateur, on va vérifier qu’il y a bien un contenu à l’intérieur. S’il n’y a pas de contenus, on va faire une requête pour savoir s’il y a une sous-page rattachée. Si cette requête est positive, on fait une redirection vers celle-ci.
Place au code ! (à placer dans le fichier functions.php
du thème)
/**
* Redirect to first child page
* if post content is null (and if child page exists)
*/
function wpmyrtille_redirect_to_child_on_empty() {
global $post;
if(is_page() && $post->post_content != '')
return;
$childs = get_pages("child_of=".$post->ID."&sort_column=menu_order");
if ($childs) {
$firstchild = $childs[0];
wp_redirect(get_permalink($firstchild->ID), 301);
exit;
}
}
add_action('loop_end', 'wpmyrtille_redirect_to_child_on_empty');
Attention ! la redirection doit être effectuée avant que le serveur n’envoie les premières données au client. Dans le cas d’un problème de type « Headers already sent », il faudra effectuer une vérification selon le lien suivant : http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php
Si toutefois, la vérification ne donnais rien, il existe un petit code qui permettra de se défaire du problème (en dernier recours…) :
/**
* Fix redirect
* This can bring other issues with other plugins (use with care)
*/
function wpmyrtille_output_buffer() {
ob_start();
}
add_action('init', 'wpmyrtille_output_buffer');