Funzione per la paginazione in php

Avevo necessità di impaginare alcuni risultati di una query su un dbase mysql, ho pensato di crearmi una funzione cosi da potermela richiamare in varie parti del progetto ed eventualmente usarla anche in altri.

<?php
/* 
Descrizione: Questa funzione serve per inserire a volo una paginazione in un report mysql php
Utilizzo: Richiamando la funzione basta passare la pagina corrente, il numero totali di pagine e il nome del request di impaginazione
Supporto: Utilizza Bootstrap Italia 
Note: non utilizzare su wordpress la variabile con nome page nel request di impaginazione perche già usata da wp e genera un eccezione
Versione: 1.0
Autore: Enzo Paliotti
$page=pagina attuale
$tot_pagine=numero totale delle pagine in base al numero di record presenti nella ricerca e il numero di record da visualizzare per ogni pagina
$var_page=il nome della variabile pagina nel request 
*/
 
function epa_paginazione($page, $tot_pagine,$var_page){

	$link="";
	$pulisci=$_SERVER['REQUEST_URI'];
	$pulisci=$_SERVER['REQUEST_URI'];
	$pulisci=str_replace( '&'.$var_page.'='.$page, '', $pulisci) ;
	$pulisci=str_replace( '?'.$var_page.'='.$page, '', $pulisci) ;
	$link=$_SERVER['HTTP_HOST'].$pulisci;
	
	if ( strpos($link,'?') !=false ){
		$link=$link.'&'.$var_page.'=';
	}else {
		$link=$link.'?'.$var_page.'=';	
	}
	
	$str  =  "";
	
	if ($tot_pagine > 1){
		
		$str .= '<nav class="pagination-wrapper justify-content-center" aria-label="Navigazione centrata">';
		$str .= '  <ul class="pagination">';
		
		if ($tot_pagine>$page-5 && $page-5>0){
			$str .= '    <li class="page-item">';
			$str .= '      <a class="page-link" href="'.$link.($page-5).'" _tabindex="-1" aria-hidden="true">';
			$str .= '        <svg class="icon icon-primary"><use xlink:href="https://italia.github.io/bootstrap-italia/dist/svg/sprite.svg#it-chevron-left"></use></svg>';
			$str .= '        <span class="sr-only">Pagina precedente</span>';
			$str .= '      </a>';
			$str .= '    </li>';
		}
		
		if ($tot_pagine>$page-4 && $page-4>0){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page-4).'">'.($page-4).'</a></li>';		
		}
		
		if ($tot_pagine>$page-3 && $page-3>0){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page-3).'">'.($page-3).'</a></li>';		
		}
		
		if ($tot_pagine>$page-2 && $page-2>0){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page-2).'">'.($page-2).'</a></li>';		
		}
		
		if ($tot_pagine>$page-1 && $page-1>0){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page-1).'">'.($page-1).'</a></li>';			
		}
		
		$str .= '    <li class="page-item">';
		$str .= '      <a class="page-link" href="#" aria-current="page">';
		$str .= '        <span class="d-inline-block d-sm-none">Pagina </span>'.$page.'';
		$str .= '      </a>';
		$str .= '    </li>';
		
		if ($tot_pagine>=$page+1){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page+1).'">'.($page+1).'</a></li>';		
		}
		
		if ($tot_pagine>=$page+2){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page+2).'">'.($page+2).'</a></li>';		
		}
		
		if ($tot_pagine>=$page+3){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page+3).'">'.($page+3).'</a></li>';		
		}
		
		if ($tot_pagine>=$page+4){
			$str .= '    <li class="page-item"><a class="page-link" href="'.$link.($page+4).'">'.($page+4).'</a></li>';		
		}
		
		if ($tot_pagine>=$page+5){
			$str .= '    <li class="page-item">';
			$str .= '      <a class="page-link" href="'.$link.($page+5).'">';
			$str .= '        <span class="sr-only">Pagina successiva</span>';
			$str .= '        <svg class="icon icon-primary"><use xlink:href="https://italia.github.io/bootstrap-italia/dist/svg/sprite.svg#it-chevron-right"></use></svg>';
			$str .= '      </a>';
			$str .= '    </li>';
		}
		
		$str .= '  </ul>';
		$str .= '</nav>';
		
	}
	
	return $str;

}
?>

Dopo averla inserita nel progetto, per richiamarla nel punto dove si desidera applicare la paginazione, basta inserire la seguente stringa:

echo epa_paginazione('nome_variabile_pagina_corrente', 'totale_pagine', 'nome_variabile_paginazione');	

Per la grafica ho utilizzato Bootstrap Italia.

Per avere il totale delle pagine è necessario recuperare i record da visualizzare con un Select count(campo_ID) as row e lanciare la query con:

$pg=1; // il numero della mia pagina
if(isset($_GET['pg'])){ // se presente nella query un altro numero di pagina lo aggiorno
    $pg = filter_var($_GET['pg'],FILTER_SANITIZE_NUMBER_INT);
}
$perpage = 25; // quanti record per pagina voglio vedere
$tot_cli= $wpdb->get_results($conta); // lancio la query per contare i record					  
$tot_rec = $tot_cli[0]->row; // recupero il numero
$tot_pagine=ceil($tot_rec/$perpage); // calcolo il numero totale di pagine della mia paginazione
$primo_rec=($pg-1)*$perpage; // calcolo il primo record da visualizzare nel report 

// Basta poi aggiungere alla fine della query dei dati 
LIMIT $primo_rec, $perpage