Пагинация в бэкэнде плагина

Вопрос или проблема

Я отображаю список постов в бэкенде плагина, но у меня не получается заставить работать пагинацию. Я использовал стандартный подход, получая переменную “paged” и затем передавая её в аргументы get_posts(), но каждый раз, когда я посещаю свою пользовательскую страницу бэкенда или подпункт и добавляю переменную &page=2, я получаю ошибку прав доступа, связанную с тем, что у меня недостаточно прав для посещения этой страницы.

Существует ли специальный способ применения пагинации в бэкенде?

В администраторском бэкенде плагина нельзя использовать хук query_vars и встроенную функцию get_query_var, поскольку сама страница является параметром запроса. Чтобы обойти это, я просто добавляю новый параметр запроса в конец ссылки на страницу плагина с названием ‘&pagenum=#’, и извлекаю его вручную с помощью:

$pagenum = isset( $_GET['pagenum'] ) ? absint( $_GET['pagenum'] ) : 1;

Возможно, есть лучший способ сделать это, но я не нашел ничего, что требовало бы меньше усилий.

Вот как может выглядеть URL плагина:

admin.php?page=[plugin-dir]%2F[plugin-slug].php&pagenum=1

Ответ или решение

Пагинация в бэкенде плагина: Практическое решение

Введение
Пагинация в бэкенде плагина WordPress может стать настоящей головной болью для разработчиков. Важно понимать, что из-за особенностей админ-интерфейса, использование стандартных подходов (таких как get_query_var) не всегда работает. Этот материал подробно рассмотрит, как правильно реализовать пагинацию для вашего плагина, избегая распространённых ошибок и проблем.

Проблема
Как вы заметили, при попытке перейти на другую страницу с использованием параметра &page=2 возникает ошибка прав доступа. Это происходит из-за того, что WordPress использует множество уровней проверки прав доступа, и параметры, как правило, конфликтуют с существующими системными переменными.

Решение
Чтобы обойти эту проблему, рекомендуется использовать собственный параметр для пагинации. Вы можете создать, например, параметр pagenum, который будет передаваться в URL. Это позволяет вам вручную извлекать номер страницы и правильно использовать его в запросах к базе данных.

Вот, как это можно реализовать:

  1. Формирование URL
    Вот пример, как может выглядеть ваш URL для плагина:

    admin.php?page=[plugin-dir]%2F[plugin-slug].php&pagenum=1
  2. Извлечение номера страницы
    Используйте следующий код для извлечения параметра pagenum:

    $pagenum = isset($_GET['pagenum']) ? absint($_GET['pagenum']) : 1;

    Таким образом, если параметр не передан, ваша страница будет загружать первую порцию данных. Функция absint() гарантирует, что число всегда будет положительным.

  3. Передача параметра в get_posts()
    После того как вы получили номер страницы, необходимо правильно передать его в аргументы функции get_posts(). Например:

    $posts_per_page = 10; // количество постов на странице
    $offset = ($pagenum - 1) * $posts_per_page;
    
    $args = array(
       'post_type'      => 'your_post_type',
       'posts_per_page' => $posts_per_page,
       'offset'         => $offset,
    );
    
    $posts = get_posts($args);
  4. Добавление навигации
    Не забудьте добавить навигацию по страницам. Для этого используйте функцию paginate_links() или создайте собственную реализацию навигации, учитывая текущую страницу и общее количество постов.

  5. Проверка прав доступа
    Убедитесь, что у текущего пользователя есть соответствующие права для просмотра запрашиваемого контента, чтобы избежать ошибок доступа.

Заключение
Таким образом, правильная реализация пагинации в бэкенде плагина требует внимательного подхода к извлечению и обработке параметров URL. Использование собственного параметра, как pagenum, значительно упрощает задачу и помогает избежать конфликтов с системными переменными WordPress. Надеемся, эта информация облегчит вам процесс разработки и внедрения функционала пагинации в вашем плагине.

Если у вас возникнут дополнительные вопросы или нужна помощь по другим аспектам, не стесняйтесь обращаться.

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

Капча загружается...