WordPress как на ладони
rgbcode is looking for WordPress developers. eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

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

Забегая вперед, скажу, что эта заметка будет полезна только тем кто уже умеет пользоваться классом WP_List_Table.

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

screen-options-per_page

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

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

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

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

Добавляется опция с помощью функции add_screen_option():

// регистрируем страницу
$hook = add_menu_page( $pg_title, $menu_title, $cap, $slug, $function );

// подключаемся к событию, когда страница загружена, но еще ничего не выводится
add_action( "load-$hook", 'per_page_screen_option' );

// подключаем опцию
function per_page_screen_option() {
	$option = 'per_page'; // это специальное название, WordPress о нем знает и обрабатывает его автоматически
	$args = array(
		'label'   => 'Показывать на странице',
		'default' => 10,
		'option'  => 'my_page_per_page', // название опции, будет записано в метаполе юзера
	);

	add_screen_option( $option, $args );
}

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

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

Шаг 2: сохранение добавленной опции

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

// Cохранение опции экрана per_page. Нужно вызывать до события 'admin_menu'
add_filter( 'set_screen_option_'.'my_page_per_page', function( $status, $option, $value ){
	return (int) $value;
}, 10, 3 );

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

Важным моментом является то, что вызывать 'set_screen_option_'.'my_page_per_page' нужно до события 'admin_menu'. Т.е. НЕЛЬЗЯ вызывать его там же где регистрируем меню, или на самой странице админки, или во время загрузки этой страницы — вызывать нужно раньше! Зачем так сделали я не понял - это неудобно, но это так.

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

Для этого используем специальный фильтр 'set-screen-option'.

// Cохранение опции экрана per_page. Нужно вызывать до события 'admin_menu'
add_filter( 'set-screen-option', function( $status, $option, $value ){
	return ( $option == 'my_page_per_page' ) ? (int) $value : $status;
}, 10, 3 );

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

Шаг 3: получение настройки опции

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

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

// обычно этот код используется внутри WP_List_Table::prepare_items()

// получим параметры настройки
$per_page_option = get_current_screen()->get_option('per_page');

// пробуем получить сохраненную настройку
$per_page = get_user_meta( get_current_user_id(), $per_page_option['option'], true );

// если сохраненной настройки нет, берем по умолчанию
if( ! $per_page )
	$per_page = $per_page_option['default'];

// $per_page будет равно 10 или сколько было установлено...

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

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

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

// подключаем опцию, где угодно. Нужно вызывать до события 'admin_menu'
add_action( 'current_screen', 'per_page_screen_option' );
function per_page_screen_option() {
	// убедимся что мы на нужном экране
	if( get_current_screen()->id != 'screen_id' )
		return;

	$option = 'per_page'; // это специальное название, WordPress о нем знает и обрабатывает его автоматически
	$args = array(
		'label'   => 'Показывать на странице',
		'default' => 10,
		'option'  => 'my_page_per_page', // название опции, будет записано в метаполе юзера
	);

	add_screen_option( $option, $args );
}

// Cохранение опции экрана per_page. Нужно вызывать до события 'admin_menu'
add_filter( 'set-screen-option', function( $status, $option, $value ){
	return ( $option == 'my_page_per_page' ) ? (int) $value : $status;
}, 10, 3 );

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

// получим параметры настройки
$per_page_option = get_current_screen()->get_option('per_page');

// пробуем получить сохраненную настройку
$per_page = get_user_meta( get_current_user_id(), $per_page_option['option'], true );

// если сохраненной настройки нет, берем по умолчанию
if( ! $per_page )
	$per_page = $per_page_option['default'];

// $per_page будет равно 10 или сколько было установлено...
11 комментариев
    Войти