Как использовать функцию $_GET в административной панели WordPress

Вопрос или проблема

Я использую 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 передается как часть строки запроса. Однако, чтобы его правильно обработать, нужно учитывать несколько моментов:

  1. Неправильное использование get_query_var(). Эта функция используется для получения значений, установленных с помощью add_query_var. Так как вы используете фрагмент URL (часть после #), его нельзя получить непосредственно с помощью get_query_var(), поскольку браузеры не отправляют фрагменты с запросами на сервер.

  2. Частное использование $_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, особенно если вы собираетесь передавать действия или параметры, которые могут влиять на данные.

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

Капча загружается...