WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

wp_add_dashboard_widget() WP 2.7

Добавляет виджет (метабокс) в консоль (основная страница админ-панели).

Функция должна вызываться во время события wp_dashboard_setup.

Работает на основе: add_meta_box()

Хуков нет.

Возвращает

Ничего не возвращает, а добавляет метабокс.

Использование

wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback, $callback_args );
$widget_id(строка) (обязательный)
Идентификатор виджета. Будет использован в CSS классе блока виджета. Станет ключом виджета в массиве виджетов.
$widget_name(строка) (обязательный)
Название виджета. Будет видно в верхней части виджета. Пр.: "Последние комментарии".
$callback(строка) (обязательный)
Название PHP функции, которая будет выводить на экран содержание виджета.
$control_callback(строка)
Название функции которая будет обрабатывать запрос редактирования виджета. В этой функции нужно сохранять настройки виджета и выводить форму настроек.
По умолчанию: null
$callback_args(массив) (обязательный)
Аргументы, которые будут переданы в функцию обратного вызова. callback функция получит объект $post и другие параметры переданные через эту переменную.
По умолчанию: null

Примеры

#1 Добавление виджета в консоль

Это демонстративный пример добавления виджета на страницу админ-панели:

// Регистрация виджета консоли
add_action('wp_dashboard_setup', 'add_dashboard_widgets' );

// Выводит контент
function dashboard_widget_function( $post, $callback_args ) {
	echo "Всем привет! Это мой первый виджет!";
}

// Используется в хуке
function add_dashboard_widgets() {
	wp_add_dashboard_widget('dashboard_widget', 'Метабокс в консоли', 'dashboard_widget_function');
}

#2 Запуск Виджета Консоли

Чтобы правильно запустить (вызвать) функцию, используйте событие, а не вызывайте функцию напрямую, как это принято в PHP:

do_action('wp_dashboard_setup');

#3 Расположение виджета с краю

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

wp_add_dashboard_widget() работает на основе add_meta_box(), используем 4-й параметр $post_type укажем dashboard:

add_meta_box('id', 'Dashboard Widget Title', 'dash_widget', 'dashboard', 'side', 'high');

#4 Использование параметра $control_callback

С помощью $control_callback мы можем настраивать виджет. Код ниже регистрирует такой виджет:

widget

И также регистрирует страницу настроек виджета:

widge2t2
add_action( 'wp_dashboard_setup', 'prefix_add_dashboard_widget' );
function prefix_add_dashboard_widget() {
	wp_add_dashboard_widget(
		'my_dashboard_widget', 
		'Основная страница в консоли', 
		'prefix_dashboard_widget', 
		'prefix_dashboard_widget_handle'
	);
}

function prefix_dashboard_widget() {
	# получим сохраненые данные
	if( !$widget_options = get_option( 'my_dashboard_widget_options' ) )
		$widget_options = array( );

	# вывод виджета
	$output = sprintf(
		'<h2 style="text-align:right">%s</h2>',
		__( 'Настройте виджет ☝' )
	);

	# проверим есть ли сохраненные данные
	$saved_feature_post = isset( $widget_options['feature_post'] ) 
		? $widget_options['feature_post'] : false;

	# произвольные контент сохраненный функцией, изменяет вывод
	if( $saved_feature_post ) {
		$post = get_post( $saved_feature_post );
		if( $post ) {
			$content = do_shortcode( html_entity_decode( $post->post_content ) );
			$output = "<h2>{$post->post_title}</h2><p>{$content}</p>";
		}
	}
	echo "<div class='feature_post_class_wrap'>
		<label style='background:#ccc;'>$output</label>
	</div>
	";
}

function prefix_dashboard_widget_handle(){
	# получим сохраненные данные
	if( !$widget_options = get_option( 'my_dashboard_widget_options' ) )
		$widget_options = array( );

	# обновление
	if( 'POST' == $_SERVER['REQUEST_METHOD'] && isset( $_POST['my_dashboard_widget_options'] ) ) {
		# проверка
		$widget_options['feature_post'] = absint( $_POST['my_dashboard_widget_options']['feature_post'] );
		# сохранение данных
		update_option( 'my_dashboard_widget_options', $widget_options );
	}

	# значения по умолчанию
	if( !isset( $widget_options['feature_post'] ) )
		$widget_options['feature_post'] = '';

	echo "<p><strong>Доступные страницы</strong></p>
	<div class='feature_post_class_wrap'>
		<label>Заголовок</label>";
	wp_dropdown_pages( array(
		'post_type'        => 'page',
		'selected'         => $widget_options['feature_post'],
		'name'             => 'my_dashboard_widget_options[feature_post]',
		'id'               => 'feature_post',
		'show_option_none' => '- выберете -'
	) );
	echo "</div>";
}

#5 Пример создания виджета для создания заметок

Пример добавляет виджет, который сохраняет заметки в опцию WP. Работает на AJAX.

Код пригодится, когда нужно просто сохранить текст, введённый в поле textarea. Прямо в дашборде, тут, на месте. Например, написал себе на память что нужно сделать, исправить и т.д., нажал кнопку сохранить, и оно висит себе. Сделал, стёр, написал другое, сохранил - висит другое.

<?php

// Регистрация виджета "Мои заметки"
add_action( 'wp_dashboard_setup', 'my_notes_dashboard_widget' );
function my_notes_dashboard_widget() {
	// Регистрируем виджет только для администраторов сайта
	if ( ! current_user_can( 'activate_plugins' ) ) {
		return;
	}

	wp_add_dashboard_widget( 'my_notes', 'Мои заметки', 'my_notes_form' );
}

// Отображение виджета "Мои заметки"
function my_notes_form() {
	$notes_content = esc_textarea( get_option( 'my_notes_content' ) );
	printf( '<textarea>%s</textarea>', $notes_content );
	submit_button();
}

// Сохранение текста заметки по Ajax
add_action( 'wp_ajax_my_notes', 'my_notes_ajax_save' );
function my_notes_ajax_save() {
	check_ajax_referer( 'my_notes_nonce', 'security' );

	if ( ! isset( $_POST['my_notes_content'] ) || ! current_user_can( 'activate_plugins' ) ) {
		return;
	}

	$notes_content = sanitize_textarea_field( wp_unslash( $_POST['my_notes_content'] ) );

	// Обновляем данные
	$status = update_option( 'my_notes_content', $notes_content );

	if ( $status ) {
		wp_send_json_success( array(
			'message' => 'Заметка сохранена'
		) );
	} else {
		wp_send_json_error( array(
			'message' => 'Заметка не изменилась'
		) );
	}

}

// Индивидуальные стили для виджета "Мои заметки"
add_action( 'admin_print_styles', 'my_notes_styles' );
function my_notes_styles() {
	?>
	<style>
		#my_notes textarea {
			width: 100%;
			min-height: 100px;
		}

		#my_notes p {
			float: none !important;
			padding: 5px 0 0 !important;
		}
	</style>
	<?php
}

// JS скрипт для ajax сохранения из виджета "Мои заметки"
add_action( 'admin_print_scripts', 'my_notes_scripts', 999 );
function my_notes_scripts() {
	$ajax_nonce = wp_create_nonce( "my_notes_nonce" );
	?>
	<script>
		jQuery(document).ready(function ($) {
			var $boxNotes = $('#my_notes');

			$('#submit', $boxNotes).click(function () {
				$boxNotes.animate({opacity: 0.5}, 300);

				$.post(
					ajaxurl,
					{
						action: 'my_notes',
						my_notes_content: $('textarea', $boxNotes).val(),
						security: '<?php echo $ajax_nonce; ?>'
					},
					function (response) {
						$boxNotes.animate({opacity: 1}, 300);
						$('h2 span', $boxNotes).text(response.data.message);
					}
				);
			});
		});
	</script>
	<?php
}

Получим такой виджет:

Код wp add dashboard widget: wp-admin/includes/dashboard.php WP 4.8.1

<?php
function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null, $callback_args = null ) {
	$screen = get_current_screen();
	global $wp_dashboard_control_callbacks;

	$private_callback_args = array( '__widget_basename' => $widget_name );

	if ( is_null( $callback_args ) ) {
		$callback_args = $private_callback_args;
	} else if ( is_array( $callback_args ) ) {
		$callback_args = array_merge( $callback_args, $private_callback_args );
	}

	if ( $control_callback && current_user_can( 'edit_dashboard' ) && is_callable( $control_callback ) ) {
		$wp_dashboard_control_callbacks[$widget_id] = $control_callback;
		if ( isset( $_GET['edit'] ) && $widget_id == $_GET['edit'] ) {
			list($url) = explode( '#', add_query_arg( 'edit', false ), 2 );
			$widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( $url ) . '">' . __( 'Cancel' ) . '</a></span>';
			$callback = '_wp_dashboard_control_callback';
		} else {
			list($url) = explode( '#', add_query_arg( 'edit', $widget_id ), 2 );
			$widget_name .= ' <span class="postbox-title-action"><a href="' . esc_url( "$url#$widget_id" ) . '" class="edit-box open-box">' . __( 'Configure' ) . '</a></span>';
		}
	}

	$side_widgets = array( 'dashboard_quick_press', 'dashboard_primary' );

	$location = 'normal';
	if ( in_array($widget_id, $side_widgets) )
		$location = 'side';

	$priority = 'core';
	if ( 'dashboard_browser_nag' === $widget_id )
		$priority = 'high';

	add_meta_box( $widget_id, $widget_name, $callback, $screen, $location, $priority, $callback_args );
}

Cвязанные функции

Из метки: metabox (метабоксы)

Еще из раздела: Админ-панель

wp_add_dashboard_widget 3 комментария

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

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