Вопрос или проблема
Я использую Plugin Boilerplate для моего проекта. Я искал информацию в интернете и прочитал все вопросы, но не смог найти то, что мне нужно. Я также прочитал WordPress Codex. Мне кажется, я не понял суть.
У меня на странице есть два столбца. Col1 и Col2
Внутри col1: wp_list_table
Внутри col2: пусто
Адрес страницы: admin.php?page=company#home
Когда я нажал кнопку Добавить новый на wp_list_table
, адресная строка показывает admin.php?page=company#home&action=new
Я хочу получить значение действия из URL. Я попробовал следующий код:
function addnew_query_vars($vars) {
$vars[] = 'action';
return $vars;
}
add_filter('query_vars', 'add_query_vars_filter');
echo $value = get_query_var('action'); // Ничего не происходит
Как я могу получить значение действия? Если я смогу получить значение, я покажу форму внутри col2 или использую оператор switch для других ситуаций.
ОБНОВЛЕНИЕ 1.1.0
Используя get_current_screen
require_once(ABSPATH . 'wp-admin/includes/screen.php');
$screen = get_current_screen();
echo $screen->action; // Null
Я использую плагин query monitor. Я посмотрел статус экрана администратора get_current_screen() действие пустое. Так что мне нужно вернуться назад.
В моем коде заголовка WP_List_Table, мой код кнопки Добавить новый выглядит так:
<a href="https://wordpress.stackexchange.com/questions/331997/<?php echo admin_url("admin.php?page=company#home&action=new' );?>">
php _e( 'Добавить новый', 'ironhead' )
</a>
Я думаю, что этот блок кода не отправляет действие. Существует команда set_current_screen(). Но я не знаю, как установить атрибут действия экрана администратора. Если я смогу использовать это, я могу использовать get_current_screen(). Кто-нибудь может помочь?
ВСЕ КОДЫ
ВКЛАДКА ПАНЕЛЬ
<ul class="nav nav-tabs nav-pills tab-pane" id="myTab" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Компания</a>
</li>
<li class="nav-item">
<a class="nav-link" id="facility-tab" data-toggle="tab" href="#facility" role="tab" aria-controls="facility" aria-selected="false">Устройство</a>
</li>
...
</ul>
СОДЕРЖИМОЕ ВКЛАДКИ
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<div class="row">
<div class="col">
<?php
function wp_get_all_company( $args = array() ) {
global $wpdb;
$defaults = array(
'number' => 20,
'offset' => 0,
'orderby' => 'ID',
'order' => 'ASC',
);
$args = wp_parse_args( $args, $defaults );
$cache_key = 'company-all';
$items = wp_cache_get( $cache_key, 'ironhead' );
if ( false === $items ) {
$items = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . 'ih_company ORDER BY ' . $args['orderby'] .' ' . $args['order'] .' LIMIT ' . $args['offset'] . ', ' . $args['number'] );
wp_cache_set( $cache_key, $items, 'ironhead' );
}
return $items;
}
function wp_get_company_count() {
global $wpdb;
return (int) $wpdb->get_var( 'SELECT COUNT(*) FROM ' . $wpdb->prefix . 'ih_company' );
}
function wp_get_firma( $id = 0 ) {
global $wpdb;
return $wpdb->get_row( $wpdb->prepare( 'SELECT * FROM ' . $wpdb->prefix . 'ih_company WHERE ID = %d', $id ) );
} ?>
<h4><?php _e( 'Список компаний', 'ironhead' ); ?> <a href="https://wordpress.stackexchange.com/questions/331997/<?php echo admin_url("admin.php?page=company#home&action=new' ); ?>" class="add-new-h2"><?php _e( 'Добавить новый', 'ironhead' ); ?></a></h4>
<form method="post">
<input type="hidden" name="page" value="ttest_list_table">
<?php
$list_table = new Company_List_Table();
$list_table->prepare_items();
$list_table->search_box( 'search', 'search_id' );
$list_table->display();
?>
</form>
</div>
<div class="col">
// action=new (или action=something) если или оператор switch будет здесь.
</div>
</div>
Заранее спасибо
Работа в админке отличается от работы на фронтенде сайта WordPress. Большинство документации, которую вы найдете в интернете, касается только фронтенда. Это может быть разочаровывающим, когда вы ищете что-то, что должно быть простым и понятным.
В этом случае, я думаю, вам стоит использовать get_current_screen()
. Этот метод возвращает ID экрана, действие, базу и другие особенности административной страницы.
Из документации по get_current_screen()
:
Эта функция возвращает объект, который включает в себя ID экрана, базу,
тип поста и таксономию, среди других данных
Это не работает везде в админке, так что обязательно ознакомьтесь с ограничениями.
Я не знаю, правда это или нет, есть решение с элементом формы и старыми знаниями PHP 🙂
ФОРМА
<form role="form" method="post" action="admin.php?page=company#home">
<h4><?php _e( 'Список фирм', 'ironhead' ); ?>
<input id="action" name="action" hidden="" type="text" value="new">
<button id="new" name="action_new" class="add-new-h2"><?php _e( 'Добавить новый', 'ironhead' ); ?></button></h4>
</form>
POST
echo @$_POST['action'];
Существует ли какой-нибудь верный метод?
@Pecado да, $_POST[‘action’] будет работать. Я создал страницу в административной секции и использовал форму для отправки и получения поля формы на $_POST
Ответ или решение
Чтобы использовать функцию $_GET
в области администрирования WordPress и получать параметры из URL, такие как значение действия, важно правильно настроить ссылки и обработчики. Давайте рассмотрим это на примере вашей ситуации с плагином, используя фильтры и методы WordPress.
Понимание Параметров URL
Когда вы нажимаете на ссылку, такую как admin.php?page=company#home&action=new
, параметр action
передается как часть строки запроса. Однако, чтобы его правильно обработать, нужно учитывать несколько моментов:
-
Неправильное использование
get_query_var()
. Эта функция используется для получения значений, установленных с помощьюadd_query_var
. Так как вы используете фрагмент URL (часть после#
), его нельзя получить непосредственно с помощьюget_query_var()
, поскольку браузеры не отправляют фрагменты с запросами на сервер. -
Частное использование
$_GET
. Фрагменты могут быть получены через PHP с помощью переменной$_GET
. Для доступа к параметрам, которые передаются в строке запроса, воспользуйтесь:$action = isset($_GET['action']) ? sanitize_text_field($_GET['action']) : '';
Изменение Кода
Ваш код, который добавляет кнопку "Добавить новый", выглядит следующим образом:
<a href="<?php echo admin_url("admin.php?page=company#home&action=new"); ?>">
<?php _e('Add New', 'ironhead'); ?>
</a>
Здесь эта ссылка отправляет запрос, но значение action
не передается серверу при обновлении страницы. Вам следует добавить кнопку в форме, чтобы она использовала метод POST и передавала параметры через форму. Пример:
<form method="post" action="<?php echo admin_url('admin.php?page=company#home'); ?>">
<input type="hidden" name="action" value="new">
<button type="submit" class="add-new-h2"><?php _e('Add New', 'ironhead'); ?></button>
</form>
Теперь, когда кнопка будет нажата, значение action
будет отправлено через POST-запрос, и вы сможете получить его следующим образом:
if (isset($_POST['action'])) {
$action = sanitize_text_field($_POST['action']);
// Теперь вы можете использовать переменную $action для дальнейшей обработки
if ($action === 'new') {
// Показываем форму или выполняем другую логику
}
}
Проверка Действий
Если вы хотите проверить различные действия, можно использовать конструкцию switch
:
switch ($action) {
case 'new':
// Логика для добавления нового элемента
break;
// Добавьте другие действия по мере необходимости
default:
// Логика по умолчанию
break;
}
Заключение
Эти шаги помогут вам корректно обрабатывать действия в админ-панели вашего плагина WordPress. Убедитесь, что вы используете функции для очистки входящих данных, чтобы избежать потенциальных уязвимостей в безопасности. Использование метода POST в данной ситуации лучше, чем GET, особенно если вы собираетесь передавать действия или параметры, которые могут влиять на данные.