web-dev-qa-db-fra.com

Rediriger après la suppression de post et garder une trace de la pagination

J'ai une liste de messages personnalisée dans le panneau d'administration. Cette liste est paginée, donc c'est son URL:

  • wp-admin/edit.php?post_type=xxx, si j'ouvre la page par défaut
  • wp-admin/edit.php?post_type=xxx&paged=n, si je vais à la nième page de la liste

Chaque fois que je supprime définitivement un élément de cette liste, je souhaiterais être redirigé vers la même page de la liste si cette page existe toujours ou vers la page précédente de la liste si la même page n'est plus pertinente.

Supposons que j'ai trois pages pour un total de 22 éléments, la première page comportant 10 éléments, la deuxième page 10 éléments et la troisième page deux éléments.

  • si je supprime le dernier élément de la page trois, je devrais être redirigé vers la page trois (car il reste encore un élément après la suppression)

  • Si je supprime maintenant le dernier élément de la page trois, je devrais être redirigé vers la page deux (comme maintenant, la page trois n'existe plus)

  • Si je supprime un élément de la page deux, je devrais être redirigé vers la page deux (car la page deux existe toujours)

  • Si je supprime un élément de la page un, je devrais être redirigé vers la page un (car la page un existe encore)

Jusqu'à présent, je suis juste capable de rediriger vers la première page par défaut de la liste comme ceci:

function my_deleted_post_handler() 
{
    global $post;
    $post_type = $post->post_type; 
    wp_redirect("http://www.xxxxxx.com/wp-admin/edit.php?post_type=".$post_type);
    exit;   
}
add_action('deleted_post','my_deleted_post_handler');

Mais je ne sais pas comment obtenir le numéro de page sur lequel je me trouve après la suppression (ou j'étais avant la suppression), je ne peux donc pas rediriger vers la page correspondante par la suite.

J'ai essayé de récupérer $_GET['paged'], mais la fonction ci-dessus est déclenchée après la suppression lorsque la variable "paginée" ne fait plus partie de l'URL et ne renvoie donc aucune valeur.

Comment y parvenir?

3
Baylock

Vous pouvez utiliser $ _SERVER ['HTTP_REFERER'] pour obtenir l'URL d'origine de l'utilisateur.

Le code suivant trouvera la variable paginée GET de l'URL précédente pour déterminer la page sur laquelle l'utilisateur était, puis comptera le nombre de publications restantes de ce type de publication (uniquement publiées) et le nombre de pages nécessaires pour les afficher toutes, puis prenez l'action de redirection appropriée.

function my_deleted_post_handler() 
{
    global $post;

    // URL the user came from
    $referer = $_SERVER['HTTP_REFERER'];

    // the page the user was on
    $page = preg_match('/http:\/\/.*&paged=(\d*)/', $referer, $matches);
    $page_num = $matches[1];

    // how many published posts of $post_type?
    $post_type = $post->post_type; 
    $num_posts = wp_count_posts($post_type)->published;

    // how many pages of 10 items?
    $pages = ceil($num_posts / 10);

    if($pages < $page_num) {
        // the page the user was on doesn't exist anymore
        wp_redirect('http://www.xxxxxx.com/wp-admin/edit.php?post_type=' . $post_type . '&paged=' . $page_num - 1);
    } else {
        // the page still exists
        wp_redirect('http://www.xxxxxx.com/wp-admin/edit.php?post_type=' . $post_type . '&paged=' . $page_num);
    }

    exit();   
}
add_action('deleted_post','my_deleted_post_handler');
1
tobbr