Добавление подпункта в меню верхнего уровня WordPress.

В статье «Создание меню верхнего уровня в панели администрирования WordPress» мы добавляли пункт меню в главное меню панели администрирования WordPress.
В этой статье мы освоим добавление подпункта в уже существующее административное меню. У большинства плагинов только одна страница параметров, поэтому им не требуется отдельного пункта в меню верхнего уровня. Поэтому пункт меню настроек плагина добавляется в качестве подпункта в, например, меню «инструменты». Для этого мы также рассмотрим фрагменты некого плагина, для которого и добавляются подпункт.

Содержание.

  1. Регистрируем подпункт в меню Инструменты посредством существующего API.
  2. Функция вывода страницы меню на примере простого плагина.
  3. Функция обработки запроса – действия.
  4. Заключение – комментарий по безопасности.

1. Добавление подпункта в меню «Инструменты» посредством существующего API.

Для начала, при активации плагина позаботимся, чтобы в таблице wp_option существовала запись с параметрами по умолчанию для нашего плагина:

//регистрация хука активации плагина
register_activation_hook(__FILE__, 'IFC_install');
//это функция будет вызываться всякий раз при активации плагина
function IFC_install()
{
	//некий набор параметров (пример)
	$options = array('start' => '', 'number' => '', 'path' => '');
	//сохраняем или обновляем их
	update_option('ifc_options', $options);
}

Далее вызываем функцию, совершающую необходимые настройки по хуку активации административной панели, в нашем случае подключаем интернационализацию:

//
add_action('admin_init', 'IFC_load_textdomain'); 
//
function IFC_load_textdomain(){ 
load_plugin_textdomain( 'image-file-cleaner', false,   
dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); 
}

‘image-file-cleaner’ – это часть названия файлов интернационализации в папке «language» плагина. Вторая часть файла состоит из обозначения языка. Например, -ru_RU.

Далее, решаем, в какое меню мы будем добавлять подпункт плагина. Для этого есть столько функций, сколько есть предустановленных пунктов в административной панели. Решение зависти от предназначения плагина и общих рецептов не существует.


add_dashboard_page() — добавление подпункта меню в меню консоли.
add_posts_page() — добавление подпункта меню в меню Записи.
add_media_page() — добавление подпункта меню в меню Медиа.
add_links_page() — добавление подпункта меню в меню Ссылки.
add_pages_page() — добавление подпункта меню в меню Страницы.
add_comments_page() — добавление подпункта меню в меню Комментарии.
add_plugins_page() — добавление подпункта меню в меню Плагины.
add_theme_page() — добавление подпункта меню в меню Внешний вид.
add_users_page() — добавление подпункта меню в меню Пользователи.
add_management_page( ) — добавление подпункта меню в меню Инструменты.
add_options_page( ) — добавление подпункта меню в меню Настройки.

Мы будем добавлять наш пункт в меню инструменты (Tools) при срабатывании хука добавления пунктов и подпунктов в административное меню:

add_action('admin_menu', 'IFC_add_management_page');

function IFC_add_management_page(){
	//Добавляем подпункт в меню Инструменты
	add_management_page("Image File Cleaner", "Clean Images", 
          "manage_options", basename(__FILE__), "IFC_management_page");
}

Поясним параметры функции add_management_page($page_title, $menu_title, $capability, $menu_slug, $function, $position):


string $page_title Текст, который будет в заголовке страницы (title tag), когда страница меню будет выбрана.

string $menu_title Текст, используемый для названия пункта меню.

string $capability минимальные права пользователя, позволяющие видеть меню.

string $menu_slug уникальный слаг для меню.

callable $function название функции которая будет вызвана для вывода на страницу меню.

int $position позиция в списке подпунктов, где должен появится пункт меню. По умолчанию – последним.

2. Функция вывода страницы меню на примере простого плагина.

Сначала поясню действия нашей простой плагины. Плагина распечатывает number файлов, находящихся в каталоге, который определен параметром path, начиная с start.
Напишем функцию вывода страницы меню IFC_management_page.

function LIF_management_page(){
	
	//читаем параметры из wp_option из записи LIF_options
	$options = get_option('LIF_options');
	
	//если нажимали кнопку в форме для сохранения параметров то заменяем их на поля из формы
	//проверяем значения в скрытых полях nonce для безопасности
	if ( isset( $_POST['LIF_settings_submit'] ) && check_admin_referer('LIF_submit','LIF_nonce')){
		if(isset($_POST['LIF_start']) && isset($_POST['LIF_number']) && isset($_POST['LIF_path'])){

			//проверяем, что данные были введены  и отличны от начальных значений
			if($_POST['LIF_start'] != 'start' && $_POST['LIF_number'] != 'number' && $_POST['LIF_path'] != 'path') {
					
				$options['start'] = sanitize_text_field($_POST['LIF_start']);
				$options['number'] = sanitize_text_field($_POST['LIF_number']);
				$options['path'] = sanitize_text_field($_POST['LIF_path']);

				update_option('LIF_options', $options);
			}
				
		}
		else//сообщение об ошибке выводим с интернационализацией сообщенй
			echo '<div id="message" class="error fade"><p><strong>'.__('ERROR','image-file-cleaner').' - '.
          __('Please try again.','image-file-cleaner').'</strong></p></div>';
	}

Если была нажат кнопка Сохранить, мы сохраняем данные из полей формы в массив $options, а потом обновляем массив в таблице настроек wp_options или выводим сообщение об ошибке.

//если нажимали кнопку на форме для вывода списка файлов, то выводим результат
	//проверяем значения в скрытых полях nonce для безопасности
	elseif( isset( $_POST['LIF_process_submit'] ) && check_admin_referer('LIF_submit','LIF_nonce') ) {
		//проверяем, что данные были введены  и отличны от начальных значений
		if($options['LIF_start'] != 'start' && $options['LIF_number'] != 'number' && $options['LIF_path'] != 'path') {
			$results = LIF_process($options);
				//про выводе результата применяем интернационализацию сообщений
			?>

		<div id="message" class="updated fade">
			<table>
				<tr>
					<td><p><strong>
							<?php _e($results['message'],'list-of-files'); ?>
							</strong></p>
					</td>
				</tr>
				<tr>
					<td>
							<p>
							
							<?php printf(__("%s files was processed" ,'list-of-files'), isset($results['number']) ? $results['number'] : '0'); ?>
							
							</p>
					</td>
				</tr>
				</table>
			</div>
			<?php $filenames = $results['filenames']; 
			foreach ($filenames as $file)
			{ ?>
				<strong><p> <?php echo $file?> </p></strong>
		<?php } 				
		}
		
	}
	
	$options = get_option('LIF_options');
?>	 

Если была нажата кнопка Process (обработка), то вызываем функцию для обработки LIF_process() и выводим результат.


Дальше – общая часть для всех страниц – форма с текущими данными

<h2>list-of-files</h2>
		<form method="post" action="tools.php?page=<?php echo basename(__FILE__); ?>">
			<?php wp_nonce_field('LIF_submit','LIF_nonce'); ?>
			
			<h3 style="margin-bottom:5px;">
				<?php _e('Step'); ?>
				1:
				<?php _e('Enter information in, if you begin processig and press SAVE button. If you continue skip this step','list-of-files'); ?>
			
			<table class="form-table">
				<tr valign="middle">
					<th scope="row" width="140" style="width:140px"><strong>
						<?php _e('Start','list-of-files'); ?>
						</strong><br/>
						<span class="description">
						<?php _e('Start file number','list-of-files'); ?>
						</span></th>
					<td><input name="LIF_start" type="text" id="LIF_start" 
					value="<?php echo ($options['start'] == '' ? 'start' : $options['start']); ?>" 
					style="width:300px;font-size:20px;" 
					onfocus="if(this.value=='start') this.value='';" 
					onblur="if(this.value=='') this.value='start';" /></td>
				</tr>
				<tr valign="middle">
					<th scope="row" width="140" style="width:140px"><strong>
						<?php _e('Number','list-of-files'); ?>
						</strong><br/>
						<span class="description">
						<?php _e('Number of files','list-of-files'); ?>
						</span></th>
					<td><input name="LIF_number" type="text" id="LIF_number" 
					value="<?php echo ($options['number'] == '' ? 'number' : $options['number']); ?>" 
					style="width:300px;font-size:20px;" onfocus="if(this.value=='number') this.value='';" 
					onblur="if(this.value=='') this.value='number';" /></td>
				</tr>
				<tr valign="middle">
					<th scope="row" width="140" style="width:140px"><strong>
						<?php _e('Path','list-of-files'); ?>
						</strong><br/>
						<span class="description">
						<?php _e('Path to folder with files','list-of-files'); ?>
						</span></th>
					<td><input name="LIF_path" type="text" id="LIF_path" 
					value="<?php echo ($options['path'] == '' ? 'path' : $options['path']); ?>" 
					style="width:300px;font-size:20px;" onfocus="if(this.value=='path') this.value='';" 
					onblur="if(this.value=='') this.value='path';" /></td>
				</tr>
			</table>
			<br/>
			</h3><h3 style="margin-bottom:5px;">
				<?php _e('Step'); ?>
				2:
				<?php _e('Press PROCESS button.','list-of-files'); ?>
			</h3>
			
			<p>
				<input class="button-primary" name="LIF_settings_submit" value="<?php _e('Save settings','list-of-files'); ?>" type="submit" />
				<input class="button-primary" name="LIF_process_submit" value="<?php _e('Process','list-of-files'); ?>" type="submit" />
			</p>
		</form>
		<p> <br/>
			<strong>
			SlaSoft
			</strong> </p>
		<?php
}

В качестве лирического отступления отметим HTML код:

<input name="LIF_path" type="text" id="LIF_path" 
					value="<?php echo ($options['path'] == '' ? 'path' : $options['path']); ?>" 
					onfocus="if(this.value=='path') this.value='';" 
					onblur="if(this.value=='') this.value='path';" />

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

3. Функция обработки запроса – действия.

И наконец, функция обработки, которая последовательно читает имена number файлов в указанном каталоге, начиная со start.

//process function
function LIF_process($options){

	//открываем директорию по указнному пути
	$dir = get_home_path().$options['path']; 
	
	//проверяем, чтобы это была директория
	//массив для зхранения имен файлов
	$filenames = array();
	$results['filenames'] = $filenames;
	
	if(is_dir($dir))
	{
		//сканируем директорию и создаем массив файлов
		$files = scandir($dir);
		//пока ноль файлов обработано
		
		$results['number'] = 0;
		
		
		for($i = intval($options['start']); $i < intval($options['start']) + intval($options['number']); $i++)
		{
			//отстанов если вышли за пределы массива
			if($i >= count($files)) break;
			//берем очередной файл
			$value = $files[$i];
			 
			//если это файл, не директория
			if(is_file($dir.DIRECTORY_SEPARATOR.$value))
			{
				//удобная функция для вычленеия имени файла из пути
				$name = pathinfo($dir.DIRECTORY_SEPARATOR.$value, PATHINFO_BASENAME);
				//также для расширения файла 
				$ext = pathinfo($dir.DIRECTORY_SEPARATOR.$value, PATHINFO_EXTENSION);
				//сохраним в массиве
				$filenames[] = $name;
			}
		}
	}
	//ошибка с выбором директории		
		
	else
		{
		$results['message'] = __('No such directory', 'image-file-cleaner');
	}
	$results['filenames'] = $filenames; 
	$results['number'] = count($filenames);
	//сдвигаемся в опциях на следующее блок файлов в массиве
	$options['start'] = ''.(intval($options['start']) + count($filenames));
	//сохраняемся в опциях
	update_option('LIF_options', $options);
	return $results;
	
}

Тут хотелось бы отметить удобную функцию getpathinfo() для работы с полными именами файлов (путь + имя + расширение).

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

Для сохранения настроек используют API настроек. Такой подход показан в посте «Создание меню верхнего уровня в панели администрирования WordPress». Безопасность обеспечивается тем, что параметры сначала нужно зарегестрировать в API настроек, а API настроек обрабатывает и сохраняет в настройках данные запроса из формы безопасным образом.

3 комментария: Добавление подпункта в меню верхнего уровня WordPress.

  • Предлагаем воспользоваться сервисом компании Азия-Трейдинг по доставке сборных грузов и контейнерных грузов из Китая и стран Азии в Москву. Наша компания предложит Вам конкурентные тарифы на грузоперевозки, окажет услуги таможенного оформления во Владивостокском ЦЭД.

  • Транспортно логистическая компания Азия-Трейдинг сможет осуществить для Вас прямые поставки товаров народного потребления из Китая. Доставку организовываем всеми видами транспорта (авиа, жд, море, авто). Предложим Вам официальную оптимизацию расходов, как при перевозке, так и на границе.
    http://msc.com.ru

  • Услуги декларирования импорта, транспортно-логистическая компания ООО «Азия-Трейдинг», Уссурийск

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Найти на сайте
Со страниц сайта
Метки
хохмаУмные мыслиармейский юморДела семейныеДокторинформацияой болитфольклорВовочка & kidsВадим ЗверевПолитическиеСтатусы ВКотактеСобрание скороговорокБольшие и малые народностиПро животныхЗаконы МерфиженщиныПро это...Забойный наборНиколай ФоменкоВсякая всякотаалкоманы-наркоголикиВиктор ШендеровичПро услуги и рестораныБородатые анекдотыавтомобилистыТуристы и турыИскусство и киноКозьма ПрутковПро студентовПро работуОмар ХайямЧерномырдинСтатусы про женщин и мужчинВ общественном транспортеПро сумасшедшихСтанислав Ежи ЛецКриминальныеПро ШтирлицаСтас ЯнковскийСмешные статусыДурацкие законыПро юристовпро самолетыПечалькаПро братковХорошие советыНе та ориентацияМарк ТвенСтатусы про жизньНа селеКрасноармейскиеГусары и поручикиДразнилкиИностранные анекдотыСказочныеХрюн МоржовФрансуа де ЛарошфукоЧерный юморЖан-Жак РуссоОхота и рыбалкаПрограммистыЛеди и джентельменыСпортМультяшкиНа бога надейся...БизнесСчиталкиУильям ШекспирГеоргий ФрумкерФрансис БэконШутливая лотереяДикий западПраздникиБедные и богатыеРаневскаяПьер Огюстен Карон де БомаршеСоветы и ответыДикариИсторические анекдотыНикколо МакиавеллиНаполеон БонапартЗагадкиsongswordpresstraditionalpluginпоговоркиC#старостьЧастушкиmysqlbackendjavascripthostingsshajaxphpстатистикапандемия
Больше Меньше
Архивы
Рейтинг@Mail.ru