WordPress как на ладони
wordpress jino

Количество элементов на странице для таблиц 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'.

// 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 );

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

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

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

Шаг 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 или сколько было установлено...

Если кому-то этот пост пригодится, напишите ерунду в комментарии, хоть знать буду что не только для себя писал smile

Количество элементов на странице для таблиц WP_List_Table 6 комментариев
  • Сергей cайт: wpshop.biz

    Это прям мастхэв. Буду включать по умолчанию в темы. Спасибо!

    1
    Ответить1.8 года назад #
  • Pavel cайт: pirsoft.ru

    Познавательно! С наступающим Новым Годом! yes

    Ответить1.8 года назад #
  • campusboy1948 cайт: www.youtube.com/c/wpplus

    О WP_List_Table я еще напишу.

    А я всё жду, интересная ж тема!

    хоть знать буду что не только для себя писал

    Тимур, если не ты, то кто? Школоло такое не умеет, а кто умеет, тот ленится поделиться наработками. Уповаем на тебя smile Спасибо за труд!

    Ответить1.3 года назад #
    • Kama4659

      WP_List_Table - ваще крутая тема, на мой взгляд, и там писать много очень, если все возможности рассматривать - это вообще такая львинная доля работы админки WordPress на базе этого класса созданы все таблицы в админке. Мне частично лень, частично время жалко, частично не хочу делиться этими знаниями. Но вот этот коммент +1 к тому что я начну писать. Спасибо smile

      1
      Ответить1.3 года назад #
      • campusboy1948 cайт: www.youtube.com/c/wpplus

        Честно, с WP_List_Table не работал, потому эта тема мне интересна. Не могу сказать, что в ней нуждаюсь, потому что на дворе 2016 год и подобные вещи пишу с использованием AJAX с помощью своих костылей. Вообще добивает, что в WP до сих основные вещи в админке не работают на AJAX. Потому и приходится многое делать самопального, чтобы потом получать удовольствие при использовании админки, да большинство нормальных заказчиков радуются, когда всё работает как приложение на телефоне.

        Сейчас почитал первую попавшуюся статью про WP_List_Table, что именно она умеет и всё такое. Не, ну круто же. Такой материал просто обязан быть на таком сайте, как твой.

        Слушай, сделай как раньше было у автора плагина Wp-Recall на сайте, типа "собираюсь делать плагин такой-то, делает то-то, кому надо скидывайте бабло - реализую как дойдёт сумма до такой-то". Ну а что? Прекрасная идея, чтобы такую статью написать надо много труда и знаний вложить, вместо того, чтобы работать на себя. Я бы скинулся, другие тоже бы, уверен. С миру по нитке - голому рубаха smile

        Ответить1.3 года назад #
        • Kama4659

          Прочитал статью, в целом неплохая кстати, почти все основные моменты раскрыты, но в тоже время многих мелочей нет. И надо сказать - это одна их лучших статей про WP_List_Table что я видел.

          Вон там коммент в тему:

          Где конструктор класса? Где описание его параметров? Это я только начала читать!!!

          Напишу про это, но не знаю когда smile

          1
          Ответить1.3 года назад #

Здравствуйте, !

Ваш комментарий