Количество элементов на странице для таблиц WP_List_Table

WP_List_Table позволяет  создавать таблицы в админке WordPress. Сделано удобно — мне нравится очень, но требует определенных знаний.В этой заметке я покажу как добавить к такой созданной таблице настраиваемую пагинацию. Все пользователи WP видели такую настройку, в верхней вкладке «Настройки экрана» (рядом со вкладкой «Помощь») — поле где можно указать сколько записей выводить на странице.

WP_List_Table

В эту вкладку настроек экрана, можно добавлять и другие опции. О плюсах и удобности таких настроек экрана думаю говорить не надо: все на одной странице, интуитивно понятно и не мешает, потому что скрыто под вкладкой. Но в этой заметке речь пойдет именно про пагинацию — это там выделено в отдельную опцию и добавляется очень просто.

 

Добавление опции во вкладку «Настройки экрана» во время нужного события

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

Подключать эту опцию нужно в определенный момент: после того как экран (страница админ-панели) определился, но до того как начали собираться данные вкладки для вывода. Первое такое событие — current_screen (это после admin_init). Наиболее подходящее событие — load-(page_hook) — момент когда страница определена, но еще ничего не выведено на экран.
Добавляется опция с помощью функции add_screen_option():

регистрируем страницу

все функции типа: add_menu_page(), add_options_page() регистрируют страницу и возвращают её уникальный ключ, который используется в хуке. Мы подключаемся именно к этому хуку.

На этом этапе у нас уже должна появится настройка во вкладке «Настройки экрана».

Cохранение добавленной опции

Поле ввода настройки готово, но толку от него 0 потому что настройку нельзя сохранить. Надо-то, чтобы при нажатии на кнопку «Применить» что-то куда-то сохранилась. Для этого используем специальный фильтр ‘set-screen-option’.

set-screen-option

В параметре $status обычно передается false и поэтому WordPress пропускает сохранение этой настройки. Если указать что-то кроме false, то это «что-то» будет записано в опцию.

Тут мы проверяем название опции и, если это наша опция, вернем значение, а не false, на всякий случай сделав из него число: (int) $value.

Важным моментом является то, что вызывать ‘set-screen-option’ нужно до события ‘admin_menu’. т.е. нельзя вызывать его там же где регистрируем меню, или на самой странице админки, или во время загрузки этой страницы — вызывать нужно раньше! Зачем так сделали я не понял — это не удобно, но это так.

Получение настройки опции

К этому моменту настройка добавлена и даже сохраняется. Теперь, во время создания таблиц с помощью WP_List_Table в методе prepare_items() вам нужна будет эта настройка, когда нужно указать сколько записей показывать на странице.

Настройка сохраняется в метаполе пользователя, с указанным названием, у нас оно: ‘my_page_per_page’. Поэтому, чтобы получить настройку нужно получить метаполе, если его нет, то получить значение по умолчанию, делаем:

WP_List_Table

Подключение без использования события load-(page_hook)

Если событие load-(page_hook) не используется (хотя это и не совсем правильно), то переделывать структуру кода может быть лишней проблемой. В таких случаях можно подключить опцию экрана через событие current_screen, где-то на раннем этапе, например в admin_init или прям в коде плагина:

Следующий код регистрирует опцию per_page и добавляет возможность сохранения. Предполагается что ID экрана для которого регистрируется опция равен screen_id

per_page
Получение опции работает также: на странице где она нужна, используем:

Получение опции

//