Cette fonction est très utile si vous permettez à vos auteurs, contributeurs ou utilisateurs la possibilité de supprimer un post depuis le front de votre site.
Le front étant la partie du site « publique », donc pas l’interface d’administration.
Le problème est qu’en utilisant la fonction native get_delete_post_link, vous allez bien pouvoir autoriser la suppression du post, mais une fois ce dernier supprimé, l‘utilisateur se retrouvera sur une 404 car le post ne sera bien évidemment plus là…
La solution est donc de hooker la fonction de suppression en lui disant que si on est pas sur l’interface d’administration du site, alors il faut rediriger l’utilisateur vers la page d’accueil.
function my_trashed_post_handler($post_id) { if(!is_admin()){ if ( $_GET['post_type'] == '' && $_GET['trashed'] == 1) { wp_redirect( home_url() ); exit; } } } add_action('init','my_trashed_post_handler',10,1);
Vous pouvez bien évidemment créer une page dédiée pour afficher un message de type « Le contenu a bien été supprimé » plutôt que de rediriger vers la home de votre site.
Attention!
EDIT suite au commentaire de @Julio Potier
La solution proposée ci-dessus n’est pas la bonne pour les raisons évoquées dans le commentaire de Julio. Il y a des risques de conflits avec des plugins notamment.
Voici donc le code qu’il a gentiment rédigé et mis à notre disposition (merci à lui)
add_filter( 'wp_redirect', 'baw_hack_delete_post_redirect' ); function baw_hack_delete_post_redirect( $url ) { $ref = wp_get_referer(); if ( strpos( $ref, admin_url() ) === false && isset( $_GET['action'], $_GET['post'] ) && ( ( 'delete' == $_GET['action'] && check_admin_referer('delete-post_' . $_GET['post'] ) ) || ( 'trash' == $_GET['action'] && check_admin_referer('trash-post_' . $_GET['post'] ) ) ) ) { return home_url(); } return $url; }
Hello Brice
Je ne pense pas que se câbler sur l’init pour lire le $_GET soit une bonne idée.
Pourquoi ? Car qui te dit que nous sommes bel et bien dans l’action de WordPress et pas un autre plugin qui utilise aussi le même paramètre $_GET ?
Aussi, ce code ne fonctionne pas si je supprime l’article car tu ne gère que « trashed » et tu oublies « deleted ». Tout le monde ne gère pas la corbeille 😉
Il n’y a effectivement pas de hook spécial pour rediriger après cette action.
Par contre, nous savons que nous serons redirigés par WordPress, c’est cette redirection que nous devons contrôler.
Voici mon code : gist.github.com/Boite…ece5beddff
– Je hook sur « wp_redirect » car c’est cette URL que je veux contrôler.
– Je vérifie que le referer ne vient pas de l’admin, sinon je ne fais rien.
– Je recontrôle les tokens de WordPress afin de m’assurer que je suis bien dans le cas d’un delete/trash de la part de WordPress (ou d’un plugin qui le simule, ça marche aussi).
– Et enfin je renvoie l’url de la home (ou je pourrais donner le back)
ps : le front c’est home_url(), le back c’est admin_url(). site_url() renvoie le dossier d’installation du site, qui est 95% du temps le même que home_url(), mais ils sont bel et bien différents.
Merci pour tes lumières,
Je n’y avais pas du tout pensé… et je n’aurais pas su faire ^^
Billet édité !