Declara las siguientes variables:
$page_actual = 1; // este lo mandas por GET en la URL $_GET['page'] //// DOMINIO.COM/?page=4 // Si no existe (isset) le das 1
$post_per_page = 50; // los articulos q mostraras en cada pagina.
$total_posts = 1267; // Has una consulta a tu BD de todos los articulos
EJEMPLO:
SELECT * FROM articulos
y jalas el numero de resultados (mysqli_num_rows)
$total_pages = 26; // Divide $TOTAL_POSTS / $POST_PER_PAGE y redondea hacia arriba con ceil( $valor )
$url = "http://dominio.com/?page="; // al final colocaras el numero de la pagina (esto es para los recuadros de |1|2|3|4|5|6| etc...
$apartir_de = 0; Esto lo sacas asi ($POST_PER_PAGE*$PAGE_ACTUAL)-$POST_PER_PAGE
EJEMPLO:
muestras 50 por pagina, y estas en la pagina 4 (50*4) = 200 (-50) = 150
Ahora finalmente haces la consulta para extraer solo esos 50 resultados dependiendo de la pagina que estes
"SELECT * FROM articulos ORDER BY id DESC LIMIT $apartir_de, $post_per_page"
y listo, solo recorres los resultados y los muestras.
EJEMPLO (lo que se veria sin las variables) (Esto es solo SIMULACION patra que entiendas mejor):
Si estas en la pagina 1: "SELECT * FROM articulos ORDER BY id DESC LIMIT 0,50"
Si estas en la pagina 2: "SELECT * FROM articulos ORDER BY id DESC LIMIT 50,50"
Si estas en la pagina 5: "SELECT * FROM articulos ORDER BY id DESC LIMIT 200,50"
Si estas en la pagina 10: "SELECT * FROM articulos ORDER BY id DESC LIMIT 450,50"
etc..
y ahora haces tu paginador
for($i=1;$i<=$total_pages;$i++) {
echo "<a href='$url.$i'>pagina $i</a>";
}
Esto imprimira
<a href="dominio.com/?page=1">pagina 1</a>
<a href="dominio.com/?page=2">pagina 2</a>
<a href="dominio.com/?page=3">pagina 3</a>
ETC...
Saludos.