Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the acf domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/c/cessel/cessel.bget.ru/public_html/wp-includes/functions.php on line 6121

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the robin-image-optimizer domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/c/cessel/cessel.bget.ru/public_html/wp-includes/functions.php on line 6121

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wp-product-review domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/c/cessel/cessel.bget.ru/public_html/wp-includes/functions.php on line 6121

Notice: Функция _load_textdomain_just_in_time вызвана неправильно. Загрузка перевода для домена colormag была запущена слишком рано. Обычно это индикатор того, что какой-то код в плагине или теме запускается слишком рано. Переводы должны загружаться при выполнении действия init или позже. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 6.7.0.) in /home/c/cessel/cessel.bget.ru/public_html/wp-includes/functions.php on line 6121
Новый вариант функции для постраничной навигации на PHP - Cessel's WEBGate Studio
ИнтересноеРазработка

Новый вариант функции для постраничной навигации на PHP

Функция пагинации (постраничной навигации)

Появилась необходимость создания простой и эффективной функции для пагинации (постраничной навигации)  на PHP для произвольного набора страниц.

Пришлось с нуля прорабатывать этот вопрос, и вот что у нас получилось:

Для начала мы исходили из 2 параметров: максимального количества страниц и текущей страницы: $max_p и $curr_p соответственно. Пагинацию решили сразу не выводить, а возвращать в качестве переменной.

Соответственно для вывода постраничной навигации на Ваших страницах нужно вставить такой код

echo cessel_corenavi($max_p,$curr_p,$link,$format);

Где:

$max_p = максимальное количество страниц;

$curr_p = номер текущей станицы

$link — базовая ссылка, ссылка на страницу категории, без номеров страниц

$format — формат добавления номеров страниц в ссылку (ex. ?page=1) в соответствии с форматом функции sprintf

А теперь по порядку:

Сама функция генерирует пагинацию из следующих блоков:

  • Блок кнопки «Назад»
  • Блок кнопок начала навигации (первые несколько страниц)
  • Блок кнопок слева от текущей страницы
  • Текущая страница
  • Блок кнопок справа от текущей страницы
  • Блок кнопок конца навигации (последние несколько страниц)
  • Блок кнопки «Далее»
  • Блок пробела между начальными страницами и средней частью пагинации
  • Блок пробела между средней частью пагинации конечными страницами
  • Соединение все в одну переменную для вывода.

Блок кнопки «Назад»

$prev_p = $curr_p-1;
$prev_text = '<span aria-hidden="true">&laquo;</span>';
if($curr_p==1)
   {
      $prev_block="<li class='disabled'><a href='#'>".$prev_text."</a></li>";
   }
else
   {
      $prev_block = "<li><a href='".$link.sprintf ($format,$prev_p)."/' title='".$prev_text."'>".$prev_text."</a></li>";
   }

Весьма все просто:

  • $prev_text — то что отображается в самой кнопке «Назад» в данном случае это кавычки имитирующие стрелки влево.
  • $prev_block — переменная для последующего вывода блока
  • $prev_p — номер предыдущей страницы (в случае, когда страница первая, ссылка становиться не активной)

Блок кнопок начала навигации (первые несколько страниц)

$max_s = $curr_p - 2;
if($max_s>2)
   {
      $max_s=2;
   }
if(($max_s > 2) && ($max_s < 1))
   {
      $start_block = '';
   }
else
   {
      for($i=1;$i<=$max_s;$i++)
         {
            $start_block .= "<li><a href='".$link.sprintf ($format,$i)."/' title='Страница ".$i."'>".$i."</a></li>";
         }
   }

Тут несколько сложнее:

Первое мы определились, что начальных кнопок будет 2 (можно подставить любое число).

Далее нужно чтобы было красиво то есть текущая страница выделялась, а соответственно отображение кнопки текущей страницы и блоков слева и справа от нее будет приоритетным. А на практике — если блок кнопок текущей страницы с соседями, находится в начале, или в конце блока пагинации, то он замещает собой блок начала или конца пагинации. Ну а по мере увеличения номера страницы, и смещения блока текущей страницы и соседей, отображается уже блок начала (в конце точно также).

В приведенном выше коде:

$max_s — максимальный номер страница для отображения в начале пагинации

$start_block — переменная для последующего вывода блока

$i — переменная цикла для вывода всех начальных страниц

Блок кнопок слева от текущей страницы

$l_cp = $curr_p-1;
if($l_cp<1)
   {
      $left_cp_block='';
   }
else
   {
      $left_cp_block = "<li><a href='".$link.sprintf ($format,$l_cp)."/' title='Страница ".$l_cp."'>".$l_cp."</a></li>";
   }

Просто вывод на одно страницу назад. Не предусматривает изменения количества центральных страниц, в последующих версиях добавим такую возможность.

Текущая страница

$curr_block = "<li class='active'><a href='".$link.sprintf ($format,$curr_p)."/' title='Страница ".$curr_p."'>".$curr_p."</a></li>";

Блок кнопок справа от текущей страницы

$r_cp = $curr_p+1;
if($r_cp>$max_p)
   {
      $right_cp_block='';
   }
else
   {
      $right_cp_block = "<li><a href='".$link.sprintf ($format,$r_cp)."/' title='Страница ".$r_cp."'>".$r_cp."</a></li>";
   }

Аналогично блоку слева.

Блок кнопок конца навигации (последние несколько страниц)

$min_e = $curr_p + 2;
if($min_e <= ($max_p - 2))
   {
      $min_e = $max_p - 1;
   }
if(($min_e < ($max_p - 1)) && ($min_e > $max_p))
   {
      $end_block = '';
   }
else
   {
      $end_block = '';
      for($i=$min_e;$i<=$max_p;$i++)
         {
            $end_block .= "<li><a href='".$link.sprintf ($format,$i)."/' title='Страница ".$i."'>".$i."</a></li>";
         }
   }

Аналогично блоку начала пагинации

 Блок кнопки «Далее»

$next_text = '<span aria-hidden="true">&raquo;</span>';
if($next_p>=($max_p-1))
   {
      $next_block = "<li class='disabled'><a href=''>".$next_text."</a></li>";
   }
else
   {
      $next_block = "<li><a href='".$link.sprintf ($format,$next_p)."/' title='".$next_text."'>".$next_text."</a></li>";
   }

Аналогично блоку кнопки «Назад»

Блок пробела между начальными страницами и средней частью пагинации

if(($max_s<($l_cp-1)))
   {
      $spaces_l = "<li><a href='#...' title=''>...</a></li>";
   }

Блок пробела между средней частью пагинации конечными страницами

if(($min_e>($r_cp+1)))
   {
      $spaces_r = "<li><a href='#...' title=''>...</a></li>";
   }

Необходимы когда страниц больше 6 — заполняет пробелы между блоками номеров страниц в начале и в конце

Соединение все в одну переменную для вывода.

$pagination = "<div><ul class='pagination'>";
$pagination .= $prev_block;
$pagination .= $start_block;
$pagination .= $spaces_l;
$pagination .= $left_cp_block;
$pagination .= $curr_block;
$pagination .= $right_cp_block;
$pagination .= $spaces_r;
$pagination .= $end_block;
$pagination .= $next_block;
$pagination .= "</ul></div>";

Тут все блоки соединяются воедино. В одной переменной и оборачиваются в тег <div>.

В дальнейшем эту функцию можно доработать под себя, ну и, конечно, оформить с помощью CSS.

Функцию целиком вы можете найти у меня в репозитории.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *


Срок проверки reCAPTCHA истек. Перезагрузите страницу.