Home › Forums › ACF PRO › Admin Area: Repeater Pagination › Reply To: Admin Area: Repeater Pagination
My variant page-nav plugin:
Create folder xakplag and file xakplag.php
<?php
/**
* @package Xakplag
*/
/*
Plugin Name: Xakplag
Plugin URI:
Description: Xakplag
Version: 0.1.0
Author:
Author URI: https://xakplant.ru/
License: GPLv2 or later
Text Domain: xakplag
*/
use JasonGrimes\Paginator;
define( 'XAKPAG_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
require_once XAKPAG_PLUGIN_DIR . 'Paginator.php';
$xakpag_count;
function add_repeater_query_var(){
global $wp;
$wp->add_query_var('program-course-abroad-settings');
}
/* Rewrite rules albums pagination */
function add_repeter_rewrite_rule() {
// page=program-course-abroad-settings - change
add_rewrite_rule('^/page/([0-9]+)/?$', '/wp-admin/admin.php?page=program-course-abroad-settings&page=$matches[1]', 'top');
}
add_filter('init', 'add_repeater_query_var');
add_action('init', 'add_repeter_rewrite_rule');
add_action('init', 'xakpag_query_page');
function xakpag_query_page(){
// change
if($_GET['page'] == 'program-course-abroad-settings' && !$_GET['xp']){
function prepare($field){
$field['value'] = array_slice($field['value'], 0, 30);
return $field;
}
// Your field name
add_filter('acf/prepare_field/name=get_program_course_abroad_settings', 'prepare');
} elseif ($_GET['page'] == 'program-course-abroad-settings' && $_GET['xp']){
function prepare($field){
global $xakpag_count;
$xakpag_count = count($field['value']);
$offset = intval($_GET['xp']);
$offset = ($offset - 1) * 30;
$field['value'] = array_slice($field['value'], $offset, 30);
return $field;
}
// Chande field name
add_filter('acf/prepare_field/name=get_program_course_abroad_settings', 'prepare');
}
}
add_action('acf/render_fields', 'xakpag_print_nav', 30);
function xakpag_print_nav($post){
global $xakpag_count;
$totalItems = $xakpag_count;
$itemsPerPage = 30;
$currentPage = getCurrentPage();
// Your url pattern
$urlPattern = 'https://expertno1.com/wp-admin/admin.php?page=program-course-abroad-settings&xp=(:num)';
$paginator = new Paginator($totalItems, $itemsPerPage, $currentPage, $urlPattern);
$screen = get_current_screen();
if($screen->id == 'nastrojki-programm_page_program-course-abroad-settings'){
?>
<div class="xakpag-pagination" style="display: flex">
<?php echo $paginator->toHtml(); ?>
<style>
.active a {
font-weight: 900;
}
</style>
</div>
<?php
}
}
function getCurrentPage(){
if($_GET['xp']){
return intval($_GET['xp']);
} else {
return 1;
}
}
function gerCoutRepeater($repeter){
if( have_rows($repeter) ):
$i = 0;
while( have_rows($repeter) ): the_row();
if( get_sub_field($repeter) ) $i++;
endwhile;
$tCount = $i;
endif;
return $tCount;
}
create file Paginator.php
<?php
namespace JasonGrimes;
class Paginator
{
const NUM_PLACEHOLDER = '(:num)';
protected $totalItems;
protected $numPages;
protected $itemsPerPage;
protected $currentPage;
protected $urlPattern;
protected $maxPagesToShow = 10;
protected $previousText = 'Previous';
protected $nextText = 'Next';
/**
* @param int $totalItems The total number of items.
* @param int $itemsPerPage The number of items per page.
* @param int $currentPage The current page number.
* @param string $urlPattern A URL for each page, with (:num) as a placeholder for the page number. Ex. '/foo/page/(:num)'
*/
public function __construct($totalItems, $itemsPerPage, $currentPage, $urlPattern = '')
{
$this->totalItems = $totalItems;
$this->itemsPerPage = $itemsPerPage;
$this->currentPage = $currentPage;
$this->urlPattern = $urlPattern;
$this->updateNumPages();
}
protected function updateNumPages()
{
$this->numPages = ($this->itemsPerPage == 0 ? 0 : (int) ceil($this->totalItems/$this->itemsPerPage));
}
/**
* @param int $maxPagesToShow
* @throws \InvalidArgumentException if $maxPagesToShow is less than 3.
*/
public function setMaxPagesToShow($maxPagesToShow)
{
if ($maxPagesToShow < 3) {
throw new \InvalidArgumentException('maxPagesToShow cannot be less than 3.');
}
$this->maxPagesToShow = $maxPagesToShow;
}
/**
* @return int
*/
public function getMaxPagesToShow()
{
return $this->maxPagesToShow;
}
/**
* @param int $currentPage
*/
public function setCurrentPage($currentPage)
{
$this->currentPage = $currentPage;
}
/**
* @return int
*/
public function getCurrentPage()
{
return $this->currentPage;
}
/**
* @param int $itemsPerPage
*/
public function setItemsPerPage($itemsPerPage)
{
$this->itemsPerPage = $itemsPerPage;
$this->updateNumPages();
}
/**
* @return int
*/
public function getItemsPerPage()
{
return $this->itemsPerPage;
}
/**
* @param int $totalItems
*/
public function setTotalItems($totalItems)
{
$this->totalItems = $totalItems;
$this->updateNumPages();
}
/**
* @return int
*/
public function getTotalItems()
{
return $this->totalItems;
}
/**
* @return int
*/
public function getNumPages()
{
return $this->numPages;
}
/**
* @param string $urlPattern
*/
public function setUrlPattern($urlPattern)
{
$this->urlPattern = $urlPattern;
}
/**
* @return string
*/
public function getUrlPattern()
{
return $this->urlPattern;
}
/**
* @param int $pageNum
* @return string
*/
public function getPageUrl($pageNum)
{
return str_replace(self::NUM_PLACEHOLDER, $pageNum, $this->urlPattern);
}
public function getNextPage()
{
if ($this->currentPage < $this->numPages) {
return $this->currentPage + 1;
}
return null;
}
public function getPrevPage()
{
if ($this->currentPage > 1) {
return $this->currentPage - 1;
}
return null;
}
public function getNextUrl()
{
if (!$this->getNextPage()) {
return null;
}
return $this->getPageUrl($this->getNextPage());
}
/**
* @return string|null
*/
public function getPrevUrl()
{
if (!$this->getPrevPage()) {
return null;
}
return $this->getPageUrl($this->getPrevPage());
}
/**
* Get an array of paginated page data.
*
* Example:
* array(
* array ('num' => 1, 'url' => '/example/page/1', 'isCurrent' => false),
* array ('num' => '...', 'url' => NULL, 'isCurrent' => false),
* array ('num' => 3, 'url' => '/example/page/3', 'isCurrent' => false),
* array ('num' => 4, 'url' => '/example/page/4', 'isCurrent' => true ),
* array ('num' => 5, 'url' => '/example/page/5', 'isCurrent' => false),
* array ('num' => '...', 'url' => NULL, 'isCurrent' => false),
* array ('num' => 10, 'url' => '/example/page/10', 'isCurrent' => false),
* )
*
* @return array
*/
public function getPages()
{
$pages = array();
if ($this->numPages <= 1) {
return array();
}
if ($this->numPages <= $this->maxPagesToShow) {
for ($i = 1; $i <= $this->numPages; $i++) {
$pages[] = $this->createPage($i, $i == $this->currentPage);
}
} else {
// Determine the sliding range, centered around the current page.
$numAdjacents = (int) floor(($this->maxPagesToShow - 3) / 2);
if ($this->currentPage + $numAdjacents > $this->numPages) {
$slidingStart = $this->numPages - $this->maxPagesToShow + 2;
} else {
$slidingStart = $this->currentPage - $numAdjacents;
}
if ($slidingStart < 2) $slidingStart = 2;
$slidingEnd = $slidingStart + $this->maxPagesToShow - 3;
if ($slidingEnd >= $this->numPages) $slidingEnd = $this->numPages - 1;
// Build the list of pages.
$pages[] = $this->createPage(1, $this->currentPage == 1);
if ($slidingStart > 2) {
$pages[] = $this->createPageEllipsis();
}
for ($i = $slidingStart; $i <= $slidingEnd; $i++) {
$pages[] = $this->createPage($i, $i == $this->currentPage);
}
if ($slidingEnd < $this->numPages - 1) {
$pages[] = $this->createPageEllipsis();
}
$pages[] = $this->createPage($this->numPages, $this->currentPage == $this->numPages);
}
return $pages;
}
/**
* Create a page data structure.
*
* @param int $pageNum
* @param bool $isCurrent
* @return Array
*/
protected function createPage($pageNum, $isCurrent = false)
{
return array(
'num' => $pageNum,
'url' => $this->getPageUrl($pageNum),
'isCurrent' => $isCurrent,
);
}
/**
* @return array
*/
protected function createPageEllipsis()
{
return array(
'num' => '...',
'url' => null,
'isCurrent' => false,
);
}
/**
* Render an HTML pagination control.
*
* @return string
*/
public function toHtml()
{
if ($this->numPages <= 1) {
return '';
}
$html = '<ul class="pagination" style="display: flex">';
if ($this->getPrevUrl()) {
$html .= '<li><a style=" text-decoration: #444;
display: block;
padding: 8px 12px;
color: #fff;
background: #0085ba;
" href="' . htmlspecialchars($this->getPrevUrl()) . '">« '. $this->previousText .'</a></li>';
}
foreach ($this->getPages() as $page) {
if ($page['url']) {
$html .= '<li' . ($page['isCurrent'] ? ' class="active"' : '') . '><a style=" text-decoration: #444;
display: block;
padding: 8px 12px;
color: #fff;
background: #0085ba;
" href="' . htmlspecialchars($page['url']) . '">' . htmlspecialchars($page['num']) . '</a></li>';
} else {
$html .= '<li class="disabled"><span style=" text-decoration: #444;
display: block;
padding: 8px 12px;
color: #fff;
background: #0085ba;
">' . htmlspecialchars($page['num']) . '</span></li>';
}
}
if ($this->getNextUrl()) {
$html .= '<li><a style=" text-decoration: #444;
display: block;
padding: 8px 12px;
color: #fff;
background: #0085ba;
" href="' . htmlspecialchars($this->getNextUrl()) . '">'. $this->nextText .' »</a></li>';
}
$html .= '</ul>';
return $html;
}
public function __toString()
{
return $this->toHtml();
}
public function getCurrentPageFirstItem()
{
$first = ($this->currentPage - 1) * $this->itemsPerPage + 1;
if ($first > $this->totalItems) {
return null;
}
return $first;
}
public function getCurrentPageLastItem()
{
$first = $this->getCurrentPageFirstItem();
if ($first === null) {
return null;
}
$last = $first + $this->itemsPerPage - 1;
if ($last > $this->totalItems) {
return $this->totalItems;
}
return $last;
}
public function setPreviousText($text)
{
$this->previousText = $text;
return $this;
}
public function setNextText($text)
{
$this->nextText = $text;
return $this;
}
}
activate plugin.
come to my site xakplant.ru
Welcome to the Advanced Custom Fields community forum.
Browse through ideas, snippets of code, questions and answers between fellow ACF users
Helping others is a great way to earn karma, gain badges and help ACF development!
We use cookies to offer you a better browsing experience, analyze site traffic and personalize content. Read about how we use cookies and how you can control them in our Privacy Policy. If you continue to use this site, you consent to our use of cookies.